Я не буду вдаваться в создание структур данных здесь с Joshua has done that already, но говорить о функциях вообще.
Никаких функций не требуется. Некоторые имена указывают на функции объектов (процедуры, закрытия).
У вас есть (lambda (x) x)
. В переводчике lambda
- специальная форма, и она превращает форму в procedure
(закрытие). Представление после оценки может быть (procedure (x) <env> x)
, где env
- текущая среда. Оценка ((lambda (x) x) y)
будет оценивать оператор, который оценивается до (procedure (x) <env> x)
, и оценщик идентифицирует это как процедуру, поэтому он будет оценивать аргумент перед применением x
в среде замыканий с привязками переменных.
Как функционируют функции с именами? С названным, например. (define identity (lambda (x) x)
Этот же механизм используется для создания процедуры, но специальная форма define создает привязку к результату, так что identity
привязан к (procedure (x) <env> x)
в среде. Когда вы сделаете (identity q)
, он сначала оценит identity
как часть случая по умолчанию, в котором у вас есть приложение, так что интерпретатор получает (procedure (x) <env> x)
и когда он анализирует, что он знает, чтобы оценить аргумент перед приложением.
И это только что истолкованный код.В скомпилированном случае различия были бы намного меньше, и это было бы возможно, что он превратился бы в тот же самый скомпилированный код, поскольку имя предназначено только для программистов для абстрактной сложности в легко разрешимые части.
Я думаю, вам нужно предоставить более подробную информацию. Вам просто нужно быть в состоянии представлять эти вещи? Или вы пытаетесь их разобрать? Или что? Создание тегированного типа данных не так сложно ... –
Я угадываю их. Но лямбда - это функции без имен. вот что меня смущает. – Josh
Функциональные приложения также не имеют имен. Вам просто нужен объект, который _represents_ выражение '(lambda ())'. Вам просто нужно убедиться, что объект представляет такое выражение и сможет извлечь из него '' и' 'от него. –