[pro] Sub-function free variable binding differences between Scheme and CL

Stas Boukarev stassats at gmail.com
Mon Mar 5 13:23:20 UTC 2012


Burton Samograd <burton.samograd at gmail.com> writes:

> 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)))
You should use LABELS instead of FLET, FLET doesn't make its definitions
available inside definitions so the call logical-and in and-action-proc
can't find logical-and.

And seriously, writing to the _pro_ mailing list to ask trivial questions?

-- 
With best regards, Stas.




More information about the pro mailing list