Что означает #+: и #-: в общих словах

Сегодня я читаю код cl-fad/load.lisp и обнаружил символы #+: а также #-: в начале выражения или строки.

Что означают эти символы?

2 ответа

Решение

Это средство условного считывания: #+ а также #- позвольте вам решить, какое выражение для read на основе функциональных выражений.

Например,

#+:allegro (require :osi)
#+:sbcl (require :sb-executable)

означает, что при работе под allegro модуль :osi будет загружен, но при работе под sbcl модуль :sb-executable будет загружен require,

Под все другие реализации require не будет вызван вообще, потому что read будет пропускать формы.

Вы можете проверить не только имя реализации, но и конкретную функцию, например,

#+(<= (integer-length most-positive-fixnum) 32)
code for a 32-bit lisp
#+(> (integer-length most-positive-fixnum) 32)
code for a 64-bit lisp

В дополнение к выбору кода, основанного на реализации, это позволяет легко "закомментировать" часть вашего кода (т. Е. Следующий sexp):

#+(or) (this code will be skipped over by any lisp reader 
        because (or) returns nil)

Это макросы чтения, основанные на функциях списка, эти макросы указывают на выполнение формы или нет, если символ присутствует в списке функций.

Отображение списка функций:

CL-USER> *features*
(:SWANK :QUICKLISP :QUICKLISP-SUPPORT-HTTPS :ROS.INIT :ASDF-PACKAGE-SYSTEM :ASDF3.1 :ASDF3 :ASDF2 :ASDF :OS-MACOSX :OS-UNIX :ASDF-UNICODE :PRIMARY-CLASSES :COMMON-LISP :OPENMCL :CCL :CCL-1.2 :CCL-1.3 :CCL-1.4 :CCL-1.5 :CCL-1.6 :CCL-1.7 :CCL-1.8 :CCL-1.9 :CCL-1.10 :CCL-1.11 :CLOZURE :CLOZURE-COMMON-LISP :ANSI-CL :UNIX :OPENMCL-UNICODE-STRINGS :IPV6 :OPENMCL-NATIVE-THREADS :OPENMCL-PARTIAL-MOP :MCL-COMMON-MOP-SUBSET :OPENMCL-MOP-2 :OPENMCL-PRIVATE-HASH-TABLES :STATIC-CONSES-SHOULD-WORK-WITH-EGC-IN-CCL :X86-64 :X86_64 :X86-TARGET :X86-HOST :X8664-TARGET :X8664-HOST :DARWIN-HOST :DARWIN-TARGET :DARWINX86-TARGET :DARWINX8664-TARGET :DARWINX8664-HOST :64-BIT-TARGET :64-BIT-HOST :DARWIN :LITTLE-ENDIAN-TARGET :LITTLE-ENDIAN-HOST)

В моем случае я бегу:

CL-USER> (lisp-implementation-type)
"Clozure Common Lisp"

CL-USER> (lisp-implementation-version)
"Version 1.11-r16635  (DarwinX8664)"

Давайте выполним форму, если я использую CCL

CL-USER> #+CCL (1+ 1)
2

Это работает, потому что у меня есть CCL в списке функций

CL-USER> #-CCL (1+ 1)
; No value

Это работает, потому что у меня есть CCL в списке функций

Или вы можете думать противоположное, только выполнить, если у меня нет в списке возможностей

CL-USER> #-calimero (1+ 1)
2

Вы можете добавить любой символ: слово в список функций, а также добавить логику.

давайте выполним, если я нахожусь на CCL и использую хост darwin (то есть MAC OS X)

CL-USER> #+(and ccl darwin-host) (1+ 1)
Другие вопросы по тегам