Что значит # + #.значит в лисп? - PullRequest
20 голосов
/ 26 апреля 2011

Гуглить практически невозможно, поэтому мое понимание ограничено контекстными подсказками от чтения исходного кода слизи: возможно, это часть объектной системы в общем lisp? Что-то вроде «я»?

фрагмент:

(cond #+#.(swank-backend::sbcl-with-new-stepper-p)

Возможно, это сделает его более привлекательным для Google: фунт плюс фунт // хэш плюс символ хеша // октофорп плюс октофорп

Ответы [ 5 ]

20 голосов
/ 26 апреля 2011

Это довольно редко можно увидеть.

#+clim clim:+red+ #-clim mygraphics:+red+

выше означает, что считыватель возвращает либо красный символ, и это зависит от того, есть ли символ с именем CLIM в списке функций *features*. Это встроенный механизм в Common Lisp.

#.(cl:if (cl:zerop (cl:random 2)) :high :low)

Выше также представлен механизм считывателя. Это позволяет делать вычисления во время чтения. Который между прочим это проблема безопасности, и в приложениях на Лиспе она должна быть отключена - см. переменную *read-eval* для управления этим. Во время чтения читатель, использующий READ, вернет либо: HIGH, либо: LOW, случайно.

Комбинация #+#.(FOO) BAR означает, что функция foo возвращает символ во время чтения, и этот символ затем проверяется читателем, если есть символ с этим именем в списке функций *features* и если это так, затем читается следующий элемент ввода, в противном случае следующий элемент пропускается.

Тривиальный пример, IF всегда возвращает: CAPI в этом примере:

В LispWorks (где CAPI находится в списке функций):

CL-USER 41 > (read-from-string "#+#.(cl:if cl:t :capi :clim) a b")
A
31

В SBCL

* (read-from-string "#+#.(cl:if cl:t :capi :clim) a b")

B
32
15 голосов
/ 26 апреля 2011

Это на самом деле Sharpsign Plus , за которым следует Sharpsign Dot .

4 голосов
/ 26 апреля 2011

Это Common Lisp макро-символы читателя :

текстовая запись, введенная отправить на один или два символа, которые определяет специальный синтаксис для использования читателем Lisp, и это реализуется макросом читателя функция.

Макросы считывателя не следует путать с обычными макросами - они не имеют ничего общего друг с другом.

Функция set-dispatch-macro-символ может использоваться для расширения синтаксиса Common Lisp с помощью пользовательских макросов для чтения.

0 голосов
/ 25 апреля 2013

2.4.8.17 Sharpsign Plus http://www.lispworks.com/documentation/HyperSpec/Body/02_dhq.htm # + тестовое выражение Макрос времени чтения, если тест является истинным выражением чтения, в противном случае считайте его как пробел.

2.4.8.6 Точка Sharpsign http://www.lispworks.com/documentation/HyperSpec/Body/02_dhf.htm.Синтаксис foo выполняет оценку foo во время чтения.

http://www.lispworks.com/documentation/HyperSpec/Body/02_dh.htm Все операторы #X (определенные в Lisp HyperSpec)

Почему Lisp HyperSpec должен быть настолько сложным для чтения?Возможно, потому что это сделано комитетом.Я говорю, что это одна из причин, почему Лисп не популярен.Кроме того, Лисп слишком академичен, и входные барьеры слишком высоки (кривая обучения и сообщество поддержки не так уж велики ... не существует 10 тысяч маленьких программ, которые могли бы легко начать работу (в некоторых тайнах)реализация, которую вы используете)).

0 голосов
/ 01 января 2013

Кроме того, #-foo(code to execute) выполнит код только в том случае, если foo равно , а не в *features*.

Информация о #+, #. и т. Д. Трудно найти.даже в Common Lisp HyperSpec , но соответствующие страницы HyperSpec можно найти с помощью Google "Sharpsign минус" и т. д. (Спасибо Остин.)

...