diff --git a/.gitignore b/.gitignore index a1f33d6..f223cee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ compiled -doc \ No newline at end of file +doc +*.bak +*.css +*.js +*.html diff --git a/sicp-doc/sicp.scrbl b/sicp-doc/sicp.scrbl index 61cba28..79eb4bf 100644 --- a/sicp-doc/sicp.scrbl +++ b/sicp-doc/sicp.scrbl @@ -3,7 +3,7 @@ @(require scribble/manual scribble/eval (for-label (except-in sicp #%app #%datum #%top true false identity error) (only-in racket require true false identity error - natural-number/c any/c))) + natural-number/c any/c any namespace?))) @title{SICP Language} @defmodule[sicp #:lang] @@ -67,4 +67,12 @@ then use @racket[#%require]. The amb operator. } +@defproc[(apply-in-underlying-scheme [proc procedure?] [args list?]) any]{ + An alias for @racket[(apply proc args)]. +} + +@defthing[user-initial-environment namespace?]{ + The current namespace. +} + Additionally, @racket[true], @racket[false], @racket[identity], and @racket[error] are provided from Racket. diff --git a/sicp/main.rkt b/sicp/main.rkt index 5548679..c3a441f 100644 --- a/sicp/main.rkt +++ b/sicp/main.rkt @@ -2,11 +2,12 @@ (require racket/provide (prefix-in r5rs: r5rs) - (rename-in racket [random racket:random])) + (only-in racket [random racket:random])) (provide (filtered-out (λ (name) (regexp-replace #px"^r5rs:" name "")) - (except-out (all-from-out r5rs) r5rs:#%module-begin)) - (rename-out [module-begin #%module-begin])) + (except-out (all-from-out r5rs) r5rs:#%module-begin r5rs:set!)) + (rename-out [module-begin #%module-begin] + [amb-set! set!])) (define-syntax (define+provide stx) (syntax-case stx () @@ -38,10 +39,12 @@ (syntax-rules () [(_ A B) (r5rs:cons A (r5rs:delay B))])) +(define+provide apply-in-underlying-scheme r5rs:apply) (provide amb) -(define (amb-fail) (error "amb tree exhausted")) +(define (base-amb-fail) (error "amb tree exhausted")) +(define amb-fail base-amb-fail) (define (set-amb-fail! x) (set! amb-fail x)) (define-syntax-rule (explore +prev-amb-fail +sk alt) @@ -60,6 +63,21 @@ (explore +prev-amb-fail +sk alt) ... (+prev-amb-fail))))) +(define-syntax-rule (amb-set! var val) + (if (eq? amb-fail base-amb-fail) + (r5rs:set! var val) + (let ([+prev-amb-fail amb-fail] + [old-value var]) + (set-amb-fail! + (thunk + (r5rs:set! var old-value) + (+prev-amb-fail))) + (r5rs:set! var val)))) + +(define+provide user-initial-environment #f) +(define (set-user-initial-environment! namespace) + (set! user-initial-environment namespace)) + (define-syntax module-begin (syntax-rules () ((_ . forms) @@ -68,4 +86,6 @@ (print-as-expression #f) (print-pair-curly-braces #t) (print-mpair-curly-braces #f)) + (define-namespace-anchor tmp) + (set-user-initial-environment! (namespace-anchor->namespace tmp)) . forms))))