оператор #+ и #- в .sbclrc

Кто-нибудь знает, что означают операторы #+ и #- в .sbclrc? В мануале не нашел. Я вижу #- в .sbclrc после того, как установил quicklisp:

#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

Я также вижу #+ в Руководстве пользователя SBCL, но я не смог найти объяснение их функциональности. Похоже, что-то связанное с загрузкой отдельного модуля.

Являются ли они только для реализации SBCL или частью Common lisp?


person sudo    schedule 28.12.2011    source источник


Ответы (2)


Это общая возможность Common Lisp, а не только SBCL.

Существует переменная cl:*features*, в которой перечислены символы для «функций», которые в настоящее время должны присутствовать в системе Лиспа. Типичные функции: порядок байтов, реализация, подсистемы, процессор, расширения, диалект Лиспа и многое другое.

В файле Lisp выражение #+quicklisp(foo) означает: читать и выполнять (foo) только в том случае, если функция quicklisp присутствует в списке функций *features*.

В файле Lisp выражение #-quicklisp(foo) означает: читать и выполнять (foo) только в том случае, если функция quicklisp НЕ присутствует в списке функций *features*.

Это средство часто используется, чтобы скрыть или показать код, специфичный для реализации, для какой-либо другой реализации Common Lisp.

См. документацию:

Типичным расширением является feature-case Макрос чтения.

person Rainer Joswig    schedule 28.12.2011

Они являются частью Common Lisp READer. Идея состоит в том, что они «скрывают» текст, если только определенная функция (часто определенная реализация CL) не доступна (#+) или недоступна (#-).

Это, вероятно, концепция CL, наиболее похожая на идею C/C++ о «текстовых макросах» — концептуально и прагматически они очень похожи на что-то вроде

 #ifdef __MSVC12__
 #ifndef __cplusplus__

...и тому подобное. Они буквально скрывают биты входящего кода курса от READer, поэтому они никогда не лексируются, не анализируются, не интерпретируются, не компилируются, не оцениваются, не интернируются. Они просто перестают существовать, если в используемой вами реализации CL отсутствует функция/является «неправильной» реализацией/каким-либо флагом.

person BRPocock    schedule 28.12.2011
comment
Вы знаете, где я могу найти документацию для этого? Мне интересно, есть ли другие функции READer, о которых я не знаю. - person sudo; 28.12.2011
comment
В общем, все, что начинается с #, является чем-то особенным в ридере; проверьте индекс CLHS под #, начиная с lispworks.com/documentation/HyperSpec/ Спереди/X_Mast_9.htm - person BRPocock; 28.12.2011