Оператор #+ и #- в.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?
2 ответа
Это общая возможность Common Lisp, а не только SBCL.
Есть переменная cl:*features*
в котором перечислены символы для "функций", которые должны присутствовать в системе Lisp в настоящее время. Типичные особенности: порядок следования, реализация, подсистемы, процессор, расширения, диалект Lisp и многое другое.
В файле Lisp выражение #+quicklisp(foo)
означает: читать и выполнять (foo)
только если функция quicklisp
присутствует в списке возможностей *features*
,
В файле Lisp выражение #-quicklisp(foo)
означает: читать и выполнять (foo)
только если функция quicklisp
НЕ присутствует в списке функций *features*
,
Эта возможность часто используется, чтобы скрыть или показать специфичный для реализации код какой-либо другой реализации Common Lisp.
Смотрите документацию:
Они часть Common Lisp READ
э. Идея состоит в том, что они "скрывают" текст, если только определенная особенность (часто определенная реализация CL) не является (#+
) или нет (#-
) имеется в наличии.
Вероятно, это концепция CL, наиболее похожая на идею C/C++ о "текстовых макросах" - концептуально и прагматически они очень похожи на что-то вроде
#ifdef __MSVC12__
#ifndef __cplusplus__
...и тому подобное. Они буквально скрывают биты входящего кода курса от READ
э-э, поэтому они никогда не лексируются - анализируются - интерпретируются - компилируются - оцениваются - интернированы - нада. Они просто перестают существовать, если в используемой реализации CL отсутствует функция / это "неправильная" реализация / любой другой флаг.