Что означает # + #. означает в lisp?
Это почти невозможно для Google, поэтому мое понимание ограничено контекстуальными подсказками от чтения через исходный код слизи: возможно, это часть общей системы объектов lisp? Что-то вроде "я"?
фрагмент:
(cond #+#.(swank-backend::sbcl-with-new-stepper-p)
Возможно, это сделает его более googleable: фунт плюс фунт//хеш плюс хэш-символ//октоторп плюс октоторп
Ответы
Ответ 1
Это довольно редко видно.
#+clim clim:+red+ #-clim mygraphics:+red+
выше означает, что читатель возвращает либо красный символ, и зависит от того, есть ли символ с именем CLIM в списке функций *features*
. Это встроенный механизм в Common Lisp.
#.(cl:if (cl:zerop (cl:random 2)) :high :low)
Выше также есть механизм читателя. Это позволяет делать вычисления во время чтения. Который кстати. это проблема безопасности, а в приложениях Lisp она должна быть отключена - см. переменную *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
Ответ 2
На самом деле Sharpsign Plus, за которым следует Sharpsign Dot.
Ответ 3
Они являются общими Lisp символы макроса читателя:
текстовая нотация, введенная отправьте по одному или двум символам, которые определяет специальный синтаксис для использования читателем Lisp, и это реализованный макросом читателя функция.
Макросы Reader не следует путать с регулярными макросами - они не имеют ничего общего друг с другом.
Функция set-dispatch-macro-character может использоваться для расширения синтаксиса Common Lisp с помощью макросов пользовательского считывателя.
Ответ 4
Кроме того, #-foo(code to execute)
будет выполнять код только в том случае, если foo не находится в *features*
.
Информация о #+
, #.
и т.д. трудно найти даже в Common Lisp HyperSpec, но соответствующий HyperSpec страницы можно найти в Google "Sharpsign минус" и т.д. (спасибо Austin.)
Ответ 5
2.4.8.17 Sharpsign Plus
http://www.lispworks.com/documentation/HyperSpec/Body/02_dhq.htm
# + тестовое выражение
Readtime macro, если test является истинным выражением чтения, в противном случае прочитайте его как пробел.
2.4.8.6 Точка резкости
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?
Наверное, потому что это сделано комитетом. Я говорю, что одна из причин Lisp не пользуется популярностью. Кроме того, Lisp слишком академичен, а барьеры для входа слишком высоки (кривая обучения и сообщество поддержки не так велики... там не осталось 10 тысяч небольших программ, чтобы вы могли легко начать (в какая-то тайная реализация, которую вы используете)).