и тд? Я думал, что понимаю как это работает, пока не столкнулся с опровергающим мои теориями поведением. Мне казалось - вот у тебя есть объявленная ф-я, ты через eval или даже просто подгрузкой пакета, (пере)определяешь новые методы и если где-то в это время, например в другом потоке, эта ф-я вызывалась - быть может, что она будет использовать старую версию т.к. другой поток и тд, в целях оптимизации, invokelatest просто сделает доп. проверку и даст актуальное в таком спорном моменте, где было старое и стало новое неожиданно. Но потом я написал код, который делает eval в рамках нового анонимного модуля, где определение всегда будет новым - и оказывается, я не могу его просто оттуда вызывать, надо использовать invokelatest. Потом попробовал выполнять eval в обёртке let $(eval) retrun my_fun end так что ф-я возвращалась просто как объект, вообще нигде не (пере)определяясь - и её тоже я не могу вызывать! Даже внутри тела let я не могу её вызывать без invokelatest🤔
вообще, eval стоит избегать во время работы. Во многих случаях можно сделать макросы и вынести эту часть eval в них. Это позволит разделить компиляцию от прочего исполнения
Прежде чем evaled функция может быть вызвана без invokelatest, выполнение программы должно выйти на верхний уровень модуля. Например: def(...) = eval(f...) def(...) теперь можно вызвать f без invokelatest А если делать eval(f...) и не выходить из def, то внутри def только invokelatest. Но invokelatest не оптимизирует вызванный код ЕМНИП, так что как советуют выше, лучше сначала делать все eval или макросы, а потом уже вызывать новый код
Обсуждают сегодня