#+
是一个读取器宏,用于检查关键字是否在特殊变量*FEATURES*
中。如果它不存在,下面的表格将被跳过(读者;编译器永远不会看到它)。也有#-
相反的做法。
有些东西不是 Common Lisp 标准的一部分,但足够重要,以至于所有(或大多数)实现都为它们提供了非标准扩展。当您想在需要处理多个实现的代码中使用它们时,您必须使用读取时条件来为当前实现提供正确的代码。互斥锁(和一般的线程)就是其中之一。
当然也可能有第三方库提供的功能。的内容*FEATURES*
将如下所示:
(:SWANK :QUICKLISP :SB-BSD-SOCKETS-ADDRINFO :ASDF-PACKAGE-SYSTEM :ASDF3.1
:ASDF3 :ASDF2 :ASDF :OS-UNIX :NON-BASE-CHARS-EXIST-P :ASDF-UNICODE :64-BIT
:64-BIT-REGISTERS :ALIEN-CALLBACKS :ANSI-CL :ASH-RIGHT-VOPS
:C-STACK-IS-CONTROL-STACK :COMMON-LISP :COMPARE-AND-SWAP-VOPS
:COMPLEX-FLOAT-VOPS :CYCLE-COUNTER :ELF :FLOAT-EQL-VOPS
:FP-AND-PC-STANDARD-SAVE :GENCGC :IEEE-FLOATING-POINT :INLINE-CONSTANTS
:INTEGER-EQL-VOP :INTERLEAVED-RAW-SLOTS :LARGEFILE :LINKAGE-TABLE :LINUX
:LITTLE-ENDIAN :MEMORY-BARRIER-VOPS :MULTIPLY-HIGH-VOPS :OS-PROVIDES-DLADDR
:OS-PROVIDES-DLOPEN :OS-PROVIDES-GETPROTOBY-R :OS-PROVIDES-POLL
:OS-PROVIDES-PUTWC :OS-PROVIDES-SUSECONDS-T :PACKAGE-LOCAL-NICKNAMES
:PRECISE-ARG-COUNT-ERROR :RAW-INSTANCE-INIT-VOPS :SB-DOC :SB-EVAL :SB-FUTEX
:SB-LDB :SB-PACKAGE-LOCKS :SB-SIMD-PACK :SB-SOURCE-LOCATIONS :SB-TEST
:SB-THREAD :SB-UNICODE :SBCL :STACK-ALLOCATABLE-CLOSURES
:STACK-ALLOCATABLE-FIXED-OBJECTS :STACK-ALLOCATABLE-LISTS
:STACK-ALLOCATABLE-VECTORS :STACK-GROWS-DOWNWARD-NOT-UPWARD :SYMBOL-INFO-VOPS
:UNIX :UNWIND-TO-FRAME-AND-CALL-VOP :X86-64)
因此,例如,如果您想编写依赖于 Quicklisp 的代码,您可以使用#+quicklisp
. 如果您想要仅在 Quicklisp 不可用时运行的代码,您可以使用#-quicklisp
.
您还可以使用特征的布尔表达式。例如,
#+(or sbcl ecl) (format t "Foo!")
Foo!
将在 SBCL 或 ECL 上打印。
#+(and sbcl quicklisp) (format t "Bar!")
只会Bar!
在具有 Quicklisp 可用的 SBCL 上打印。