<div dir="ltr"><div>Thanks.</div><div><br></div><div>My brain was not working AND I did not do the necessary RTFM of SICP.  The</div><div><br></div><div style="margin-left:40px"><span style="font-family:monospace">(let ((somestuff nil))</span></div><div style="margin-left:40px"><span style="font-family:monospace">   (setf somestuff (something-with-somestuff-closed-over-and-delayed)))</span></div><div><br></div><div>works of course.</div><div><br></div><div>The rest is easy macrology.</div><div><br></div><div>All the best</div><div><br></div><div>Marco<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Dec 14, 2021 at 6:44 AM Vibhu Mohindra <<a href="mailto:vibhu.mohindra@gmail.com">vibhu.mohindra@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Marco,<br>
<br>
The last function below is the Common Lisp equivalent. The function<br>
before that contains the essence of it. Because cons-stream's second arg<br>
is evaluated only much later, by the time it is evaluated the setf has<br>
completed and int has been fully installed. (SICP section 4.1.6 shows<br>
that Scheme's inner defines are really just syntactic sugar for the same<br>
kind of thing.)<br>
<br>
<br>
;SICP doesn't delay cars<br>
(defstruct my-stream<br>
  delayed-car delayed-cdr)<br>
<br>
(defvar *to-init* (gensym))<br>
<br>
;SICP's memo-proc approach avoids creating memo symbols<br>
(defmacro delay (x)<br>
  (let ((memo (gensym)))<br>
    `(let ((,memo *to-init*))<br>
       #'(lambda ()<br>
           (cond ((eql ,memo *to-init*) (setf ,memo ,x))<br>
                 (t ,memo))))))<br>
(defun force (delayed-val)<br>
  (funcall delayed-val))<br>
<br>
(defmacro cons-stream (x y)<br>
  `(make-my-stream :delayed-car (delay ,x) :delayed-cdr (delay ,y)))<br>
<br>
(defvar *stream-nil* (gensym))<br>
<br>
(defun stream-car (s) (force (my-stream-delayed-car s)))<br>
(defun stream-cdr (s) (force (my-stream-delayed-cdr s)))<br>
(defun stream-null (s) (eql s *stream-nil*))<br>
<br>
(defun example1 (x)<br>
  (let ((int nil))<br>
    (setf int (cons-stream x int))))<br>
; (stream-car (stream-cdr (stream-cdr (rec-stream 'a))))<br>
; -> A<br>
<br>
; omitting defs of add-streams scale-stream<br>
(defun integral (integrand initial-value dt)<br>
  (let ((int nil))<br>
    (setf int (cons-stream initial-value<br>
                           (add-streams (scale-stream integrand dt)<br>
                                        int)))))<br>
<br>
<br>
-- <br>
Vibhu<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr">Marco Antoniotti, Professor                           tel. +39 - 02 64 48 79 01<br>DISCo, Università Milano Bicocca U14 2043   <a href="http://dcb.disco.unimib.it" target="_blank">http://dcb.disco.unimib.it</a><br>Viale Sarca 336<br>I-20126 Milan (MI) ITALY</div></div>