我正在阅读cl-fad/load。今晚的lisp代码,我发现有符号#+:
和#-:
在表达式或字符串的前面。
这些符号是什么意思?
这些是读时条件化工具:#+
和#-
让您根据特征表达式决定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
它可以工作,因为我在功能列表
上有CCLCL-USER> #-CCL (1+ 1)
; No value
它不起作用,因为我在功能列表中有CCL
或者你可以反过来想,只在特性列表
中没有的情况下执行CL-USER> #-calimero (1+ 1)
2
你可以添加任何符号:词到功能列表,你也可以添加逻辑
让我们执行,如果我在CCL上,并使用达尔文主机(即MAC OS X)
CL-USER> #+(and ccl darwin-host) (1+ 1)