Указатели на функции, замыкания и лямбда

Как человек, писавший компиляторы lambda для языков как с «настоящими» замыканиями, так generic-lambda и без них, я с уважением generic-lambda не согласен с некоторыми lambda-expressions из приведенных выше ответов. Замыкание closure Lisp, Scheme, ML или Haskell lambda-functions не создает новую функцию динамически. Вместо этого он повторно использует существующую функцию, но делает generic-lambda это с новыми свободными переменными. Набор свободных переменных closure часто называют средой, по крайней computer-science мере, теоретиками языка программирования.

Замыкание generic-lambda - это просто агрегат, содержащий computer-science функцию и среду. В компиляторе lambdaexpression Standard ML of New Jersey lisp мы представляли его как запись; одно c поле содержало указатель lambda на код, а другие поля содержали lambda значения свободных переменных. Компилятор lambda-expressions создал новое закрытие (не функцию) динамически, выделив новую запись, содержащую closure указатель на тот же код, но с разными значениями lambdaexpression для бесплатные переменные.

Вы computer-science можете смоделировать все lambda-expressions это на C, но это заноза в lisp заднице. Популярны две техники:

  1. Передайте closures указатель на функцию (код) и cs отдельный указатель на свободные c переменные, чтобы замыкание closures было разделено на две переменные lisp C.

  2. Передайте указатель на lambda структуру, где структура closure содержит значения свободных c переменных, а также указатель lisp на код.

Метод №1 идеален, когда c вы пытаетесь смоделировать closure какой-то полиморфизм в C и не хотите closures раскрывать тип среды - вы cs используете указатель void lambda-expressions * на представляют окружающую lambda среду. Например, посмотрите lambda C Interfaces and Implementations Дэйва Хэнсона. Техника №2, которая lambda больше напоминает то, что computer-science происходит в компиляторах lisp машинного кода для функциональных closures языков, также напоминает closures другую знакомую технику ... объекты cs C++ с виртуальными функциями-членами. Реализации generic-lambda почти идентичны.

Это наблюдение lambda-expressions привело к острой шутке Генри computer-science Бейкера:

Люди в мире Algol lambdaexpression / Fortran годами жаловались, что closures они не понимают, какое возможное lambda-functions использование закрытий функций lambdaexpression будет иметь в эффективном generic-lambda программировании будущего. Затем lambda произошла революция "объектно-ориентированного computer-science программирования", и generic-lambda теперь все программируют, используя c закрытие функций, за исключением cs того, что они все еще отказываются lisp называть их так.

c

lisp

lambda

computer-science

closures

2022-11-21T19:00:34+00:00