Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

operator #+ and #- in .sbclrc

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?

like image 971
sudo Avatar asked Dec 28 '11 04:12

sudo


Video Answer


2 Answers

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

A typical extension is the feature-case reader macro.

like image 84
Rainer Joswig Avatar answered Nov 12 '22 20:11

Rainer Joswig


They're part of the Common Lisp READer. 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 READer, 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.

like image 34
BRPocock Avatar answered Nov 12 '22 19:11

BRPocock