From: Christophe R. <cs...@ca...> - 2002-10-24 15:00:33
Attachments:
locally.diff
eval.impure.lisp
|
Hi, Attached is a partial fix for the bug regarding top-level form processing at the REPL. It fixes SBCL's behaviour for cases such as (locally (defmacro foo (x) `(print ,x)) (foo 1)) and the like (which has always worked in a compiled file, but has been failing at the REPL, because LOCALLY had been passed to COMPILE inside a LAMBDA, which broke the top-level-form one-at-a-time semantics. The fix is partial in several ways. Firstly, MACROLET and SYMBOL-MACROLET have the same property of preserving toplevelness of their body forms (e.g. (symbol-macrolet () (defmacro foo (x) `(print ,x)) (foo 1)) should likewise work); this patch does not address this issue, though if the approach in this patch seems correct it shouldn't be too hard to extend. Secondly, on the subject of the approach in this patch, I've had to expose more of the compiler's internals to EVAL; in some ways that's not too surprising, but in others it's fairly ugly. Thirdly and perhaps most worryingly, this patch causes regressions in some of the tests [involving (assert (not (ignore-errors ...)))]; I can't for the life of me see why :-( The relative paucity of failing tests is probably due to the non-implementation of MACROLET and toplevelness, as the test-files often have the idiom of (macrolet ((foo ...)) (locally (declare (optimize (safety 3))) ...) and our present implementation of macrolet hands things off to COMPILE... any ideas? Other comments? Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Christophe R. <cs...@ca...> - 2002-10-24 18:26:18
Attachments:
locally.diff
|
On Thu, Oct 24, 2002 at 04:00:09PM +0100, Christophe Rhodes wrote: > Attached is a partial fix for the bug regarding top-level form And here's a better one. The issues regarding {SYMBOL-,}MACROLET and mixing of compiler-internal variables are still there; however, I've tracked down the test failure problems to the fact that the sb-c::*policy* variable wasn't being passed correctly. There's a major catch (which I /think/ I've avoided by accident) in rebinding *POLICY* in ACTUALLY-COMPILE as I have done: proclamations and declamations of OPTIMIZE policy should have top-level scope, but if we rebind *POLICY*, then SETQ of it no longer does the right thing. However, I believe that (when MACROLET and SYMBOL-MACROLET are fixed) we will only be rebinding *POLICY* when compiling non-toplevel forms, so that by the time the code gets executed (since it can't execute at compile-time because we're not at toplevel) *POLICY* is unbound again and we're home and dry. This depends on ACTUALLY-COMPILE not being used by the file-compiler -- I don't know how good an assumption that is in the face of a TODO item that says "Early 0.7.x: Urgent EVAL/EVAL-WHEN/%COMPILE/DEFUN/DEFSTRUCT cleanup" :-) So anyway, the test suite now would pass unmodified (though I've added an (OPTIMIZE SAFETY) declaration to some error checking code where it's formally needed, for maintainability's sake) and passes my simple eval.impure.lisp tests as well. Phew. Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Christophe R. <cs...@ca...> - 2002-10-26 17:10:29
Attachments:
locally.diff
eval.impure.lisp
|
On Thu, Oct 24, 2002 at 07:25:54PM +0100, Christophe Rhodes wrote: > On Thu, Oct 24, 2002 at 04:00:09PM +0100, Christophe Rhodes wrote: > > Attached is a partial fix for the bug regarding top-level form > > And here's a better one. My candidate patch (which I'll check in tomorrow unless I hear otherwise) is attached. I've implemented the correct treatment of MACROLET and SYMBOL-MACROLET at the REPL as well. Issues: * quite a lot of SB!C:: prefixes; * rebinding of *POLICY* around ACTUALLY-COMPILE; * somewhat ugly MACROLET-DEFINITIONIZE-FUN logic (which should possibly be named MACROLET-DEFINITIONIZE-LAMBDA-EXPRESSION, now that I think of it; comments on that welcome, too). On the other hand, it does fix bug 185 (I believe completely, this time), so these issues don't seem too bad. Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |