Почему mapcar в lisp берет имя, а не функцию?
Я просматриваю книгу lisp и смотрю на , мой вопрос в том, почему это действительно:
> (mapcar #'+ '(1 2) '(3 4))
а вот этого нет:
(mapcar + '(1 2) '(3 4))
другими словами, есть ли причина, по которой в шепелявости было решено, что первый аргумент
mapcar
не может быть самой функцией и должно быть ее именем? какой цели это служит?
2 ответа
есть ли причина, по которой в lisp было решено, что первым аргументом mapcar не может быть сама функция, а должно быть ее имя? какой цели это служит?
Просто в чем-то вроде Common Lisp идентификатор имеет несколько разных назначений. Это переменная, функция и множество других вещей.
запись означает переменную. Он используется циклом печати read eval . Значением является последняя вычисленная форма, значением является предыдущее значение , а значением
+++
это предыдущее значение
++
.
Чтобы сообщить Common Lisp, что вы хотите использовать значение функции идентификатора, нужно написать
(function +)
или короче
#'+
.
Таким образом
(mapcar (function +) '(1 2) '(3 4))
или короче
(mapcar #'+ '(1 2) '(3 4))
на самом деле означает вызов mapcar с функцией + и списками (1 2) и (3 4)
Есть еще два способа использования функции.
(mapcar '+ '(1 2) '(3 4))
Выше будет Лисп получить глобальное значение функции символа
+
.
В-четвертых, мы также можем сделать объект функции частью исходного кода.
#'+
является функцией. Common Lisp — это то, что называется «lisp 2», что означает, что он имеет два пространства имен: во время вычисления составной формы, например
(+ a b)
, позиция функции просматривается в пространстве имен функций, а другие позиции просматриваются в пространстве имен значений. Это означает, что, например
(append list list)
не составляет список, два элемента которого являются функцией: он создает список, два элемента которого являются чем угодно
list
оказывается привязанным к как значение.
Но иногда вам нужно получить значение функции имени в позиции значения: пример находится в первом аргументе . Для этого есть специальный оператор:
(mapcar (function +) x y)
складывает элементы двух списков. Нравиться
quote
,
function
имеет макрос чтения, который
#'
.
(Чтобы было веселее,
mapcar
на самом деле ожидает указатель функции , поэтому вы можете использовать nsme функции:
(mapcar '+ x y)
будет работать, хотя это немного ужасно.)