Почему лямбда-выражение Common-Lisp является допустимым именем функции?

После того, как

$data->save()

$data->id предоставит вам вставленный id,

Примечание: Если ваше имя столбца автоинкремента является sno, тогда вы должны использовать $data->sno, а не $data->id

0
задан Charlim 16 January 2019 в 03:59
поделиться

3 ответа

Можно представить следующий перевод для оценки функции (т. Е. Автомобиль не называет макрос или специальный оператор) выражения:

(foo arg1 arg2 ...)
~~~>
(funcall (function foo) arg1 arg2 ...)

И понимать function как специального оператора, который переводит вещь, которая входит в первый элемент выражения в фактический оператор функции, который можно вызвать. Именно function преобразует (в основном во время компиляции) лямбда-выражение в замыкание, которое может быть вызвано.

В заключение отметим, что #'foo является сокращением от (function foo).

Это не так, как на самом деле работают, на практике или в спецификации, поскольку (function #'(setf foo)) совершенно допустимо и может вычислять функцию, существующую в одном, но ((setf foo) arg1 arg2 ...) не может быть допустимым вызовом функции.

Это, однако, объясняет, почему выражение, подобное (#'f x), недопустимо, и причина в том, что (function (function f)) не является допустимым выражением.

0
ответ дан Dan Robertson 16 January 2019 в 03:59
поделиться

Взято из Practical Common Lisp, Глава 5 :

Один из способов думать о выражениях LAMBDA - это особый вид имени функции, где само имя напрямую описывает то, что функция делает. Это объясняет, почему вы можете использовать выражение LAMBDA вместо имени функции с # '.

(funcall #'(lambda (x y) (+ x y)) 2 3) ==> 5

Вы даже можете использовать выражение LAMBDA в качестве «имени» функции в выражении вызова функции. Если вы хотите, вы можете написать предыдущее выражение FUNCALL более кратким.

((lambda (x y) (+ x y)) 2 3) ==> 5

Но это почти никогда не делается; Стоит только отметить, что это законно, чтобы подчеркнуть, что выражения LAMBDA могут использоваться везде, где может быть нормальное имя функции.

Что касается вашего вопроса:

Является ли LAMBDA особым исключением из правила с жесткой установкой, что первый элемент вычисляемого выражения должен быть именем некоторой операции, или есть какой-то более последовательный набор правил, который я неправильно понимаю?

Технически нет , потому что лямбда-выражения являются юридической функцией Имена .

Редактировать : Лямбда-выражения - это , а не имена функций, но вы можете рассматривать их как имена функций, где «само имя» непосредственно описывает, что делает функция. "

Также см. Почему # используется перед лямбда-выражением в Common Lisp?

Причина, по которой (#'f 12) не работает, заключается в том, что

  • вы сохранили функцию в ячейке значения символа f, а
  • читатель ожидает символ со значением в своей ячейке функции, который #'f не является [ 1110]
0
ответ дан wrycode 16 January 2019 в 03:59
поделиться

Лямбда-выражения и имена функций

Лямбда-выражение не является именем функции . имена функций в Common Lisp определены как символов или (setf symbol) . лямбда-выражение в основном является встроенным синтаксисом для описания анонимной функции.

Обратите внимание, что лямбда-выражения сами по себе не имеют смысла в Common Lisp. Они появляются только в лямбда-форме (см. Ниже) и внутри формы со специальным оператором function.

Списки в виде форм

Является ли LAMBDA особым исключением из жестко установленного правила, согласно которому первый элемент вычисляемого выражения должен быть именем некоторого операция, или есть какой-то более непротиворечивый набор правил, который я неправильно понимаю?

Спецификация Common Lisp определяет, что существует только четыре формы на основе списка . Форма является допустимым куском кода на Лиспе.

  • специальные формы (форма начинается со специального оператора)
  • макроформы (форма начинается с макрооператора)
  • функциональные формы (форма начинается с оператора функции )
  • лямбда-формы (форма начинается с лямбда-выражения)

См. Common Lisp HyperSpec: Conses as Forms .

Обратите внимание, что в Common Lisp нет механизма, расширяющего это. Есть только эти четыре типа форм на основе списка. Можно подумать о расширениях: массивы как функции, объекты CLOS как функции, различные типы функций, такие как fexprs, переменные ... Ни один из них не поддерживается синтаксисом Common Lisp для форм на основе списков, и нет переносимого механизма для их добавления. .

LAMBDA

LAMBDA преследует в Common Lisp две разные цели:

  • это глава лямбда-выражения .
  • в качестве макроса LAMBDA. Это расширяет (lambda ....) в (function (lambda ....))

Макрос LAMBDA был добавлен в Common Lisp после определения первого языка CLtL1 для удобства, чтобы можно было писать (lambda (x) x) вместо (function (lambda (x) x)) или #'(lambda (x) x). Таким образом, это аббревиатура для формы специального оператора функции и делает код более простым и похожим на Схематически .

0
ответ дан Rainer Joswig 16 January 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: