#+
ist ein Leser-Makro, das überprüft, ob ein Schlüsselwort in der speziellen Variablen *FEATURES*
ist. Wenn es nicht dort ist, wird das folgende Formular übersprungen (vom Leser; der Compiler wird es nie sehen). Es gibt auch #-
, die das Gegenteil tut.
Es gibt einige Dinge, die nicht Teil des Common Lisp-Standards sind, aber wichtig genug sind, dass alle (oder die meisten) Implementierungen eine nicht-standardmäßige Erweiterung für sie bieten. Wenn Sie sie in Code verwenden möchten, der für mehrere Implementierungen erforderlich ist, müssen Sie Lesezeitinformationen verwenden, um den richtigen Code für die aktuelle Implementierung bereitzustellen. Mutexes (und Threads im Allgemeinen) sind eines dieser Dinge.
Natürlich können auch Bibliotheken von Drittanbietern zur Verfügung gestellt werden. Der Inhalt *FEATURES*
wird wie folgt aussehen:
(: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)
Also, wenn Sie wollen Code schreiben, zum Beispiel auf Quicklisp abhängig ist, könnten Sie #+quicklisp
verwenden. Wenn Sie Code möchten, der nur ausgeführt wird, wenn Quicklisp nicht verfügbar ist, verwenden Sie #-quicklisp
.
Sie können auch einen booleschen Ausdruck von Features verwenden. Zum Beispiel würde
#+(or sbcl ecl) (format t "Foo!")
drucken Foo!
entweder SBCL oder ECL.
#+(and sbcl quicklisp) (format t "Bar!")
würde nur Bar!
auf SBCL drucken, die Quicklisp zur Verfügung hat.
Siehe auch: [Common Lisp: Was bedeutet # + nil?] (Http://stackoverflow.com/q/29849954/1281433), [Was bedeutet # + #. bedeutet in Lisp?] (http://Stackoverflow.com/q/5785755/1281433), [Operator # + und # - in .sbclrc] (http://Stackoverflow.com/q/8651695/1281433) –
Ich schloss Dies ist ein Duplikat, da es in anderen Fragen beantwortet wurde, aber ich habe es aufgewertet, weil es ein gutes Beispiel dafür ist, wie diese Konstruktion verwendet wird, und wie Sie festgestellt haben, ist es ziemlich schwierig, danach zu suchen, bis Sie wissen, was es ist aufgerufen (an diesem Punkt müssen Sie normalerweise nicht mehr suchen). –