Subject: Re: What does #+<anything-here> mean?
From: rpw3@rigden.engr.sgi.com (Rob Warnock)
Date: 1999/07/20
Newsgroups: comp.lang.scheme
Message-ID: <7n0irl$2kkih@fido.engr.sgi.com>
p8r <payter@mindspring.com> wrote:
+---------------
| Barry Margolin <barmar@bbnplanet.com> wrote:
| * (#+scheme set! #+common-lisp setq a b)
| * so that your assignment expression will work in both Scheme and CL.
| 
|     Oh, a pre-processor.
+---------------

Exactly, a pre-processor buried in the reader [which is, by the way,
*aready* doing lots of other "pre-processing", e.g., `x ==> (quasiquote x)
and so forth]. The #+/#- syntax gets used in almost exactly the same ways
that the C syntax #if/#ifdef/#ifndef gets used, except with slightly different
forms available for the conditional expressions.

E.g., in C the usual simple "feature test" is "#ifdef FOO", which asks if
the symbol "FOO" has been "defined" with "#define FOO ..." (and with no
later "#undef FOO"). In Lisp (or those Schemes which support it) the usual
feature test would be "#+foo", which tests whether "foo" is an element of
the list stored in the global variable "*features*" (or the like).

And just as in C you can say:

	#if defined(FOO) && !(defined(BAR) || defined(BAZ))
	...some stuff...
	#endif

in Common Lisp [or if Scheme, replace "progn" with "begin"] you can say:

	#+(and FOO (not (or BAR BAZ)))
	    (progn ...some stuff... )

Clear?


-Rob

-----
Rob Warnock, 8L-855		rpw3@sgi.com
Applied Networking		http://reality.sgi.com/rpw3/
Silicon Graphics, Inc.		Phone: 650-933-1673
1600 Amphitheatre Pkwy.		FAX: 650-933-0511
Mountain View, CA  94043	PP-ASEL-IA