From: Raymond T. <rt...@us...> - 2005-12-06 15:35:17
|
Update of /cvsroot/maxima/maxima/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21611/src Modified Files: transl.lisp Log Message: o When translating a top-level assignment (msetq), we want to use defparameter instead of setq because setq at top-level isn't well-defined in ANSI CL, unless the variable is already special. - Add the global *MACEXPR-TOP-LEVEL-FORM-P* to tell if we're doing a top-level form. - Modify TRANSLATE-MACEXPR-TOPLEVEL to check for msetq and handle that specially. - Modify the DEF%TR for MSETQ to check *MACEXPR-TOP-LEVEL-FORM-P* and generate defparameter or setq as appropriate. o In MAKE-DECLARES, if a local variable was declared special, make sure we declare special. Previously, local variables that were declared special were not, and this causes the translation of trgsmp.mac not to work, because the specialness was important. (This probably needs more work.) Index: transl.lisp =================================================================== RCS file: /cvsroot/maxima/maxima/src/transl.lisp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- transl.lisp 5 Dec 2005 15:30:29 -0000 1.15 +++ transl.lisp 6 Dec 2005 15:35:06 -0000 1.16 @@ -624,11 +624,18 @@ "Badly formed `bind_during_translation' binding~%~:M" p)))))))) +;; This basically tells the msetq def%tr to use defparameter insetad +;; of setq because we're doing a setq at top-level, which isn't +;; specified by ANSI CL. +(defvar *macexpr-top-level-form-p* nil) + (defmfun translate-macexpr-toplevel (form &aux (*transl-backtrace* nil) tr-abort) ;; there are very few top-level special cases, I don't ;; think it would help the code any to generalize TRANSLATE ;; to target levels. + ;; + ;; Except msetq at top-level is special for ANSI CL. See below. (setq form (toplevel-optimize form)) (cond ((atom form) nil) ((eq (caar form) '$bind_during_translation) @@ -690,7 +697,12 @@ ;; almost allways wants to. flatten. ;; note that this ignores the $%% crock. `(progn 'compile - ,@(mapcar #'translate-macexpr-toplevel (cdr form)))) + ,@(mapcar #'translate-macexpr-toplevel (cdr form)))) + ((eq 'msetq (caar form)) + ;; Toplevel msetq's should really be defparameter instead of + ;; setq for Common Lisp. + (let ((*macexpr-top-level-form-p* t)) + (dtranslate form))) (t (let ((t-form (dtranslate form))) (cond (tr-abort @@ -1152,9 +1164,14 @@ (defun make-declares (varlist localp &aux (dl) (fx) (fl) specs) (when $transcompile (do ((l varlist (cdr l)) - (mode) (var) - ) + (mode) (var)) ((null l)) + + ;; When a variable is declared special, be sure to declare it + ;; special here. + (when (and localp (get (car l) 'special)) + (push (car l) specs)) + (when (or (not localp) (not (get (car l) 'special))) ;; don't output local declarations on special variables. @@ -1477,7 +1494,10 @@ (let ((tn (tr-gensym))) (lambda-wrap1 tn val `(progn (,assign ',var ,tn) (setq ,(teval var) ,tn)))) - `(setq ,(teval var) ,val)))) + `(,(if *macexpr-top-level-form-p* + 'defparameter + 'setq) + ,(teval var) ,val)))) ((memq 'array (car var)) (tr-arraysetq var val)) (t |