Что означает #+: и #-: в общих словах
Сегодня я читаю код 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)