gpt4 book ai didi

common-lisp - cl-mysql的代码中 "#+"是什么意思?

转载 作者:行者123 更新时间:2023-12-04 16:43:01 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





operator #+ and #- in .sbclrc

(2 个回答)


5年前关闭。




最近我试图阅读关于 cl-mysql 的代码,但被 #+ 卡住了.

试图谷歌它,但没有用,所以转向这里

(defun make-lock (name)
#+sb-thread (sb-thread:make-mutex :name name)
#+ecl (mp:make-lock :name name)
#+armedbear (ext:make-thread-lock)
#+ (and clisp mt) (mt:make-mutex :name name)
#+allegro (mp:make-process-lock :name name))

看起来它适用于不同的后端 lisp 编译器。但是还是不明白为什么要写这样的东西。
任何人都可以帮我说清楚,谢谢。

最佳答案

#+ 是一个读取器宏,用于检查关键字是否在特殊变量 *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 .

您还可以使用功能的 bool 表达式。例如,
#+(or sbcl ecl) (format t "Foo!")

会打印 Foo!在 SBCL 或 ECL 上。
#+(and sbcl quicklisp) (format t "Bar!")

只会打印 Bar!在具有 Quicklisp 的 SBCL 上。

关于common-lisp - cl-mysql的代码中 "#+"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36998131/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com