Оператор #+ и #- в.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 отсутствует функция / это "неправильная" реализация / любой другой флаг.

Другие вопросы по тегам