После того, как
$data->save()
$data->id
предоставит вам вставленный id,
Примечание: Если ваше имя столбца автоинкремента является sno, тогда вы должны использовать $data->sno
, а не $data->id
Можно представить следующий перевод для оценки функции (т. Е. Автомобиль не называет макрос или специальный оператор) выражения:
(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))
не является допустимым выражением.
Взято из 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 могут использоваться везде, где может быть нормальное имя функции.
blockquote>Что касается вашего вопроса:
Является ли LAMBDA особым исключением из правила с жесткой установкой, что первый элемент вычисляемого выражения должен быть именем некоторой операции, или есть какой-то более последовательный набор правил, который я неправильно понимаю?
blockquote>
Технически нет , потому что лямбда-выражения являются юридической функцией Имена . strike>Редактировать : Лямбда-выражения - это , а не имена функций, но вы можете рассматривать их как имена функций, где «само имя» непосредственно описывает, что делает функция. "
Также см. Почему # используется перед лямбда-выражением в Common Lisp?
Причина, по которой
(#'f 12)
не работает, заключается в том, что
- вы сохранили функцию в ячейке значения символа f, а
- читатель ожидает символ со значением в своей ячейке функции, который
#'f
не является [ 1110]
Лямбда-выражения и имена функций
Лямбда-выражение не является именем функции . имена функций в Common Lisp определены как символов или (setf symbol) . лямбда-выражение в основном является встроенным синтаксисом для описания анонимной функции.
Обратите внимание, что лямбда-выражения сами по себе не имеют смысла в Common Lisp. Они появляются только в лямбда-форме (см. Ниже) и внутри формы со специальным оператором function
.
Списки в виде форм
Является ли LAMBDA особым исключением из жестко установленного правила, согласно которому первый элемент вычисляемого выражения должен быть именем некоторого операция, или есть какой-то более непротиворечивый набор правил, который я неправильно понимаю?
blockquote>Спецификация 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)
. Таким образом, это аббревиатура для формы специального оператора функции и делает код более простым и похожим на Схематически .