I am reading the cl-fad/load.lisp code tonight, and I found there are symbols #+: and #-: in the front of expression or string.
What's these symbols meaning?
I am reading the cl-fad/load.lisp code tonight, and I found there are symbols #+: and #-: in the front of expression or string.
What's these symbols meaning?
On
This are reader macros based on the list features, this macros indicates to execute a form or not if the symbol is present on the features list
Showing the features list:
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)
In my case I 'm running:
CL-USER> (lisp-implementation-type)
"Clozure Common Lisp"
CL-USER> (lisp-implementation-version)
"Version 1.11-r16635 (DarwinX8664)"
Let's execute the form if I'm using CCL
CL-USER> #+CCL (1+ 1)
2
It works, because I have CCL on the features list
CL-USER> #-CCL (1+ 1)
; No value
It doest work because I have CCL in the features list
Or you can think the oppsite,only execute if I dont' have in teh features list
CL-USER> #-calimero (1+ 1)
2
You can ad any symbol :word to the features list and you can also add logic
let's execute if I'm on the CCL and using a darwin host (i.e MAC OS X)
CL-USER> #+(and ccl darwin-host) (1+ 1)
These are a read-time conditionalization facility:
#+and#-let you decide what expression toreadbased on Feature Expressions.E.g.,
means that when running under
allegro, the module:osiwill be loaded, but when running undersbcl, the module:sb-executablewill be loaded byrequire.Under all other implementations
requirewill not be called at all becausereadwill skip over the forms.You can check not just the implementation name, but a specific feature, e.g.,
In addition to selecting code based on implementation, this allows one to easily "comment out" a section of your code (i.e., the next sexp):