在Common Lisp中,#:和#-:的含义是什么?

5
我今晚正在阅读 cl-fad/load.lisp 代码,发现在表达式或字符串前面有符号 #+:#-:
这些符号的含义是什么?

https://dev59.com/Y4rda4cB1Zd3GeqPHxrv - coredump
2个回答

7
这是一个读取时条件化工具: #+#- 让你根据特征表达式来决定要基于何种表达式读取

E.g.,

#+: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

除了基于实现选择代码外,这还允许您轻松地“注释掉”代码中的一部分(即下一个S表达式):
#+(or) (this code will be skipped over by any lisp reader
        because (or) returns nil)

1
对于“注释掉”,我也发现 #+nil 有效。 - user1247058
@rogual:它之所以能够工作,是因为您没有使用NIL - sds

2
这些是基于列表features的读取宏,这些宏指示在features列表中存在符号时是否执行表单。
展示特性列表:
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

你可以将任何符号:word添加到功能列表中,还可以添加逻辑。
如果我在CCL上使用达尔文主机(即MAC OS X),让我们执行。
CL-USER> #+(and ccl darwin-host) (1+ 1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接