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

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

9 голосов
/ 28 декабря 2011

Кто-нибудь знает, что означают операторы #+ и #- в .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 ]

19 голосов
/ 28 декабря 2011

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

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

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

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

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

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

7 голосов
/ 28 декабря 2011

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

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

 #ifdef __MSVC12__
 #ifndef __cplusplus__

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

...