kouzdra - January 25th, 2010
[Recent Entries][Archive][Friends][User Info]
06:00 pm
[Link] |
"И назову ее лямбда..." X-Posted: http://kouzdra.livejournal.com/327847.html X-Posted: http://lj.rossia.org/users/kouzdra/813843.html X-Posted: http://community.livejournal.com/ru_declarative/94117.html
Прочитал тут в треде диалог про лямбды:
vitus-wagner: ... Ну в общем, похоже. Если бы в C можно было разместить функцию в динамической памяти - malloc-ом. : То есть это функция, тело которой существует только постольку, поскольку мы где-то храним или куда-то передаем на нее ссылку. (учитываем, что у нас язык с garbage collection, и как только у нас исчезла последняя ссылка на объект, он из памяти удалился)
karpion: А как код оказывается в памяти? Чем заполняется область при malloc()?
vitus-wagner: Ну у нас же на самом деле не C.
Вот соответственно, в теле оператора lambda и написан тот самый код, который нужно скомпилировать во внутреннее представление (байткод) и ссылку на него вернуть. Потом она будет передана куда-то в качестве параметра или чему-то присвоена.
И, натурально, испугался. И решил на конкретном примере компилятора O'Caml в нативный код рассказать, как это все устроено на самом деле - в командах, битиках и байтиках. Возможно, что это все знают и так, но есть большие сомнения. ( Read more... ) Вот и все. Никакого "кода в стеке" естественно не генерируется.
Тема собственно карринга, изменения арности функций и т.п. осталась пока не раскрытой. Хотя при небольшой сообразительности изложенного достаточно, чтобы понять как именно их реализовать в этой модели. Если публике будет интересно - продолжение будет в следующей серии.
Upd: И все-таки я был неправ - тайну "счетчика параметров" я не раскрыл, а она тут существенна: придется дописывать. Ждите.
Так вот - налицо загадка тайны брюквы - вопрос, а зачем нужно в замыкании держать количество аргументов? А ответ довольно простой - как раз для реализации карринга: у нас до сих пор все было замечательно и фактическая арность функций в замыкании совпадала с "формальной" - ради этого и была вставлена строчка print_string "compose called\n";</tt>. Давайте ее уберем: ( Read more... ) Хотя обращу внимание - загадка тайны брюквы пока не так и не раскрыта.
|
|