2011-02-02 3 views

ответ

56

# 'имя_функции в Common Lisp

Common Lisp и некоторых других Лисп диалекты имеют более одного пространства имен. Здесь те, для функций и значений, различны. Для того, чтобы получить значение функцию от имени, нам нужно написать:

(function functionname) 

Так что это немного долго писать, есть короче обозначения:

#'functionname 

Чтобы показать эффект см это:

(let ((foo 42)) 
    (flet ((foo() 'bar)) 
    (list foo (function foo) #'foo (foo)))) 

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

(function foo) и #'foo - та же концепция, но написана по-разному. Оба относятся к локальной лексической функции с именем FOO. FOO вводится FLET форма как местная функция.

Лисп РЕПЛ возвращает что-то вроде этого:

(42 #<function FOO 4060008224> #<function FOO 4060008224> BAR) 

Выше показано, что первый пункт действительно значения переменной FOO и следующие два элемента является функция значения, функция оценки до FOO. Последний элемент - это символ BAR, который возвращается из функции вызова (FOO).

Это разделение пространств имен для нормальных значений и значений функций присутствует в Common Lisp, Emacs Lisp и ISLisp. Другие диалекты Лиспа, подобные Схеме, не имеют такого разделения. В схеме имя может обозначать только одно значение.

# знак.

Символ # используется для введения специального синтаксиса в s-выражениях. Вот несколько примеров:

#'functionname -> (function functionname) 
#(1 2 3)   -> the vector of the elements 1 2 3 
#c(1 2)   -> a complex number 
#xFFFF   -> a hex number 
#b1111   -> a binary number 

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

ANSI Common Lisp HyperSpec описывает символ # в Section 2.4.8 Sharpsign.

Common Lisp мог бы использовать другой синтаксис для векторов. Скажите [1 2 3]. Он также мог бы использовать другой синтаксис для сложных чисел. Что-то вроде {1 2}. Но это не так. Зачем? Причина в том, что Common Lisp пытается быть экономичным с использованием символов на языке и оставляет персонажам, как [, ], { и } пользователю для его собственных расширений синтаксиса. Часто пользователи Lisp разрабатывают внедренные языки и делают это немного проще, стандарт Common Lisp пытается свести использование символов до минимума, а также обеспечивает механизм макросимволов и символов макроса отправки.

Чтобы сохранить использование символов, используется один символ отправки #, а следующий символ определяет, что можно обозначить. #b для двоичных чисел. #x для шестнадцатеричных чисел. #c для комплексных чисел. #( для векторов. #' для имен функций. Плюс еще много.

Поскольку Common Lisp является программируемым языком программирования, этот синтаксис уровня персонажа может быть изменен пользователем. См. Функцию SET-DISPATCH-MACRO-CHARACTER.

+0

Вы предоставили отличную статью! Я нашел это, когда мне это нужно! – TheGeeko61

Смежные вопросы