J operator
May. 21st, 2015 11:51 pmJ – это от JUMP, “безусловный переход”, GOTO. Совершенно нехарактерная для современных высокоуровневых языков конструкция, а для функциональных – и вовсе практически табуированная.
Тем не менее, оказывается для безусловного перехода в функциональном мире есть хорошая абстракция, она называется J operator. Интересно, что ни про эту конструкцию, ни про её изобретателя – Питера Лэндина – в русской вики статей нет.
Про J operator у Лэндина есть оригинальная работа 1965 года, клик по картинке – академический PDF.
Абстракция эта – довольно любопытный зверёк. Это конструкт, который превращает блок кода по метке в лямбду сохраняя её собственный scope в месте объявления, плюс перекрывая этот scope локальным к месту вызова. После этого лямбда исполняется, но вместо return-а она делает jump обратно (или куда-то ещё).
И получается, что блок кода по метке как бы исполняется по месту вызова.
Для реализации такого конструкта Лэндин вводит в свою абстрактную машину специальный стек scope-ов переходов, хотя в нынешних реалиях понятно, что можно обойтись и без него (макросы-темплэйты, например, или подобные конструкции).
Любопытно, что приблизительно таких свойств конструкт я выдумывал, когда делал CoverCouch. Та-же песня – совмещение scope’ов, но не в общем, а в конкретном случае (что гораздо проще), исполнение и возврат результата по месту вызова мутированием аккумулятора в scope вызова.
Но мне совершенно не приходило в голову, что по сути я делаю функциональный эквивалент GOTO. А про оператор J я вообще только вчера узнал.
1965 год. Не перестаю удивляться.