Subject: Re: [constants] from a reader macro
From: Erik Naggum <>
Date: 2000/02/24
Newsgroups: comp.lang.lisp
Message-ID: <>

* Erik Naggum
| it seems by your use of the backquote that your core confusion is to
| believe that "macro" in "reader macro" is the same kind of "macro" as in
| "macro function".  it isn't.

* Tunc Simsek
| I must confess that I don't understand this remark, they behave in the
| same way, their ranges are lisp code.

  no.  that's the issue.  the "range" of macros is Lisp code which will be
  processed by the caller, usually the compiler on code it processes.  the
  "range" of reader macros is Lisp objects the Lisp reader was asked to
  pick up from some textual input source, such as by the compiler when it
  compiles files.  viz, a macro to build a matrix would return the code to
  be evaluated or compiled instead of the macro form, while a reader macro
  to build a matrix would return the matrix as a constant object.

  moreover, they do not behave in the same way.  a macro function is called
  with Lisp code it can transform at will, while a reader macro is expected
  to build Lisp objects from parsing input.  the "domain" of the former is
  Lisp objects and code, while the "domain" of the latter is characters and
  streams.  this must be understood in depth before you can make use of
  reader macros productively.  most Lisp programmers don't know how the
  Lisp reader and printer work to begin with, or how to add new objects to
  the read-write-consistency paradigm.  indeed, not understanding how Lisp
  has solved this very difficult problem is why most designers of protocols
  and syntaxes get them so incredibly wrong.

| My intent is to get a simple way of expressing constant matrices which I
| use a lot and don't like to type in (make-matrix ... all the time.

  this is good.  however, you should regard your reader macro as a
  short-cut for #.(make-matrix ...), not for (make-matrix ...) if you want
  to build the matrix in the reader macro (and nothing else makes sense).

| I actually know of one problem with using #\[ as a macro character:
| allegro uses it as a super paranthesi.

  which "allegro" is that?  Allegro CL does not violate the standard by
  interpreting [ and ] as anything but ordinary symbol name constituents.