Anybody know what #+
and #-
operators means in .sbclrc
? I couldn't find it in the manual.
I see #-
in .sbclrc
after I installed quicklisp:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
I also see #+
in the SBCL User Manual, but I couldn't find explanation of their functionality. Looks like something related for loading individual module.
Are they only for SBCL implementation or part of Common lisp?
That's a general facility of Common Lisp, not only SBCL.
There is a variable cl:*features*
which lists symbols for 'features' which should be present in the Lisp system currently. Typical features are: endian, implementation, subsystems, processor, extensions, Lisp dialect and more.
In a Lisp file the expression #+quicklisp(foo)
means: read and execute (foo)
only if the feature quicklisp
is present in the list of features *features*
.
In a Lisp file the expression #-quicklisp(foo)
means: read and execute (foo)
only if the feature quicklisp
is NOT present in the list of features *features*
.
This facility is often used to hide or show implementation specific code to some other Common Lisp implementation.
See the documentation:
- Features
- Feature Expressions
- sharpsign plus
- sharpsign minus
They're part of the Common Lisp READ
er. The idea is that they "hide" text unless a certain feature (often, a certain CL implementation) is (#+
) or is not (#-
) available.
These are probably the CL concept most like the C/C++ idea of "textual macros" -- conceptually and pragmatically, they are very similar to something like
#ifdef __MSVC12__
#ifndef __cplusplus__
...and the like. They literally hide bits of incoming cource code from the READ
er, so they're never lexed - parsed - interpreted - compiled - evaluated - interned - nada. They simply cease to exist if the CL implementation you're running lacks a feature / is the "wrong" implementation / whatever flag.