В чем преимущество символа, который связывается со значением и функцией одновременно? - PullRequest
5 голосов
/ 13 ноября 2010

В lisp символ может быть одновременно связан со значением и функцией.Например,

Символ f связан с функцией

(defun f(x)
    (* 2 x))

Символ f связан со значением

(setq f 10)

Итак, я пишу что-то вроде этого:

(f f)

=> 20

В чем преимущество такой функции?

Ответы [ 2 ]

12 голосов
/ 13 ноября 2010

Символ может иметь как функцию, так и значение. Функция может быть получена с помощью SYMBOL-FUNCTION, а значение - с помощью SYMBOL-VALUE.

Это не полный вид. Common Lisp имеет (как минимум) два пространства имен, одно для функций и одно для переменных. Глобальные символы участвуют в этом. Но для локальных функций символы не задействованы.

Так в чем же преимущества:

  • между именами для функций и переменных нет конфликтов имен.

    Схема: (define (foo lst) (список lst))

    CL: (defun foo (список) (список списка))

  • нет времени выполнения проверяет, действительно ли что-то является функцией

    Схема: (определить (foo) (бар))

    CL: (defun foo () (bar))

    На схеме неясно, что такое BAR. Это может быть число, которое может привести к ошибке времени выполнения при вызове FOO.

    В CL BAR либо функция, либо неопределенная. Это никогда не может быть чем-либо еще. Например, это никогда не может быть число. Невозможно связать имя функции с числом, поэтому этот случай никогда не нужно проверять во время выполнения.

0 голосов
/ 30 ноября 2010

Это полезно для повседневных задач, но главная причина в том, что из-за макросов вы поймете, почему, изучив его.

...