From: Bradley R. <bra...@gm...> - 2006-10-27 12:03:08
|
On Fri, 27 Oct 2006 09:07:13 +0200 "Tomas Zellerin" <zel...@gm...> wrote: > The expansion > (macroexpand-1 '(loop for i from 0 to 10 for vars on vars do (print > vars))) shows the reason. > > (MACROLET ((LOOP-FINISH NIL (SYSTEM::LOOP-FINISH-ERROR))) > (BLOCK NIL > (LET ((I 0)) > (PROGN > (LET ((VARS NIL)) ; <-------- here > (LET NIL > (LET NIL > (MACROLET ((LOOP-FINISH NIL '(GO SYSTEM::END-LOOP))) > (TAGBODY (SETQ VARS VARS) SYSTEM::BEGIN-LOOP > (WHEN (> I 10) (LOOP-FINISH)) (WHEN (ATOM VARS) > (LOOP-FINISH)) (PROGN (PROGN (PRINT VARS))) (PSETQ I (+ I 1)) (PSETQ > VARS (CDR VARS)) (GO SYSTEM::BEGIN-LOOP) SYSTEM::END-LOOP > (MACROLET > ((LOOP-FINISH NIL (SYSTEM::LOOP-FINISH-WARN) > '(GO SYSTEM::END-LOOP))))))))))))) > It doesn't seem to me that that line is necessarily the problem, although I am not a clisp guru. In clisp 2.39... [1]> (setf vars '(1 2 3 4)) (1 2 3 4) [2]> (setf vars1 '(1 2 3 4)) (1 2 3 4) [3]> (loop for i from 0 to 10 for vars on vars1 do (print vars)) (1 2 3 4) (2 3 4) (3 4) (4) NIL [4]> (macroexpand-1 '(loop for i from 0 to 10 for vars on vars1 do (print vars))) (MACROLET ((LOOP-FINISH NIL (SYSTEM::LOOP-FINISH-ERROR))) (BLOCK NIL (LET ((I 0)) (PROGN (LET ((VARS NIL)) (LET NIL (LET NIL (MACROLET ((LOOP-FINISH NIL '(GO SYSTEM::END-LOOP))) (TAGBODY (SETQ VARS VARS1) SYSTEM::BEGIN-LOOP (WHEN (> I 10) (LOOP-FINISH)) (WHEN (ATOM VARS) (LOOP-FINISH)) (PROGN (PROGN (PRINT VARS))) (PSETQ I (+ I 1)) (PSETQ VARS (CDR VARS)) (GO SYSTEM::BEGIN-LOOP) SYSTEM::END-LOOP (MACROLET ((LOOP-FINISH NIL (SYSTEM::LOOP-FINISH-WARN) '(GO SYSTEM::END-LOOP))))))))))))) ; T Has the same (LET ((VARS NIL)) line but works. Perhaps it is using the wrong VARS in the (SETQ VARS VARS) segment? |