From: Eric M. <ema...@ma...> - 2001-02-27 15:55:39
|
Hi, If I understand section 3.4.4.1.2 "Lambda-list-directed Destructuring by Lambda Lists" of the spec correctly, destructuring is allowed in the &body argument of a DEFMACRO lambda-list. For example ,---- | (defmacro with-pg-connection ((con &rest open-args) &body (forms decls)) | `(let ((,con (pg-connect ,@open-args))) | ,@decls | (unwind-protect | (progn ,@forms) | (when ,con (pg-disconnect ,con))))) `--- CLISP doesn't accept this, even in ANSI mode: "The lambda list of macro with-pg-connection contains an illegal variable after &REST/&BODY: (forms decls)". I couldn't find a mention in the impnotes. -- Eric Marsden <URL:http://www.laas.fr/~emarsden/> |
From: Sam S. <sd...@gn...> - 2001-02-27 17:58:44
|
> * In message <wzi...@ma...> > * On the subject of "destructuring in DEFMACRO lambda-lists" > * Sent on 26 Feb 2001 21:11:41 +0100 > * Honorable Eric Marsden <ema...@ma...> writes: > > If I understand section 3.4.4.1.2 "Lambda-list-directed Destructuring > by Lambda Lists" of the spec correctly, destructuring is allowed in > the &body argument of a DEFMACRO lambda-list. For example > > ,---- > | (defmacro with-pg-connection ((con &rest open-args) &body (forms decls)) > | `(let ((,con (pg-connect ,@open-args))) > | ,@decls > | (unwind-protect > | (progn ,@forms) > | (when ,con (pg-disconnect ,con))))) > `--- > > CLISP doesn't accept this, even in ANSI mode: "The lambda list of macro > with-pg-connection contains an illegal variable after &REST/&BODY: > (forms decls)". I couldn't find a mention in the impnotes. FWIW, CCL, ACL and CMUCL accept this defmacro, but CCL fails to macroexpand it and ACL and CMUCL expand it differently (I would say that CMUCL is wrong and ACL is right, but IANAL :-). This appears to be a fairly obscure feature, which is better avoided. OTOH, it should certainly be fixed. I will look at it... PS. Bruno, why `destructuring-bind' in defs2.lisp uses `<DESTRUCTURING-FORM>' instead of a gensym? wouldn't this pose a problem for MT? same for `<macro-form>' and `<deftype-form>'... do you mind if I change that? -- Sam Steingold (http://www.podval.org/~sds) Support Israel's right to defend herself! <http://www.i-charity.com/go/israel> Read what the Arab leaders say to their people on <http://www.memri.org/> Whether pronounced "leenooks" or "line-uks", it's better than Windows. |
From: Bruno H. <ha...@il...> - 2001-02-27 18:48:35
|
Sam writes: > > If I understand section 3.4.4.1.2 "Lambda-list-directed Destructuring > > by Lambda Lists" of the spec correctly, destructuring is allowed in > > the &body argument of a DEFMACRO lambda-list. You're right. CLISP should be fixed to accept this. > OTOH, it should certainly be fixed. I will look at it... Thanks. > PS. Bruno, why `destructuring-bind' in defs2.lisp uses > `<DESTRUCTURING-FORM>' instead of a gensym? So that people who look at macroexpansions (like me) understand the macro expansion more easily. > wouldn't this pose a problem for MT? No, these variables are bound lexically. There is no 'declare (special' on them. > same for `<macro-form>' and `<deftype-form>'... > do you mind if I change that? Yes. It's not broken, why change it? Bruno |
From: Bruno H. <ha...@il...> - 2001-02-28 13:25:13
|
Sam writes: > > > OTOH, it should certainly be fixed. I will look at it... > > Thanks. > done. Show your patch. I've made a patch as well - it was quite easy. > only I get this diff: > > $ diff defs2.fas stage/defs2.fas > 296,299c296,299 > < #245Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 90 01 2F 28 9E 5C 78 AC > < 8F 03 80 D1 AC 24 02 21 AC 25 09 2F DD E3 2E 04 59 1D 07 DF E0 E1 > < 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 AD 2F 01 19 02 DD DC 2E > < 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 61 15 19 02 00 2B 01 9F > --- > > #247Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 33 01 2F 1F 80 E1 AD 2F > > 01 9E 5C 78 AC 8F 03 80 CC AC 24 02 1C AC 25 09 2A DD E3 2E 04 59 > > 1D 07 DF E0 E1 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 DD DC 2E > > 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 66 15 19 02 00 2B 01 9F > 307c307 > < 24 19 03) > --- > > 24 19 03 19 02) > > why? (no, I will not commit anything until `make tests' is clean). This means that your patch changed the expansion of an existing defmacro form. > > > PS. Bruno, why `destructuring-bind' in defs2.lisp uses > > > `<DESTRUCTURING-FORM>' instead of a gensym? > > > > So that people who look at macroexpansions (like me) understand the > > macro expansion more easily. > > (gensym "DESTRUCTURING-FORM-") is just as informative and does not > clutter the symbol table. It creates multiple symbols in memory where a single symbol suffices. > It is also unique for each defmacro, which might be good for all of use > who debug `defmacro' with `macroexpand' On the contrary, these gensyms make debugging harder. > I hate to see these unbound symbols in the `apropos' output. Then write your own apropos-filtered function and use (apropos-filtered "foobar" #'boundp) > At any rate, the patch is ready and tested. Show the patch. Mine is below. Bruno *** clisp/src/defmacro.lisp.bak Sun Jun 11 08:38:48 2000 --- clisp/src/defmacro.lisp Wed Feb 28 01:52:01 2001 *************** *** 281,295 **** (ENGLISH "The lambda list of macro ~S is missing a variable after &REST/&BODY.") name ) ) - (unless (symbolp (car lambdalistr)) - (error-of-type 'source-program-error - (ENGLISH "The lambda list of macro ~S contains an illegal variable after &REST/&BODY: ~S") - name (car lambdalistr) - ) ) (let ((restvar (car lambdalistr)) (listr (cdr lambdalistr))) (setq %restp t) ! (setq %let-list (cons `(,restvar ,restexp) %let-list)) (cond ((null listr)) ((atom listr) (cerror (ENGLISH "The rest of the lambda list will be ignored.") --- 281,301 ---- (ENGLISH "The lambda list of macro ~S is missing a variable after &REST/&BODY.") name ) ) (let ((restvar (car lambdalistr)) (listr (cdr lambdalistr))) (setq %restp t) ! (cond ((symbolp restvar) ! (setq %let-list (cons `(,restvar ,restexp) %let-list)) ! ) ! ((atom restvar) ! (error-of-type 'source-program-error ! (ENGLISH "The lambda list of macro ~S contains an illegal variable after &REST/&BODY: ~S") ! name restvar ! )) ! (t ! (let ((%min-args 0) (%arg-count 0) (%restp nil)) ! (analyze1 restvar restexp name restexp) ! ) )) (cond ((null listr)) ((atom listr) (cerror (ENGLISH "The rest of the lambda list will be ignored.") |
From: Bruno H. <ha...@il...> - 2001-02-28 18:45:31
|
Sam writes: > > > (gensym "DESTRUCTURING-FORM-") is just as informative and does not > > > clutter the symbol table. > > > > It creates multiple symbols in memory where a single symbol suffices. > > aren't these symbols GCed?! In interpreted code (defun without compile-file), these symbols are part of the function's definition and not GCed. > also, you did not reply re: %let-list &co! I didn't understand your question. %let-list is a special variable, but the bindings it contains may be lexical or dynamic. > > > It is also unique for each defmacro, which might be good for all of us > > > who debug `defmacro' with `macroexpand' > > On the contrary, these gensyms make debugging harder. > > why?! how is "#:MACRO-FORM-123" worse than "SYSTEM::<MACRO-FORM>"? When you step through the code and wish to eval this symbol, how do you do it when it's a gensym? Also, when debugging, one needs to compare different macroexpansions. This is easier without gensyms. > > Show the patch. Mine is below. > > it's interesting that both of us are ready to hack lisp and prefer to > avoid messing with pathname.d ;-) :-) > > ! (let ((%min-args 0) (%arg-count 0) (%restp nil)) > > ! (analyze1 restvar restexp name restexp) > ^^^^^^^ > this is an error. try your patch with Eric's example and you will see > that. mine is correct. Here are the results. Mine: [1]> (macroexpand-1 '(defmacro with-pg-connection ((con &rest open-args) &body (forms decls)) (foobar))) (LET NIL (EVAL-WHEN (COMPILE LOAD EVAL) (SYSTEM::REMOVE-OLD-DEFINITIONS 'WITH-PG-CONNECTION) (SYSTEM::%PUTD 'WITH-PG-CONNECTION (SYSTEM::MAKE-MACRO (FUNCTION WITH-PG-CONNECTION (LAMBDA (SYSTEM::<MACRO-FORM> &OPTIONAL SYSTEM::<ENV-ARG>) (DECLARE (CONS SYSTEM::<MACRO-FORM>)) (DECLARE (IGNORE SYSTEM::<ENV-ARG>)) (IF (< (LENGTH SYSTEM::<MACRO-FORM>) 2) (SYSTEM::MACRO-CALL-ERROR SYSTEM::<MACRO-FORM>) (LET* ((CON (CAADR SYSTEM::<MACRO-FORM>)) (OPEN-ARGS (CDADR SYSTEM::<MACRO-FORM>)) (FORMS (CADDR SYSTEM::<MACRO-FORM>)) (DECLS (CADDDR SYSTEM::<MACRO-FORM>))) (BLOCK WITH-PG-CONNECTION (FOOBAR))))))))) (EVAL-WHEN (EVAL) (SYSTEM::%PUT 'WITH-PG-CONNECTION 'SYSTEM::DEFINITION (CONS '(DEFMACRO WITH-PG-CONNECTION ((CON &REST OPEN-ARGS) &BODY (FORMS DECLS)) (FOOBAR)) (THE-ENVIRONMENT)))) 'WITH-PG-CONNECTION) ; T Yours: [1]> (macroexpand-1 '(defmacro with-pg-connection ((con &rest open-args) &body (forms decls)) (foobar))) (LET NIL (EVAL-WHEN (COMPILE LOAD EVAL) (SYSTEM::REMOVE-OLD-DEFINITIONS 'WITH-PG-CONNECTION) (SYSTEM::%PUTD 'WITH-PG-CONNECTION (SYSTEM::MAKE-MACRO (FUNCTION WITH-PG-CONNECTION (LAMBDA (SYSTEM::<MACRO-FORM> &OPTIONAL SYSTEM::<ENV-ARG>) (DECLARE (CONS SYSTEM::<MACRO-FORM>)) (DECLARE (IGNORE SYSTEM::<ENV-ARG>)) (IF (< (LENGTH SYSTEM::<MACRO-FORM>) 2) (SYSTEM::MACRO-CALL-ERROR SYSTEM::<MACRO-FORM>) (LET* ((CON (CAADR SYSTEM::<MACRO-FORM>)) (OPEN-ARGS (CDADR SYSTEM::<MACRO-FORM>)) (FORMS (CAADDR SYSTEM::<MACRO-FORM>)) (DECLS (CAR (CDADDR SYSTEM::<MACRO-FORM>)))) (BLOCK WITH-PG-CONNECTION (FOOBAR))))))))) (EVAL-WHEN (EVAL) (SYSTEM::%PUT 'WITH-PG-CONNECTION 'SYSTEM::DEFINITION (CONS '(DEFMACRO WITH-PG-CONNECTION ((CON &REST OPEN-ARGS) &BODY (FORMS DECLS)) (FOOBAR)) (THE-ENVIRONMENT)))) 'WITH-PG-CONNECTION) ; Your patch treats ((con &rest open-args) &body (forms decls)) as if it had been ((con &rest open-args) (forms decls)) Mine treats it like ((con &rest open-args) . (forms decls)) Thus the error is in your patch. Bruno |
From: Bruno H. <ha...@il...> - 2001-03-01 20:21:51
|
Sam writes: > how often do you do (step (macroexpand ))? Every time I use step. The stepper always steps through the macroexpansions. > > Also, when debugging, one needs to compare different > > macroexpansions. This is easier without gensyms. > > why have gensyms been introduced then? > > how is > (defmacro sqr (x) `(let ((x ,x)) (* x x))) > worse than > (defmacro sqr (x) (let ((v (gensym "SQR-"))) `(let ((,v ,x)) (* ,v ,v)))) They are equivalent, if you can assure that 'x' has not been declared special. (Which you can if it's an internal symbol of your package.) Gensyms are used for "hygienic macros" when other arbitrary code can occur between the binding and the use of the variable. > I guess this is important only when the same macro is nested, e.g., > (with-open-file () > (with-open-file ())) > > so you are gambling that defmacro is never nested, right? Yes, that's also an important consideration. > (defmacro with-pg-connection ((con &rest open-args) &body (forms decls)) > `(let ((,con (pg-connect ,@open-args))) > ,@decls > (unwind-protect > (progn ,@forms) > (when ,con (pg-disconnect ,con))))) > > sds: > > (macroexpand '(with-pg-connection (c o o1 o2) ((f1 f2 f3) (d1 d2 d3)))) Why do you put additional parentheses around (f1 f2 f3) (d1 d2 d3) here? Remember that &body/&rest acts like ".". (defmacro with-pg-connection ((con &rest open-args) &body (forms decls)) must behave like (defmacro with-pg-connection ((con &rest open-args) forms decls) > BTW, your patch fails the checks the same way as mine: > > $ diff defs2.fas stage/defs2.fas > 295,298c295,298 > < #247Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 33 01 2F 1F 80 E1 AD 2F > < 01 9E 5C 78 AC 8F 03 80 CC AC 24 02 1C AC 25 09 2A DD E3 2E 04 59 > < 1D 07 DF E0 E1 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 DD DC 2E > < 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 66 15 19 02 00 2B 01 9F > --- > > #245Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 90 01 2F 28 9E 5C 78 AC > > 8F 03 80 D1 AC 24 02 21 AC 25 09 2F DD E3 2E 04 59 1D 07 DF E0 E1 > > 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 AD 2F 01 19 02 DD DC 2E > > 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 61 15 19 02 00 2B 01 9F > 306c306 > < 24 19 03 19 02) > --- > > 24 19 03) What's this? I disassembled the code and found that the code which produced your first snippet must have a broken DEFTYPE expander. [1]> (setq func1 ' #Y(#:DEFTYPE-DESIGNATOR #247Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 33 01 2F 1F 80 E1 AD 2F 01 9E 5C 78 AC 8F 03 80 CC AC 24 02 1C AC 25 09 2A DD E3 2E 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 DD DC 2E 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 66 15 19 02 00 2B 01 9F 5C 5B 0B 00 00 1B 3C E0 AD 33 01 32 16 01 1C 3F 9D 2B 01 00 0B 00 00 4B 0C 20 E7 E8 E9 B3 B2 6D 10 02 EB 99 12 ED EE 6E 08 15 0E 16 5D 10 16 F1 F2 6F 19 33 01 1E 03 1F 1B 35 06 04 00 39 00 00 4D 16 01 68 00 00 AC 8E 09 FF BC 16 01 1D 41 63 F4 68 02 00 6E 03 1B F6 71 CA 71 D2 AC 8C 4F 07 AC AE 6D 1D 01 32 80 DD 68 02 00 24 1E 48 00 14 E5 68 04 00 7B 02 65 20 65 21 65 22 B2 7B 02 7B 03 7B 02 33 02 23 5D 19 06 94 00 AC 24 0B FF 6C 9E 19 04 9D 21 73 65 23 AD 30 24 19 03 19 02) 2. TYPE-CALL-ERROR CHARACTER OR ANSI INTEGER 0. 65535. ((DESIGNATOR (STRING 1.))) BASE-CHAR ((DESIGNATOR (STRING 1.))) STRING #(NIL) :NAME CONTINUE :INVOKE-FUNCTION #Y(#:DEFTYPE-DESIGNATOR-1 #17Y(00 00 00 00 00 00 00 00 01 16 9E 0C 00 01 4E 01 00) NIL NIL) :REPORT REPORT-NO-NEW-VALUE :INTERACTIVE #Y(#:DEFTYPE-DESIGNATOR-2 #15Y(00 00 00 00 00 00 00 00 00 01 33 00 23 19 01)) MAKE-RESTART *ACTIVE-RESTARTS* "~A" (TYPEP N '(INTEGER 0. *)) ASSERT-ERROR-STRING #Y(#:DEFTYPE-DESIGNATOR-3 #26Y(00 00 00 00 02 00 00 00 01 18 DA B0 38 02 31 88 AF 01 06 B5 2D 08 01 9E 19 04) "SYMBOL-OF-LENGTH-" DO-FORMAT-DECIMAL) FORMAT "SYSTEM" #Y(#:DEFTYPE-DESIGNATOR-4 #29Y(00 00 00 00 01 00 00 00 00 02 AD 32 03 1F 0C AD 72 8A 72 45 69 00 01 31 FE 19 02 19 02) NIL) 1. (CHARACTER) AND SYMBOL SATISFIES DESIGNATOR TYPESPEC-ERROR) ) #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR> [2]> (setq func2 ' #Y(#:DEFTYPE-DESIGNATOR #245Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 90 01 2F 28 9E 5C 78 AC 8F 03 80 D1 AC 24 02 21 AC 25 09 2F DD E3 2E 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 AD 2F 01 19 02 DD DC 2E 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 61 15 19 02 00 2B 01 9F 5C 5B 0B 00 00 1B 3C E0 AD 33 01 32 16 01 1C 3F 9D 2B 01 00 0B 00 00 4B 0C 20 E7 E8 E9 B3 B2 6D 10 02 EB 99 12 ED EE 6E 08 15 0E 16 5D 10 16 F1 F2 6F 19 33 01 1E 03 1F 1B 35 06 04 00 39 00 00 4D 16 01 68 00 00 AC 8E 09 FF BC 16 01 1D 41 63 F4 68 02 00 6E 03 1B F6 71 CA 71 D2 AC 8C 4F 07 AC AE 6D 1D 01 32 80 DD 68 02 00 24 1E 48 00 14 E5 68 04 00 7B 02 65 20 65 21 65 22 B2 7B 02 7B 03 7B 02 33 02 23 5D 19 06 94 00 AC 24 0B FF 6C 9E 19 04 9D 21 73 65 23 AD 30 24 19 03) 2. TYPE-CALL-ERROR CHARACTER OR ANSI INTEGER 0. 65535. ((DESIGNATOR (STRING 1.))) BASE-CHAR ((DESIGNATOR (STRING 1.))) STRING #(NIL) :NAME CONTINUE :INVOKE-FUNCTION #Y(#:DEFTYPE-DESIGNATOR-1 #17Y(00 00 00 00 00 00 00 00 01 16 9E 0C 00 01 4E 01 00) NIL NIL) :REPORT REPORT-NO-NEW-VALUE :INTERACTIVE #Y(#:DEFTYPE-DESIGNATOR-2 #15Y(00 00 00 00 00 00 00 00 00 01 33 00 23 19 01)) MAKE-RESTART *ACTIVE-RESTARTS* "~A" (TYPEP N '(INTEGER 0. *)) ASSERT-ERROR-STRING #Y(#:DEFTYPE-DESIGNATOR-3 #26Y(00 00 00 00 02 00 00 00 01 18 DA B0 38 02 31 88 AF 01 06 B5 2D 08 01 9E 19 04) "SYMBOL-OF-LENGTH-" DO-FORMAT-DECIMAL) FORMAT "SYSTEM" #Y(#:DEFTYPE-DESIGNATOR-4 #29Y(00 00 00 00 01 00 00 00 00 02 AD 32 03 1F 0C AD 72 8A 72 45 69 00 01 31 FE 19 02 19 02) NIL) 1. (CHARACTER) AND SYMBOL SATISFIES DESIGNATOR TYPESPEC-ERROR) ) #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR> [3]> (disassemble func1) Disassembly von Funktion #:DEFTYPE-DESIGNATOR (CONST 0) = 2 (CONST 1) = TYPE-CALL-ERROR (CONST 2) = CHARACTER (CONST 3) = OR (CONST 4) = ANSI (CONST 5) = INTEGER (CONST 6) = 0 (CONST 7) = 65535 (CONST 8) = ((DESIGNATOR (STRING 1))) (CONST 9) = BASE-CHAR (CONST 10) = ((DESIGNATOR (STRING 1))) (CONST 11) = STRING (CONST 12) = #(NIL) (CONST 13) = :NAME (CONST 14) = CONTINUE (CONST 15) = :INVOKE-FUNCTION (CONST 16) = #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-1> (CONST 17) = :REPORT (CONST 18) = REPORT-NO-NEW-VALUE (CONST 19) = :INTERACTIVE (CONST 20) = #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-2> (CONST 21) = MAKE-RESTART (CONST 22) = *ACTIVE-RESTARTS* (CONST 23) = "~A" (CONST 24) = (TYPEP N '(INTEGER 0 *)) (CONST 25) = ASSERT-ERROR-STRING (CONST 26) = #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-3> (CONST 27) = FORMAT (CONST 28) = "SYSTEM" (CONST 29) = #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-4> (CONST 30) = 1 (CONST 31) = (CHARACTER) (CONST 32) = AND (CONST 33) = SYMBOL (CONST 34) = SATISFIES (CONST 35) = DESIGNATOR (CONST 36) = TYPESPEC-ERROR 1 notwendige Argumente 0 optionale Argumente Kein Rest-Parameter Keine Keyword-Parameter 0 (LOAD&PUSH 1) 1 (CALLS2&PUSH 69) ; LENGTH 3 (CONST&PUSH 0) ; 2 4 (CALLSR 1 47) ; /= 7 (JMPIFNOT1 L235) 10 (LOAD&PUSH 1) 11 (CALL1 1) ; TYPE-CALL-ERROR 13 (LOAD 1) 14 (CDR) 15 (CAR&PUSH) 16 (LOAD&PUSH 0) 17 (CALLS2&JMPIFNOT 3 L225) ; SYMBOLP 21 (LOAD&PUSH 0) 22 (JMPIFEQTO 2 L53) ; CHARACTER 25 (LOAD&PUSH 0) 26 (JMPIFNOTEQTO 9 L71) ; BASE-CHAR 29 (CONST&PUSH 3) ; OR 30 (CONST&PUSH 9) ; BASE-CHAR 31 (CALL0 4) ; ANSI 33 (NOT) 34 (JMPIFNOT L43) 36 (CONST&PUSH 5) ; INTEGER 37 (CONST&PUSH 6) ; 0 38 (CONST&PUSH 7) ; 65535 39 (LIST&PUSH 3) 41 (LIST 1) 43 L43 43 (PUSH) 44 (CONST 10) ; ((DESIGNATOR (STRING 1))) 45 L45 45 (PUSH) 46 (CALLSR 2 35) ; APPEND 49 (LIST* 2) 51 (SKIP&RET 3) 53 L53 53 (CONST&PUSH 3) ; OR 54 (CONST&PUSH 2) ; CHARACTER 55 (CALL0 4) ; ANSI 57 (NOT) 58 (JMPIFNOT L67) 60 (CONST&PUSH 5) ; INTEGER 61 (CONST&PUSH 6) ; 0 62 (CONST&PUSH 7) ; 65535 63 (LIST&PUSH 3) 65 (LIST 1) 67 L67 67 (PUSH) 68 (CONST 8) ; ((DESIGNATOR (STRING 1))) 69 (JMP L45) 71 L71 71 (POP) 72 (SKIP&RET 2) 74 L74 74 (NIL) 75 (MAKE-VECTOR1&PUSH 1) 77 (LOAD 2) 78 (CDR) 79 (CAR) 80 (STOREC 0 0) 83 (JMP L145) 85 L85 85 (CONST&PUSH 6) ; 0 86 (LOAD&PUSH 1) 87 (CALLSR 1 50) ; <= 90 (SKIP 1) 92 (JMPIF L157) 94 L94 94 (LOAD 0) 95 (MAKE-VECTOR1&PUSH 1) 97 (NIL) 98 (STOREC 0 0) 101 (TAGBODY-OPEN 12 L136) ; #(NIL) 104 (CONST&PUSH 13) ; :NAME 105 (CONST&PUSH 14) ; CONTINUE 106 (CONST&PUSH 15) ; :INVOKE-FUNCTION 107 (LOAD&PUSH 7) 108 (LOAD&PUSH 6) 109 (COPY-CLOSURE&PUSH 16 2) ; #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-1> 112 (CONST&PUSH 17) ; :REPORT 113 (CONST&SYMBOL-FUNCTION&PUSH 18) ; REPORT-NO-NEW-VALUE 115 (CONST&PUSH 19) ; :INTERACTIVE 116 (CONST&PUSH 20) ; #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-2> 117 (CALL&PUSH 8 21) ; MAKE-RESTART 120 (GETVALUE 22) ; *ACTIVE-RESTARTS* 122 (CONS) 123 (BIND 22) ; *ACTIVE-RESTARTS* 125 (CONST&PUSH 23) ; "~A" 126 (CONST&PUSH 24) ; (TYPEP N '(INTEGER 0 *)) 127 (CALL1&PUSH 25) ; ASSERT-ERROR-STRING 129 (CALLSR 1 30) ; ERROR 132 L132 132 (CONST 31) ; (CHARACTER) 134 (JMP L189) 136 L136 136 (LOADC 4 0) 139 (UNLIST 0 0) 142 (TAGBODY-CLOSE) 143 (SKIP 1) 145 L145 145 (LOADC&PUSH 0 0) 148 (LOAD&PUSH 0) 149 (CALLS2&JMPIF 9 L85) ; INTEGERP 153 (SKIP 1) 155 (JMPIFNOT L94) 157 L157 157 (NIL&PUSH) 158 (CONST&PUSH 26) ; #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-3> 159 (LOADC&PUSH 2 0) 162 (CALL&PUSH 3 27) ; FORMAT 165 (CONST&PUSH 28) ; "SYSTEM" 166 (CALLS1&PUSH 202) ; FIND-PACKAGE 168 (CALLS1&PUSH 210) ; INTERN 170 (LOAD&PUSH 0) 171 (CALLS1&JMPIF 79 L181) ; FBOUNDP 174 (LOAD&PUSH 0) 175 (LOAD&PUSH 2) 176 (COPY-CLOSURE&PUSH 29 1) ; #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-4> 179 (CALLS2 128) ; SYSTEM::%PUTD 181 L181 181 (CONST&PUSH 3) ; OR 182 (LOADC&PUSH 2 0) 185 (JMPIFEQTO 30 L132) ; 1 188 (NIL) 189 L189 189 (PUSH) 190 (CONST&PUSH 11) ; STRING 191 (LOADC&PUSH 4 0) 194 (LIST&PUSH 2) 196 (CONST&PUSH 32) ; AND 198 (CONST&PUSH 33) ; SYMBOL 200 (CONST&PUSH 34) ; SATISFIES 202 (LOAD&PUSH 6) 203 (LIST&PUSH 2) 205 (LIST&PUSH 3) 207 (LIST&PUSH 2) 209 (CALLSR 2 35) ; APPEND 212 (CONS) 213 (SKIP&RET 6) 215 L215 215 (LOAD&CAR&PUSH 0) 217 (LOAD&PUSH 0) 218 (JMPIFEQTO 11 L74) ; STRING 222 (LOAD 1) 223 (SKIP&RET 4) 225 L225 225 (LOAD 0) 226 (JMPIFCONSP L215) 228 (CONST&PUSH 35) ; DESIGNATOR 230 (LOAD&PUSH 1) 231 (CALL2 36) ; TYPESPEC-ERROR 233 (SKIP&RET 3) 235 L235 235 (SKIP&RET 2) #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR> [4]> (disassemble func2) Disassembly von Funktion #:DEFTYPE-DESIGNATOR (CONST 0) = 2 (CONST 1) = TYPE-CALL-ERROR (CONST 2) = CHARACTER (CONST 3) = OR (CONST 4) = ANSI (CONST 5) = INTEGER (CONST 6) = 0 (CONST 7) = 65535 (CONST 8) = ((DESIGNATOR (STRING 1))) (CONST 9) = BASE-CHAR (CONST 10) = ((DESIGNATOR (STRING 1))) (CONST 11) = STRING (CONST 12) = #(NIL) (CONST 13) = :NAME (CONST 14) = CONTINUE (CONST 15) = :INVOKE-FUNCTION (CONST 16) = #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-1> (CONST 17) = :REPORT (CONST 18) = REPORT-NO-NEW-VALUE (CONST 19) = :INTERACTIVE (CONST 20) = #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-2> (CONST 21) = MAKE-RESTART (CONST 22) = *ACTIVE-RESTARTS* (CONST 23) = "~A" (CONST 24) = (TYPEP N '(INTEGER 0 *)) (CONST 25) = ASSERT-ERROR-STRING (CONST 26) = #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-3> (CONST 27) = FORMAT (CONST 28) = "SYSTEM" (CONST 29) = #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-4> (CONST 30) = 1 (CONST 31) = (CHARACTER) (CONST 32) = AND (CONST 33) = SYMBOL (CONST 34) = SATISFIES (CONST 35) = DESIGNATOR (CONST 36) = TYPESPEC-ERROR 1 notwendige Argumente 0 optionale Argumente Kein Rest-Parameter Keine Keyword-Parameter 0 (LOAD&PUSH 1) 1 (CALLS2&PUSH 69) ; LENGTH 3 (CONST&PUSH 0) ; 2 4 (CALLSR&JMPIF 1 47 L48) ; /= 8 (LOAD 1) 9 (CDR) 10 (CAR&PUSH) 11 (LOAD&PUSH 0) 12 (CALLS2&JMPIFNOT 3 L225) ; SYMBOLP 16 (LOAD&PUSH 0) 17 (JMPIFEQTO 2 L53) ; CHARACTER 20 (LOAD&PUSH 0) 21 (JMPIFNOTEQTO 9 L71) ; BASE-CHAR 24 (CONST&PUSH 3) ; OR 25 (CONST&PUSH 9) ; BASE-CHAR 26 (CALL0 4) ; ANSI 28 (NOT) 29 (JMPIFNOT L38) 31 (CONST&PUSH 5) ; INTEGER 32 (CONST&PUSH 6) ; 0 33 (CONST&PUSH 7) ; 65535 34 (LIST&PUSH 3) 36 (LIST 1) 38 L38 38 (PUSH) 39 (CONST 10) ; ((DESIGNATOR (STRING 1))) 40 L40 40 (PUSH) 41 (CALLSR 2 35) ; APPEND 44 (LIST* 2) 46 (SKIP&RET 3) 48 L48 48 (LOAD&PUSH 1) 49 (CALL1 1) ; TYPE-CALL-ERROR 51 (SKIP&RET 2) 53 L53 53 (CONST&PUSH 3) ; OR 54 (CONST&PUSH 2) ; CHARACTER 55 (CALL0 4) ; ANSI 57 (NOT) 58 (JMPIFNOT L67) 60 (CONST&PUSH 5) ; INTEGER 61 (CONST&PUSH 6) ; 0 62 (CONST&PUSH 7) ; 65535 63 (LIST&PUSH 3) 65 (LIST 1) 67 L67 67 (PUSH) 68 (CONST 8) ; ((DESIGNATOR (STRING 1))) 69 (JMP L40) 71 L71 71 (POP) 72 (SKIP&RET 2) 74 L74 74 (NIL) 75 (MAKE-VECTOR1&PUSH 1) 77 (LOAD 2) 78 (CDR) 79 (CAR) 80 (STOREC 0 0) 83 (JMP L145) 85 L85 85 (CONST&PUSH 6) ; 0 86 (LOAD&PUSH 1) 87 (CALLSR 1 50) ; <= 90 (SKIP 1) 92 (JMPIF L157) 94 L94 94 (LOAD 0) 95 (MAKE-VECTOR1&PUSH 1) 97 (NIL) 98 (STOREC 0 0) 101 (TAGBODY-OPEN 12 L136) ; #(NIL) 104 (CONST&PUSH 13) ; :NAME 105 (CONST&PUSH 14) ; CONTINUE 106 (CONST&PUSH 15) ; :INVOKE-FUNCTION 107 (LOAD&PUSH 7) 108 (LOAD&PUSH 6) 109 (COPY-CLOSURE&PUSH 16 2) ; #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-1> 112 (CONST&PUSH 17) ; :REPORT 113 (CONST&SYMBOL-FUNCTION&PUSH 18) ; REPORT-NO-NEW-VALUE 115 (CONST&PUSH 19) ; :INTERACTIVE 116 (CONST&PUSH 20) ; #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-2> 117 (CALL&PUSH 8 21) ; MAKE-RESTART 120 (GETVALUE 22) ; *ACTIVE-RESTARTS* 122 (CONS) 123 (BIND 22) ; *ACTIVE-RESTARTS* 125 (CONST&PUSH 23) ; "~A" 126 (CONST&PUSH 24) ; (TYPEP N '(INTEGER 0 *)) 127 (CALL1&PUSH 25) ; ASSERT-ERROR-STRING 129 (CALLSR 1 30) ; ERROR 132 L132 132 (CONST 31) ; (CHARACTER) 134 (JMP L189) 136 L136 136 (LOADC 4 0) 139 (UNLIST 0 0) 142 (TAGBODY-CLOSE) 143 (SKIP 1) 145 L145 145 (LOADC&PUSH 0 0) 148 (LOAD&PUSH 0) 149 (CALLS2&JMPIF 9 L85) ; INTEGERP 153 (SKIP 1) 155 (JMPIFNOT L94) 157 L157 157 (NIL&PUSH) 158 (CONST&PUSH 26) ; #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-3> 159 (LOADC&PUSH 2 0) 162 (CALL&PUSH 3 27) ; FORMAT 165 (CONST&PUSH 28) ; "SYSTEM" 166 (CALLS1&PUSH 202) ; FIND-PACKAGE 168 (CALLS1&PUSH 210) ; INTERN 170 (LOAD&PUSH 0) 171 (CALLS1&JMPIF 79 L181) ; FBOUNDP 174 (LOAD&PUSH 0) 175 (LOAD&PUSH 2) 176 (COPY-CLOSURE&PUSH 29 1) ; #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR-4> 179 (CALLS2 128) ; SYSTEM::%PUTD 181 L181 181 (CONST&PUSH 3) ; OR 182 (LOADC&PUSH 2 0) 185 (JMPIFEQTO 30 L132) ; 1 188 (NIL) 189 L189 189 (PUSH) 190 (CONST&PUSH 11) ; STRING 191 (LOADC&PUSH 4 0) 194 (LIST&PUSH 2) 196 (CONST&PUSH 32) ; AND 198 (CONST&PUSH 33) ; SYMBOL 200 (CONST&PUSH 34) ; SATISFIES 202 (LOAD&PUSH 6) 203 (LIST&PUSH 2) 205 (LIST&PUSH 3) 207 (LIST&PUSH 2) 209 (CALLSR 2 35) ; APPEND 212 (CONS) 213 (SKIP&RET 6) 215 L215 215 (LOAD&CAR&PUSH 0) 217 (LOAD&PUSH 0) 218 (JMPIFEQTO 11 L74) ; STRING 222 (LOAD 1) 223 (SKIP&RET 4) 225 L225 225 (LOAD 0) 226 (JMPIFCONSP L215) 228 (CONST&PUSH 35) ; DESIGNATOR 230 (LOAD&PUSH 1) 231 (CALL2 36) ; TYPESPEC-ERROR 233 (SKIP&RET 3) #<COMPILED-CLOSURE #:DEFTYPE-DESIGNATOR> [5]> As you can see, the second function coincides with the macroexpansion (FUNCTION #:DEFTYPE-DESIGNATOR (LAMBDA (SYSTEM::<DEFTYPE-FORM>) (IF (/= (LENGTH SYSTEM::<DEFTYPE-FORM>) 2) (SYSTEM::TYPE-CALL-ERROR SYSTEM::<DEFTYPE-FORM>) (LET* ((THING (CADR SYSTEM::<DEFTYPE-FORM>))) (BLOCK DESIGNATOR (COND ((SYMBOLP THING) ... whereas the first one (yours) looks more like (FUNCTION #:DEFTYPE-DESIGNATOR (LAMBDA (SYSTEM::<DEFTYPE-FORM>) (AND (/= (LENGTH SYSTEM::<DEFTYPE-FORM>) 2) (PROGN (SYSTEM::TYPE-CALL-ERROR SYSTEM::<DEFTYPE-FORM>) (LET* ((THING (CADR SYSTEM::<DEFTYPE-FORM>))) (BLOCK DESIGNATOR (COND ((SYMBOLP THING) ... which is completely nonsensical. Bruno |
From: Sam S. <sd...@gn...> - 2001-02-28 00:50:40
|
> * In message <150...@ho...> > * On the subject of "Re: destructuring in DEFMACRO lambda-lists" > * Sent on Tue, 27 Feb 2001 19:47:44 +0100 (CET) > * Honorable Bruno Haible <ha...@il...> writes: > > > OTOH, it should certainly be fixed. I will look at it... > Thanks. done. only I get this diff: $ diff defs2.fas stage/defs2.fas 296,299c296,299 < #245Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 90 01 2F 28 9E 5C 78 AC < 8F 03 80 D1 AC 24 02 21 AC 25 09 2F DD E3 2E 04 59 1D 07 DF E0 E1 < 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 AD 2F 01 19 02 DD DC 2E < 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 61 15 19 02 00 2B 01 9F --- > #247Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 33 01 2F 1F 80 E1 AD 2F > 01 9E 5C 78 AC 8F 03 80 CC AC 24 02 1C AC 25 09 2A DD E3 2E 04 59 > 1D 07 DF E0 E1 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 DD DC 2E > 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 66 15 19 02 00 2B 01 9F 307c307 < 24 19 03) --- > 24 19 03 19 02) why? (no, I will not commit anything until `make tests' is clean). > > PS. Bruno, why `destructuring-bind' in defs2.lisp uses > > `<DESTRUCTURING-FORM>' instead of a gensym? > > So that people who look at macroexpansions (like me) understand the > macro expansion more easily. (gensym "DESTRUCTURING-FORM-") is just as informative and does not clutter the symbol table. It is also unique for each defmacro, which might be good for all of use who debug `defmacro' with `macroexpand' (is there any other way do debug `defmacro'?) > > wouldn't this pose a problem for MT? > > No, these variables are bound lexically. There is no 'declare (special' > on them. do all those %let-list &c pose this problem? they _are_ special... what if I surround the functions which use them with one big `let'? > > same for `<macro-form>' and `<deftype-form>'... > > do you mind if I change that? > > Yes. It's not broken, why change it? to placate my aesthetic feeling :-) I hate to see these unbound symbols in the `apropos' output. At any rate, the patch is ready and tested. Are you sure you are absolutely opposed to removing these symbols? [possible answers: <no> <not really> <oh well, go ahead> :-] -- Sam Steingold (http://www.podval.org/~sds) Support Israel's right to defend herself! <http://www.i-charity.com/go/israel> Read what the Arab leaders say to their people on <http://www.memri.org/> MS Windows vs IBM OS/2: Why marketing matters more than technology... |
From: Sam S. <sd...@gn...> - 2001-02-28 17:34:04
|
> * In message <150...@ho...> > * On the subject of "Re: destructuring in DEFMACRO lambda-lists" > * Sent on Wed, 28 Feb 2001 14:24:07 +0100 (CET) > * Honorable Bruno Haible <ha...@il...> writes: > > Sam writes: > > > > > OTOH, it should certainly be fixed. I will look at it... > > > Thanks. > > done. > > Show your patch. I've made a patch as well - it was quite easy. Index: defmacro.lisp =================================================================== RCS file: /cvsroot/clisp/clisp/src/defmacro.lisp,v retrieving revision 1.4 diff -u -w -b -r1.4 defmacro.lisp --- defmacro.lisp 2000/10/23 12:57:22 1.4 +++ defmacro.lisp 2001/02/27 23:35:19 @@ -281,15 +281,17 @@ (ENGLISH "The lambda list of macro ~S is missing a variable after &REST/&BODY.") name ) ) - (unless (symbolp (car lambdalistr)) - (error-of-type 'source-program-error - (ENGLISH "The lambda list of macro ~S contains an illegal variable after &REST/&BODY: ~S") - name (car lambdalistr) - ) ) (let ((restvar (car lambdalistr)) (listr (cdr lambdalistr))) + (unless (or (symbolp restvar) (consp restvar)) + (error-of-type 'source-program-error + (ENGLISH "The lambda list of macro ~S contains an illegal variable after &REST/&BODY: ~S") + name (car lambdalistr))) (setq %restp t) - (setq %let-list (cons `(,restvar ,restexp) %let-list)) + (if (symbolp restvar) + (setq %let-list (cons (list restvar restexp) %let-list)) + (let ((%min-args 0) (%arg-count 0) (%restp nil)) + (analyze1 (list restvar) restexp name lambdalistr))) (cond ((null listr)) ((atom listr) (cerror (ENGLISH "The rest of the lambda list will be ignored.") > > why? (no, I will not commit anything until `make tests' is clean). > This means that your patch changed the expansion of an existing > defmacro form. hmm - it shouldn't! > > > > PS. Bruno, why `destructuring-bind' in defs2.lisp uses > > > > `<DESTRUCTURING-FORM>' instead of a gensym? > > > > > > So that people who look at macroexpansions (like me) understand the > > > macro expansion more easily. > > > > (gensym "DESTRUCTURING-FORM-") is just as informative and does not > > clutter the symbol table. > > It creates multiple symbols in memory where a single symbol suffices. aren't these symbols GCed?! also, you did not reply re: %let-list &co! > > It is also unique for each defmacro, which might be good for all of us > > who debug `defmacro' with `macroexpand' > On the contrary, these gensyms make debugging harder. why?! how is "#:MACRO-FORM-123" worse than "SYSTEM::<MACRO-FORM>"? > Show the patch. Mine is below. it's interesting that both of us are ready to hack lisp and prefer to avoid messing with pathname.d ;-) > *** clisp/src/defmacro.lisp.bak Sun Jun 11 08:38:48 2000 > --- clisp/src/defmacro.lisp Wed Feb 28 01:52:01 2001 > *************** > *** 281,295 **** > (ENGLISH "The lambda list of macro ~S is missing a variable after &REST/&BODY.") > name > ) ) > - (unless (symbolp (car lambdalistr)) > - (error-of-type 'source-program-error > - (ENGLISH "The lambda list of macro ~S contains an illegal variable after &REST/&BODY: ~S") > - name (car lambdalistr) > - ) ) > (let ((restvar (car lambdalistr)) > (listr (cdr lambdalistr))) > (setq %restp t) > ! (setq %let-list (cons `(,restvar ,restexp) %let-list)) > (cond ((null listr)) > ((atom listr) > (cerror (ENGLISH "The rest of the lambda list will be ignored.") > --- 281,301 ---- > (ENGLISH "The lambda list of macro ~S is missing a variable after &REST/&BODY.") > name > ) ) > (let ((restvar (car lambdalistr)) > (listr (cdr lambdalistr))) > (setq %restp t) > ! (cond ((symbolp restvar) > ! (setq %let-list (cons `(,restvar ,restexp) %let-list)) > ! ) > ! ((atom restvar) > ! (error-of-type 'source-program-error > ! (ENGLISH "The lambda list of macro ~S contains an illegal variable after &REST/&BODY: ~S") > ! name restvar > ! )) > ! (t > ! (let ((%min-args 0) (%arg-count 0) (%restp nil)) > ! (analyze1 restvar restexp name restexp) ^^^^^^^ this is an error. try your patch with Eric's example and you will see that. mine is correct. > ! ) )) > (cond ((null listr)) > ((atom listr) > (cerror (ENGLISH "The rest of the lambda list will be ignored.") -- Sam Steingold (http://www.podval.org/~sds) Support Israel's right to defend herself! <http://www.i-charity.com/go/israel> Read what the Arab leaders say to their people on <http://www.memri.org/> I want Tamagochi! -- What for? Your pet hamster is still alive! |
From: Sam S. <sd...@gn...> - 2001-02-28 21:19:12
|
> * In message <150...@ho...> > * On the subject of "Re: destructuring in DEFMACRO lambda-lists" > * Sent on Wed, 28 Feb 2001 19:44:47 +0100 (CET) > * Honorable Bruno Haible <ha...@il...> writes: > > > > > (gensym "DESTRUCTURING-FORM-") is just as informative and does not > > > > clutter the symbol table. > > > It creates multiple symbols in memory where a single symbol suffices. > > aren't these symbols GCed?! > In interpreted code (defun without compile-file), these symbols are > part of the function's definition and not GCed. this should not be a problem since the production code is always compiled. > > > > It is also unique for each defmacro, which might be good for all of us > > > > who debug `defmacro' with `macroexpand' > > > On the contrary, these gensyms make debugging harder. > > why?! how is "#:MACRO-FORM-123" worse than "SYSTEM::<MACRO-FORM>"? > > When you step through the code and wish to eval this symbol, how do > you do it when it's a gensym? yes, this _is_ a problem. how often do you do (step (macroexpand ))? > Also, when debugging, one needs to compare different > macroexpansions. This is easier without gensyms. why have gensyms been introduced then? how is (defmacro sqr (x) `(let ((x ,x)) (* x x))) worse than (defmacro sqr (x) (let ((v (gensym "SQR-"))) `(let ((,v ,x)) (* ,v ,v)))) I guess this is important only when the same macro is nested, e.g., (with-open-file () (with-open-file ())) so you are gambling that defmacro is never nested, right? > > > ! (analyze1 restvar restexp name restexp) > > ^^^^^^^ > > this is an error. try your patch with Eric's example and you will see > > that. mine is correct. > > Here are the results. Mine: (defmacro with-pg-connection ((con &rest open-args) &body (forms decls)) `(let ((,con (pg-connect ,@open-args))) ,@decls (unwind-protect (progn ,@forms) (when ,con (pg-disconnect ,con))))) bruno: (macroexpand '(with-pg-connection (c o o1 o2) (f1 f2 f3) (d1 d2 d3))) (LET ((C (PG-CONNECT O O1 O2))) D1 D2 D3 (UNWIND-PROTECT (PROGN F1 F2 F3) (WHEN C (PG-DISCONNECT C)))) > Yours: sds: (macroexpand '(with-pg-connection (c o o1 o2) ((f1 f2 f3) (d1 d2 d3)))) (LET ((C (PG-CONNECT O O1 O2))) D1 D2 D3 (UNWIND-PROTECT (PROGN F1 F2 F3) (WHEN C (PG-DISCONNECT C)))) so we differ in interpreting the meaning of the spec. since ACL concurs with you and neither CMUCL nor CCL implement this, I would guess that your interpretation is correct. BTW, your patch fails the checks the same way as mine: $ diff defs2.fas stage/defs2.fas 295,298c295,298 < #247Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 33 01 2F 1F 80 E1 AD 2F < 01 9E 5C 78 AC 8F 03 80 CC AC 24 02 1C AC 25 09 2A DD E3 2E 04 59 < 1D 07 DF E0 E1 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 DD DC 2E < 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 66 15 19 02 00 2B 01 9F --- > #245Y(01 00 01 00 01 00 00 00 00 02 AD 72 45 DA 90 01 2F 28 9E 5C 78 AC > 8F 03 80 D1 AC 24 02 21 AC 25 09 2F DD E3 2E 04 59 1D 07 DF E0 E1 > 7B 03 61 01 14 CF 14 33 02 23 62 02 19 03 AD 2F 01 19 02 DD DC 2E > 04 59 1D 07 DF E0 E1 7B 03 61 01 14 CD 1B 61 15 19 02 00 2B 01 9F 306c306 < 24 19 03 19 02) --- > 24 19 03) -- Sam Steingold (http://www.podval.org/~sds) Support Israel's right to defend herself! <http://www.i-charity.com/go/israel> Read what the Arab leaders say to their people on <http://www.memri.org/> XFM: Exit file manager? [Continue] [Cancel] [Abort] |
From: Sam S. <sd...@gn...> - 2001-03-01 23:28:53
|
> * In message <150...@ho...> > * On the subject of "Re: destructuring in DEFMACRO lambda-lists" > * Sent on Thu, 1 Mar 2001 21:20:53 +0100 (CET) > * Honorable Bruno Haible <ha...@il...> writes: > > Sam writes: > > > how often do you do (step (macroexpand ))? > Every time I use step. The stepper always steps through the > macroexpansions. (step (with-open-file (f "/etc/passwd") (loop for x = (read-line f nil nil) while x do (princ x)))) this never prints the <MACRO-FORM> symbol even though both `with-open-file' and `loop' are defmacro. so, to see these symbols, you actually have to do either (step (macroexpand ...)) or (step (defmacro ...)) right? sorry about being so obtuse... > > so you are gambling that defmacro is never nested, right? > Yes, that's also an important consideration. so, are nested `defmacro' statements allowed? > > BTW, your patch fails the checks the same way as mine: a fresh rebuild fixed this. sorry. -- Sam Steingold (http://www.podval.org/~sds) Support Israel's right to defend herself! <http://www.i-charity.com/go/israel> Read what the Arab leaders say to their people on <http://www.memri.org/> Beauty is only a light switch away. |
From: Bruno H. <ha...@il...> - 2001-03-02 13:01:06
|
Sam writes: > (step (with-open-file (f "/etc/passwd") (loop for x = (read-line f nil nil) while x do (princ x)))) > > this never prints the <MACRO-FORM> symbol even though both > `with-open-file' and `loop' are defmacro. OK, on this one you're right. Our 'step' is more intelligent than I thought. But the point applies here as well: In the LOOP expansion we have (GO SYSTEM::BEGIN-LOOP) and not (GO #:BEGIN-LOOP-268) So that during debugging you can GO to that label if you want. Gensyms where necessary. Interned symbols otherwise. > > > so you are gambling that defmacro is never nested, right? > > Yes, that's also an important consideration. > > so, are nested `defmacro' statements allowed? I think so, yes. Although it doesn't make sense. Bruno |