[movitz-devel] bug report

Alessio Stalla axcd at libero.it
Wed Aug 18 12:30:26 UTC 2004


I forgot to mention that I think I have discovered two bugs in movitz:

1) the way setq is implemented in muerte, it always assigns values to special variables, so that e.g.

       (let ((x 5)) (setq x 6))

doesn't do what one might expect. If I've understood correctly how the thing works, the function eval-setq in muerte/eval.lisp should be corrected in:

(defun eval-setq (form env)
  (do* ((p (cdr form) (cddr p))
        (value nil))
      ((null p) value)
    (assert (cdr p) (form)
      "Odd number of arguments to setq: ~W" form)
    (setf value
      (let ((local-var (find (car p) env :key #'car))
	    (form-value (eval-form (cadr p) env)))
        (if local-var
         (setf (cdr local-var) form-value)
         (set (car p) form-value))))))

A similar correction should be applied to eval-setf.

2) This is probably harder to notice: under certain conditions, labels and flet do not properly capture bindings: I was trying to movitz-compile this defun

(defun my-test-labels (x)
  (labels ((p () (print x))
           (q (y) (list x y)))
        (p)))

but it gave me this error:

The slot MOVITZ::REFERENCE-SLOT is unbound in the object
#<MOVITZ::BORROWED-BINDING name: X {4913F8FD}>

after tinkering a while with this piece of code I found that the bug is probably caused by q being defined but not called/used in some way, in fact if I remove its definition or call it inside the labels it compiles without problems. Now this may not be a real bug because actually defining a function without using it hasn't much sense, nevertheless people should know of its existence because it made me waste a lot of time trying to figure out what caused it :(

Alessio





More information about the movitz-devel mailing list