From: Christophe R. <cs...@ca...> - 2003-04-04 16:34:52
|
Sam Steingold <sd...@gn...> writes: >> * In message <sq8...@la...> >> * On the subject of "Re: [clisp-list] Re: Current CVS observations" >> * Sent on Fri, 04 Apr 2003 09:50:38 +0100 >> * Honorable Christophe Rhodes <cs...@ca...> writes: >> >> > (defvar *collector*) >> > (let ((forms nil)) >> > (dolist (c '(nil (:compile-toplevel))) >> > (dolist (l '(nil (:load-toplevel))) >> > (dolist (x '(nil (:execute))) >> > (push `(eval-when (,@c ,@l ,@x) >> > (push '(,@c ,@l ,@x) *collector*)) >> > forms)))) >> > (dolist (c '(nil (:compile-toplevel))) >> > (dolist (l '(nil (:load-toplevel))) >> > (dolist (x '(nil (:execute))) >> > (push `(let () (eval-when (,@c ,@l ,@x) >> > (push '(let ,@c ,@l ,@x) *collector*))) >> > forms)))) >> > (with-open-file (o "eval-when-test.lisp" :direction :output >> > :if-exists :supersede) >> > (dolist (f forms) >> > (prin1 f o) >> > (terpri o))) >> > (let ((*collector* nil)) >> > (load "eval-when-test.lisp") >> > (print *collector*)) >> >> LOAD of source implies that the relevant top-level regime is :EXECUTE. >> Therefore, for the EVAL-WHEN forms at toplevel, only those >> combinations with :EXECUTE in the situations will be executed, so this >> list starts with those toplevel forms with :EXECUTE. For the >> EVAL-WHEN forms not at top level, their execution on EVAL/LOAD is >> again controlled by :EXECUTE, so again only those forms with :EXECUTE >> in their situations will be executed, so the final list is: >> >> ((:execute) >> (:load-toplevel :execute) >> (:compile-toplevel :execute) >> (:compile-toplevel :load-toplevel :execute) >> (let :execute) >> (let :load-toplevel :execute) >> (let :compile-toplevel :execute) >> (let :compile-toplevel :load-toplevel :execute)) > > CMUCL: > > ((:load-toplevel) > (:load-toplevel :execute) > (:compile-toplevel :load-toplevel) > (:compile-toplevel :load-toplevel :execute) > (let :execute) > (let :load-toplevel :execute) > (let :compile-toplevel :execute) > (let :compile-toplevel :load-toplevel :execute)) > > either your analysis is incorrect, or CMUCL is faulty too. > >> > (let ((*collector* nil)) >> > (compile-file "eval-when-test.lisp") >> > (print *collector*)) >> >> ((:compile-toplevel) >> (:compile-toplevel :execute) >> (:compile-toplevel :load-toplevel) >> (:compile-toplevel :load-toplevel :execute)) > > no contest. > >> > (let ((*collector* nil)) >> > (load (compile-file-pathname "eval-when-test.lisp")) >> > (print *collector*))) >> >> ((:load-toplevel) >> (:load-toplevel :execute) >> (:compile-toplevel :load-toplevel) >> (:compile-toplevel :load-toplevel :execute) >> (let :execute) >> (let :load-toplevel :execute) >> (let :compile-toplevel :execute) >> (let :compile-toplevel :load-toplevel :execute)) > > CMUCL & CLISP: > > ((:execute) > (:load-toplevel :execute) > (:compile-toplevel :execute) > (:compile-toplevel :load-toplevel :execute) > (let :execute) > (let :load-toplevel :execute) > (let :compile-toplevel :execute) > (let :compile-toplevel :load-toplevel :execute))) > > is it possible that you are confusing :execute and :load-toplevel? The printout I get from CMUCL, verbatim, from pasting in your code, is: ; Loading #p"/usr/home/csr21/eval-when-test.lisp". ((:EXECUTE) (:LOAD-TOPLEVEL :EXECUTE) (:COMPILE-TOPLEVEL :EXECUTE) (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) (LET :EXECUTE ) (LET :LOAD-TOPLEVEL :EXECUTE) (LET :COMPILE-TOPLEVEL :EXECUTE) (LET :COMPILE-TOPLEVEL :LOAD-TOPLEVEL ; Python version 1.0, VM version Intel x86 on 04 APR 03 05:21:58 pm. ; Compiling: /usr/home/csr21/eval-when-test.lisp 04 APR 03 05:21:58 pm ; Byte Compiling Top-Level Form: ; Byte Compiling Top-Level Form: ; eval-when-test.x86f written. ; Compilation finished in 0:00:00. :EXECUTE)) ((:COMPILE-TOPLEVEL) (:COMPILE-TOPLEVEL :EXECUTE) (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL) (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)) ; Loading #p"/usr/home/csr21/eval-when-test.x86f". ((:LOAD-TOPLEVEL) (:LOAD-TOPLEVEL :EXECUTE) (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL) (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) (LET :EXECUTE ) (LET :LOAD-TOPLEVEL :EXECUTE) (LET :COMPILE-TOPLEVEL :EXECUTE) (LET :COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)) ((:LOAD-TOPLEVEL) (:LOAD-TOPLEVEL :EXECUTE) (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL) (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) (LET :EXECUTE ) (LET :LOAD-TOPLEVEL :EXECUTE) (LET :COMPILE-TOPLEVEL :EXECUTE) (LET :COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)) It's a bit hard to read, I grant, but there are four separate lists here. The first, just below ; Loading #p"/usr/home/csr21/eval-when-test.lisp". corresponds to my "load of source" paragraph, and agrees with my analysis. The second, corresponding to the compilation of the source, is uncontroversial and agrees with my analysis. The third and fourth are the same lists, once printed out by the program and once as the return value from the program; again, the presence of :LOAD-TOPLEVEL agrees with my analysis. I don't understand how you've got your results with CMUCL. (for reference, mine is CMU Common Lisp release x86-linux 3.1.7 18d+ 18 January 2003 build 4523 as distributied by Debian Linux. ACL's output is easier to read, as it happens; it says: ,--------------------- |; Loading /usr/home/csr21/eval-when-test.lisp | |((:EXECUTE) (:LOAD-TOPLEVEL :EXECUTE) (:COMPILE-TOPLEVEL :EXECUTE) | (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) (LET :EXECUTE) | (LET :LOAD-TOPLEVEL :EXECUTE) (LET :COMPILE-TOPLEVEL :EXECUTE) | (LET :COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)) |;;; Compiling file eval-when-test.lisp |;;; Writing fasl file eval-when-test.fasla16 |Warning: No IN-PACKAGE form seen in | /usr/home/csr21/eval-when-test.lisp. (Allegro Presto will be | ineffective when loading a file having no IN-PACKAGE form.) |;;; Fasl write complete | |((:COMPILE-TOPLEVEL) (:COMPILE-TOPLEVEL :EXECUTE) | (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL) | (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)) |; Fast loading /usr/home/csr21/eval-when-test.fasla16 | |((:LOAD-TOPLEVEL) (:LOAD-TOPLEVEL :EXECUTE) | (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL) | (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) (LET :EXECUTE) | (LET :LOAD-TOPLEVEL :EXECUTE) (LET :COMPILE-TOPLEVEL :EXECUTE) | (LET :COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)) '--------------------- where I have elided the fourth (return value) list. 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) |