learning-sicp

My embarrassing half assed SICP run.
git clone https://kaka.farm/~git/learning-sicp
Log | Files | Refs

commit e9543f0a64fc7a19c0eed2bfa694859c8b15d621
parent 869768c4e289d155611bbebf96daabf5d2aa5cc5
Author: Yuval Langer <yuval.langer@gmail.com>
Date:   Thu, 25 Jul 2024 14:05:38 +0300

Use a tagged box to hold the var-val alist of each frame.

Diffstat:
Msicp/solutions/chapter-4/exercise-11.scm | 22++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/sicp/solutions/chapter-4/exercise-11.scm b/sicp/solutions/chapter-4/exercise-11.scm @@ -352,17 +352,21 @@ (define (make-frame variables values) (let loop ((variables variables) (values values) - (frame '())) + (frame '(frame))) (match (list variables values) - ('(() ()) frame) + ('(() ()) (reverse frame)) (((variable rest-of-variables ...) (value rest-of-values ...)) (loop rest-of-variables rest-of-values (alist-cons variable value frame)))))) - (define (frame-variables frame) (map car frame)) - (define (frame-values frame) (map cdr frame)) + (define (frame-variables frame) (map car (cdr frame))) + (define (frame-values frame) (map cdr (cdr frame))) + (define (add-binding-to-frame! var val frame) + (set-cdr! frame (alist-cons var + val + (cdr frame)))) (define (extend-environment vars vals base-env) (if (= (length vars) (length vals)) @@ -439,13 +443,11 @@ frame to VAL." ;; don't remember. Maybe it is some sort of a joke?) only ;; the first frame. (let ((frame (first-frame env))) - (dpp `(define-variable! ,frame)) - (match (assoc var frame eq?) + (match (assoc var (cdr frame) eq?) (#f - (set-car! env - (alist-cons var - val - frame))) + (add-binding-to-frame! var + val + frame)) (pair (set-cdr! pair val)))))