From: Kaz K. <ka...@as...> - 2003-03-27 20:14:43
|
On 27 Mar 2003, Sam Steingold wrote: > > On 27 Mar 2003, Sam Steingold wrote: > > > > * Honorable Kaz Kylheku <ka...@as...> writes: > > > > > > > > http://users.footprints.net/~kaz/clisp-cvs-2003-04-26-backquote.diff > > > > > > read-from-string "`,@x") > > > -ERROR > > > +(SYSTEM::BACKQUOTE (SYSTEM::SPLICE X)) > > > > > > this is not good: backquote is a reader macro, so the error must be > > > signalled at read time, not macroexpand time (CMUCL and unpatched CLISP > > > signal at read time). > > > > If you are really adamant about catching `,@FORM at read time, > > it can be achieved trivially. After the the backquote reader > > reads the following object, if it's a cons whose car is the symbol > > SYSTEM::SPLICE or SYSTEM::NSPLICE, then signal the error. > > But I think that the macro-expansion-time check should stay in place, > > to trap cases when the error occurs in ``synthetic'' backquotes. > > maybe the BACKQUOTE macro should be expanded at read time, just like > CLISP does right now. You just need something like this version of backquote-reader: (defun backquote-reader (stream char) (declare (ignore char)) (let* ((*unquote-occured* nil) (*reading-array* nil) (*backquote-level* (1+ (or *backquote-level* 0))) (object (read stream t nil t))) ;; Check for unquotes in wrong type objects. (unless (or (and (vectorp object) (not (stringp object)) (not (bit-vector-p object))) (listp object)) (when *unquote-occured* (error-of-type 'error (TEXT "~S: unquotes may occur only in (...) or #(...) forms") 'read))) ;; Read-time check for ,@ or ,. not in list. ;; Also tested at macro-expansion time for ;; backquotes synthesized by means other than the reader (when (consp object) (case (car object) ((SPLICE) (error-of-type 'error (TEXT "the syntax `,@form is undefined behavior"))) ((NSPLICE) (error-of-type 'error (TEXT "the syntax `,.form is undefined behavior"))))) (list 'BACKQUOTE object))) > I am not really sure on this, so maybe you could raise this issue on > c.l.l? What for; it's clear you want early detection. On c.l.l, people will probably just reiterate that it's undefined behavior, but that catching errors early is nice. ;) |