Подтвердить что ты не робот

Что означает # + #. означает в lisp?

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

фрагмент:

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

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

4b9b3361

Ответ 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

Ответ 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 тысяч небольших программ, чтобы вы могли легко начать (в какая-то тайная реализация, которую вы используете)).