Hello,

I am curently translating the logic circuit simulator code from SICP
into Common Lisp and have run into a snag that I would like to ask
about.

The Scheme code is as follows from section 3.3.4 (page 223 of my
hardcover edition):

(define (and-gate a1 a2 output)
    (define (and-action-procedure)
        (let ((new-value
               (locical-and (get-signal a1) (get-signal a2))))
           (after-delay and-gat-delay
                        (lambda ()
                                (set-signal! output new-value)))))
     (add-action! a1 and-action-procedure)
     (add-action! a2 and-action-procedure))

The code basically binds the local function and-action-procedure into
a list of functions in a1 and a2 which are then called by another
routine later to perform the action when a value is set on the wire.

My translated Common Lisp code is:

(defun make-and-gate (a1 a2 output)
  (flet ((logical-and (a b)
           (if (= a 1) b a))
         (and-action-proc ()
           (let ((new-value (logical-and (get-signal a1) (get-signal a2))))
             (set-signal output new-value))))
    (add-action a1 #'and-action-proc)
    (add-action a2 #'and-action-proc)))

The problem is that the bindings of a1 and a2 in and-action-proc are
not being bound to the values of the calling function in the Common
Lisp version.  This causes the calling of and-action-proc to fail
because a1 and a2 are not bound and I am assuming being treated as
dynamic (special) variables.  I have also tried to define
and-action-proc using labels with no difference in results.

Is this a total schemantic difference between CL and Scheme?  Is every
function in Scheme a closure where free variables of sub-functions
bound to the calling functions environment?  If so, is there a way to
emulate this in Common Lisp?

I would also like to note that I am currently trying out writing this
code using LispWorks Personal Edition, rather than my usual SBCL
environment, if that would make any difference.

--
Burton Samograd

_______________________________________________
pro mailing list
pro@common-lisp.net
http://lists.common-lisp.net/cgi-bin/mailman/listinfo/pro

Reply via email to