Почему 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)будет работать, хотя это немного ужасно.)

Другие вопросы по тегам