From: Bruno H. <br...@cl...> - 2005-01-13 18:28:55
|
Sam wrote: > (LET ((X 5)) (LET ((X (1+ X))) (DECLARE (SPECIAL X)) X)) > EVAL: variable X has no value > > ERROR!! ERROR should be 6 ! > (LET ((X 5)) (LET* ((X (1+ X))) (DECLARE (SPECIAL X)) X)) > EVAL: variable X has no value > > ERROR!! ERROR should be 6 ! > (LET ((X 5)) (MULTIPLE-VALUE-BIND (X) (1+ X) (DECLARE (SPECIAL X)) X)) > EVAL: variable X has no value > > ERROR!! ERROR should be 6 ! > (LET ((X 5)) ((LAMBDA (X) (DECLARE (SPECIAL X)) X) (1+ X))) > EQL-OK: 6 Good. So the bug is really only with SPECIAL bindings, and affects all of LET, LET*, MULTIPLE-VALUE-BIND, but not LAMBDA. Which means, the bug is in make_variable_frame, and the code which does it right is in funcall_iclosure. One more test case (after reading CLHS 3.3.4): (LET ((X 5)) (PROGV '(X) '(20) (LET* ((X (1+ X)) (Z (1+ X))) (DECLARE (SPECIAL X)) Z))) => 7 (LET ((X 5)) (PROGV '(X) '(20) (LET* ((Y (1+ X)) (Z (1+ X))) (DECLARE (SPECIAL X)) Z))) => 21 OK, now how to fix make_variable_frame? Bruno |