#+: 和 #-: 在 common lisp 中是什么意思

What is the meaning of #+: and #-: in common lisp

今晚看cl-fad/load.lisp代码,发现表达式或字符串前面有符号#+:#-:

这些符号是什么意思?

这些是读取时条件化工具:#+ and #- let you decide what expression to read based on Feature Expressions

例如,

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

表示当allegro下的运行时,会加载模块:osi,而当[=18=下的运行时,模块: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

除了根据实现选择代码之外,这还允许人们轻松 "comment out" 代码的一部分(即下一个 sexp):

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

这是基于列表 features 的 reader 宏,如果 上存在该符号,则此宏指示是否执行表单功能 列表

显示功能列表:

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 上并使用 darwin 主机(即 MAC OS X),让我们执行

CL-USER> #+(and ccl darwin-host) (1+ 1)