You are looking at historical revision 39572 of this page. It may differ significantly from its current revision.
Outdated egg!
This is an egg for CHICKEN 4, the unsupported old release. You're almost certainly looking for the CHICKEN 5 version of this egg, if it exists.
If it does not exist, there may be equivalent functionality provided by another egg; have a look at the egg index. Otherwise, please consider porting this egg to the current version of CHICKEN.
sicp
Support for SICP
- Outdated egg!
- sicp
- SICP
- sicp-constraints
- sicp-concurrency
- sicp-streams
- sicp-streams
- stream-null
- the-empty-stream
- stream-null?
- cons-stream
- stream-ref
- stream-map
- stream-for-each
- display-stream
- stream-car
- stream-cdr
- stream-enumerate-interval
- stream-filter
- stream->list
- scale-stream
- euler-transform
- make-tableau
- accelerated-sequence
- integers-starting-from
- integers
- interleave
- pairs
- merge
- list->stream
- sicp-eval
- sicp-eval-anal
- sicp-eval-lazy
- sicp-eval-amb
- About this egg
SICP
sicp
[module] sicp
SICP is a grab-bag of different procedures from sections 1 through 3.3.4, before we started modularizing them (starting from 3.3.5: Constraints).
- =number?
- accumulate
- add
- add-action!
- add-to-agenda!
- add-vect
- addend
- adjoin-set
- after-delay
- and-gate
- and-gate-delay
- angle
- apply-generic
- attach-tag
- augend
- average
- below
- beside
- call-each
- choose-branch
- contents
- corner-split
- dec
- decode
- default-timeout
- delete-queue!
- deriv
- dispatch-table
- div
- draw-painter-as-svg
- edge1-frame
- edge2-frame
- element-of-set?
- empty-queue?
- encode
- encode-symbol
- end-segment
- enumerate-interval
- epsilon
- fast-prime?
- first-agenda-item
- flatmap
- flip-horiz
- flip-vert
- frame-coord-map
- front-ptr
- front-queue
- full-adder
- get
- get-signal
- half-adder
- huffman-adjoin-set
- image->painter
- image-frame
- image-height
- image-width
- imag-part
- inc
- insert-queue!
- install-complex-package
- install-polar-package
- install-rational-package
- install-rectangular-package
- install-scheme-number-package
- intersection-set
- inverter
- inverter-delay
- good-enough?
- leaf?
- left-branch
- logical-not
- magnitude
- make-agenda
- make-code-tree
- make-complex-from-mag-ang
- make-complex-from-real-imag
- make-from-mag-ang
- make-from-real-imag
- make-frame
- make-leaf
- make-leaf-set
- make-product
- make-queue
- make-rational
- make-scheme-number
- make-sum
- make-segment
- make-vect
- make-wire
- mul
- multiplicand
- multiplier
- nil
- or-gate
- or-gate-delay
- origin-frame
- outline
- prime?
- probe
- product?
- propagate
- put
- real-part
- rear-ptr
- remove-first-agenda-item!
- right-branch
- right-split
- rotate90
- rotate180
- rotate270
- same-variable?
- scale-vect
- segments->painter
- set-front-ptr!
- set-rear-ptr!
- set-signal!
- shrink-to-upper-right
- square
- square-limit
- start-segment
- sub
- sub-vect
- sum?
- symbol-leaf
- symbols
- terminates?
- the-agenda
- time+values
- timeout-value?
- transform-painter
- type-tag
- up-split
- variable?
- weight
- weight-leaf
- write-painter-to-svg
- write-painter-to-png
- xcor-vect
- xor
- ycor-vect
sicp-constraints
sicp-constraints
[module] sicp-constraints
Constraint satisfaction from section 3.3.5
- adder
- connect
- constant
- for-each-except
- forget-value!
- get-value
- has-value?
- set-value!
- inform-about-no-value
- inform-about-value
- make-connector
- multiplier
- probe
has-value?
[procedure] (has-value? connector) → booleanDoes this connector have a value?
- connector
- The connector to test
(define (has-value? connector) (connector 'has-value?))
get-value
[procedure] (get-value connector) → objectGets this connector's value.
- connector
- The connector to test
(define (get-value connector) (connector 'value))
set-value!
[procedure] (set-value! connector new-value informant) → unspecifiedSets this connector's value.
- connector
- The connector to set
(define (set-value! connector new-value informant)
((connector 'set-value!) new-value informant))
forget-value!
[procedure] (forget-value! connector retractor) → unspecifiedForgets this connector's value.
- connector
- The connector to forget
(define (forget-value! connector retractor) ((connector 'forget) retractor))
connect
[procedure] (connect connector new-constraint) → unspecifiedConnects a connector to a new constraint.
- connector
- The connector to connect
- new-constraint
- The constraint to add
(define (connect connector new-constraint)
((connector 'connect) new-constraint))
inform-about-value
[procedure] (inform-about-value constraint) → unspecifiedInforms the constraint about a new value
- constraint
- The constraint to inform
(define (inform-about-value constraint) (constraint 'I-have-a-value))
inform-about-no-value
[procedure] (inform-about-no-value constraint) → unspecifiedInforms the constraint about forgetting.
- constraint
- The consraint to inform
(define (inform-about-no-value constraint) (constraint 'I-lost-my-value))
adder
[procedure] (adder a1 a2 sum) → constraintA constraint that adds two numbers
- a1
- Addend
- a2
- Augend
- sum
- Sum
(define (adder a1 a2 sum)
(define (process-new-value)
(cond ((and (has-value? a1) (has-value? a2))
(set-value! sum (+ (get-value a1) (get-value a2)) me))
((and (has-value? a1) (has-value? sum))
(set-value! a2 (- (get-value sum) (get-value a1)) me))
((and (has-value? a2) (has-value? sum))
(set-value! a1 (- (get-value sum) (get-value a2)) me))))
(define (process-forget-value)
(forget-value! sum me)
(forget-value! a1 me)
(forget-value! a2 me)
(process-new-value))
(define (me request)
(case request
((I-have-a-value) (process-new-value))
((I-lost-my-value) (process-forget-value))
(else (error "Unknown request: ADDER" request))))
(connect a1 me)
(connect a2 me)
(connect sum me)
me)
multiplier
[procedure] (multiplier m1 m2 product) → constraintA constraint that multiplies two numbers
- a1
- Multiplier
- a2
- Multiplicand
- sum
- Product
(define (multiplier m1 m2 product)
(define (process-new-value)
(cond ((or (and (has-value? m1) (= (get-value m1) 0))
(and (has-value? m2) (= (get-value m2) 0)))
(set-value! product 0 me))
((and (has-value? m1) (has-value? m2))
(set-value! product (* (get-value m1) (get-value m2)) me))
((and (has-value? product) (has-value? m1))
(set-value! m2 (/ (get-value product) (get-value m1)) me))
((and (has-value? product) (has-value? m2))
(set-value! m1 (/ (get-value product) (get-value m2)) me))))
(define (process-forget-value)
(forget-value! product me)
(forget-value! m1 me)
(forget-value! m2 me)
(process-new-value))
(define (me request)
(case request
((I-have-a-value) (process-new-value))
((I-lost-my-value) (process-forget-value))
(else (error "Unknown request: MULTIPLIER" request))))
(connect m1 me)
(connect m2 me)
(connect product me)
me)
constant
[procedure] (constant value connector) → constraintA constant constraint
- value
- The value to constantly be
- connector
- The relevant connector
(define (constant value connector)
(define (me request) (error "Unknown request: CONSTANT" request))
(connect connector me)
(set-value! connector value me)
me)
probe
[procedure] (probe name connector) → constraintProbes a connector and informs upon value-change.
- name
- Name of the connector
- connector
- The connector to probe
(define (probe name connector)
(define (print-probe value) (format #t "Probe: ~a = ~a~%" name value))
(define (process-new-value) (print-probe (get-value connector)))
(define (process-forget-value) (print-probe "?"))
(define (me request)
(case request
((I-have-a-value) (process-new-value))
((I-lost-my-value) (process-forget-value))
(else (error "Unknown request: PROBE" request))))
(connect connector me)
me)
make-connector
[procedure] (make-connector) → connectorMakes a connector.
(define (make-connector)
(let ((value #f) (informant #f) (constraints '()))
(define (set-my-value newval setter)
(cond ((not (has-value? me))
(set! value newval)
(set! informant setter)
(for-each-except setter inform-about-value constraints))
((not (= value newval))
(error "Contradiction" (list value newval)))
(else 'ignored)))
(define (forget-my-value retractor)
(if (eq? retractor informant)
(begin
(set! informant #f)
(for-each-except retractor inform-about-no-value constraints))
'ignored))
(define (connect new-constraint)
(if (not (memq new-constraint constraints))
(set! constraints (cons new-constraint constraints)))
(if (has-value? me) (inform-about-value new-constraint))
'done)
(define (me request)
(case request
((has-value?) (and informant #t))
((value) value)
((set-value!) set-my-value)
((forget) forget-my-value)
((connect) connect)
(else (error "Unknown operation: CONNECTOR" request))))
me))
for-each-except
[procedure] (for-each-except exception procedure list) → unspecifiedApplies a procedure to every item in list except ones eq? to exception.
- exception
- An element not to apply procedure to
- procedure
- The procedure to apply
- list
- The list to iterate over
(define (for-each-except exception procedure list)
(define (loop items)
(cond ((null? items) 'done)
((eq? (car items) exception) (loop (cdr items)))
(else (procedure (car items)) (loop (cdr items)))))
(loop list))
sicp-concurrency
sicp-concurrency
[module] sicp-concurrency
Concurrency procedures from section 3.4
thunk->thread
[procedure] (thunk->thread thunk) → threadCreates a thread from thunk and start the thread.
- thunk
- The thunk to threadify
(define (thunk->thread thunk)
(let ((thread (make-thread thunk))) (thread-start! thread) thread))
parallel-execute
[procedure] (parallel-execute . thunks) → thunkExecutes thunks in parallel; returns a thunk which can be executed to terminate the threads.
- thunks
- The thunks to execute in parallel
(define (parallel-execute . thunks)
(let ((threads (map thunk->thread thunks)))
(lambda () (for-each thread-terminate! threads))))
with-mutex-locked
[procedure] (with-mutex-locked mutex thunk) → object[procedure] (with-mutex-locked mutex thunk conditional-variable) → object
Evaluates the thunk having locked the mutex, unlocking it thereafter.
- mutex
- The mutex to lock and unlock
- thunk
- The thunk to evaluate
- conditional-variable
- An optional conditional-variable to block on at unlock
(define with-mutex-locked
(case-lambda
((mutex thunk) (with-mutex-locked mutex thunk #f))
((mutex thunk conditional-variable)
(dynamic-wind
(lambda () (mutex-lock! mutex))
thunk
(lambda () (mutex-unlock! mutex conditional-variable))))))
make-serializer
[procedure] (make-serializer) → procedureCreates a serializer which returns serialized procedures in a common set; returns a procedure taking f, the procedure to serialize.
(define (make-serializer)
(let ((mutex (make-mutex)))
(lambda (f)
(lambda args (with-mutex-locked mutex (lambda () (apply f args)))))))
Examples
Create a serializer and run some thunks.
(let ((s (make-serializer)) (x 10)) (parallel-execute (s (lambda () (set! x (* x x)))) (s (lambda () (set! x (+ x 1)))))) => #<procedure (f_307)>
sicp-streams
sicp-streams
[module] sicp-streams
Stream procedures from section 3.5
- accelerated-sequence
- cons-stream
- display-line
- display-stream
- euler-transform
- integers
- interleave
- list->stream
- make-tableau
- merge
- pairs
- scale-stream
- stream-car
- stream-cdr
- stream-enumerate-interval
- stream-filter
- stream-for-each
- stream->list
- stream-map
- stream-null
- stream-null?
- stream-ref
- the-empty-stream
stream-null
[constant] stream-null → (quote ())The empty stream
(define stream-null '())
the-empty-stream
[constant] the-empty-stream → stream-nullA synonym for stream-null
(define the-empty-stream stream-null)
stream-null?
[procedure] (stream-null? stream) → booleanIs this stream null?
- stream
- The stream to test
(define stream-null? null?)
cons-stream
[syntax] (cons-stream a d) → streamConstructs a stream; returns a stream whose stream-car is a and whose stream-cdr is a delayed d.
- a
- The address part
- d
- The decrement part
(define-syntax
cons-stream
(ir-macro-transformer
(lambda (expression rename inject)
(match expression ((_ a b) `(cons ,a (delay ,b)))))))
stream-ref
[procedure] (stream-ref s n) → objectReturns the nth element of the stream, consuming any non-memoized elements.
- s
- The stream to consume
- n
- The nth element
(define (stream-ref s n)
(if (= n 0) (stream-car s) (stream-ref (stream-cdr s) (- n 1))))
stream-map
[procedure] (stream-map proc s) → streamConstructs a stream which is a proc-mapped s.
- proc
- The procedure to apply
- s
- The stream to apply to
(define (stream-map proc s)
(if (stream-null? s)
stream-null
(cons-stream (proc (stream-car s)) (stream-map proc (stream-cdr s)))))
stream-for-each
[procedure] (stream-for-each proc s) → unspecifiedApplies proc to every element of s, consuming it.
- proc
- The procedure to apply
- s
- The stream to apply to
(define (stream-for-each proc s)
(if (stream-null? s)
'done
(begin (proc (stream-car s)) (stream-for-each proc (stream-cdr s)))))
display-stream
[procedure] (display-stream s) → unspecifiedDisplays every element of the stream.
- s
- The stream to display
(define (display-stream s) (stream-for-each display-line s))
stream-car
[procedure] (stream-car stream) → objectTakes the first element of the stream.
- stream
- The stream to take
(define (stream-car stream) (car stream))
stream-cdr
[procedure] (stream-cdr stream) → streamForces and returns the cdr of the stream.
- stream
- The stream whose cdr to force
(define (stream-cdr stream) (force (cdr stream)))
stream-enumerate-interval
[procedure] (stream-enumerate-interval low high) → streamEnumerates the interval between low and high streamingly.
- low
- The lower bound
- high
- The upper bound
(define (stream-enumerate-interval low high)
(if (> low high)
stream-null
(cons-stream low (stream-enumerate-interval (+ low 1) high))))
stream-filter
[procedure] (stream-filter pred stream) → streamFilters a stream, applying pred.
- pred
- The predicate upon which to filter.
- stream
- The stream to filter
(define (stream-filter pred stream)
(cond ((stream-null? stream) stream-null)
((pred (stream-car stream))
(cons-stream
(stream-car stream)
(stream-filter pred (stream-cdr stream))))
(else (stream-filter pred (stream-cdr stream)))))
stream->list
[procedure] (stream->list stream) → stream[procedure] (stream->list stream n) → stream
Converts a stream to a list, consuming it (or up to n elements).
- stream
- The stream to convert to a list
- n
- Optionally, the maximum number of elements to consume; otherwise: all elements
(define stream->list
(case-lambda
((stream) (stream->list stream +inf.0))
((stream n)
(if (or (stream-null? stream) (zero? n))
'()
(cons (stream-car stream)
(stream->list (stream-cdr stream) (- n 1)))))))
scale-stream
[procedure] (scale-stream stream factor) → streamScales the stream by a constant factor.
- stream
- The stream to scale
- factor
- The factor by which to scale it
(define (scale-stream stream factor)
(stream-map (lambda (x) (* x factor)) stream))
euler-transform
[procedure] (euler-transform s) → streamApplies Euler's transform, i.e. a linear sequence transformation for improved convergence, to a stream.
- s
- The stream to which to apply Euler's transform
(define (euler-transform s)
(let ((s0 (stream-ref s 0)) (s1 (stream-ref s 1)) (s2 (stream-ref s 2)))
(cons-stream
(- s2 (/ (square (- s2 s1)) (+ s0 (* -2 s1) s2)))
(euler-transform (stream-cdr s)))))
make-tableau
[procedure] (make-tableau transform s) → streamMakes a tableau (i.e., a stream of streams) compounded from some transformation.
- transform
- The compounding transformation
- s
- The stream to transformatively compound
(define (make-tableau transform s)
(cons-stream s (make-tableau transform (transform s))))
accelerated-sequence
[procedure] (accelerated-sequence transform s) → streamAccelerates some converging sequence.
- transform
- The transformation to apply
- s
- The sequence to accelerate, e.g. euler-transform
(define (accelerated-sequence transform s)
(stream-map stream-car (make-tableau transform s)))
integers-starting-from
[procedure] (integers-starting-from n) → streamEnumerates the integers starting from n streamingly.
- n
- The number to start from
(define (integers-starting-from n)
(cons-stream n (integers-starting-from (+ n 1))))
integers
[constant] integers → (integers-starting-from 1)Enumerates the positive integers streamingly.
(define integers (integers-starting-from 1))
interleave
[procedure] (interleave s1 s2) → streamInterleaves two streams.
- s1
- The interleavened stream
- s1
- The interleaving stream
(define (interleave s1 s2)
(if (stream-null? s1)
s2
(cons-stream (stream-car s1) (interleave s2 (stream-cdr s1)))))
pairs
[procedure] (pairs s t) → streamGenerates the stream of pairs (S_i, T_j), where i <= j.
- s
- The first stream to pair
- t
- The second stream to pair
(define (pairs s t)
(cons-stream
(list (stream-car s) (stream-car t))
(interleave
(stream-map (lambda (x) (list (stream-car s) x)) (stream-cdr t))
(pairs (stream-cdr s) (stream-cdr t)))))
merge
[procedure] (merge s1 s2) → streamMerges two ordered streams into one ordered result stream, eliminating repetitions.
- s1
- Mergend
- s2
- Merger
(define (merge s1 s2)
(cond ((stream-null? s1) s2)
((stream-null? s2) s1)
(else
(let ((s1car (stream-car s1)) (s2car (stream-car s2)))
(cond ((< s1car s2car)
(cons-stream s1car (merge (stream-cdr s1) s2)))
((> s1car s2car)
(cons-stream s2car (merge s1 (stream-cdr s2))))
(else
(cons-stream
s1car
(merge (stream-cdr s1) (stream-cdr s2)))))))))
list->stream
[procedure] (list->stream list) → streamTakes a list and streamifies it.
- list
- The list to streamify
(define (list->stream list)
(if (null? list)
stream-null
(cons-stream (car list) (list->stream (cdr list)))))
sicp-eval
sicp-eval
[module] sicp-eval
Evaluation procedures from section 4.1
- add-binding-to-frame!
- announce-output
- application?
- apply*
- apply-primitive-procedure
- assignment?
- assignment-value
- assignment-variable
- begin-actions
- begin?
- compound-procedure?
- cond?
- cond->if
- cond-actions
- cond-clauses
- cond-else-clause?
- cond-predicate
- define-variable!
- definition?
- definition-variable
- definition-value
- driver-loop
- enclosing-environment
- eval*
- eval-assignment
- eval-definition
- eval-if
- eval-sequence
- extend-environment
- false?
- first-exp
- first-frame
- frame-values
- frame-variables
- if?
- if-alternative
- if-consequent
- if-predicate
- first-operand
- lambda?
- lambda-body
- lambda-parameters
- last-exp?
- list-of-values
- lookup-variable-value
- make-if
- make-frame
- make-lambda
- make-procedure
- no-operands?
- operands
- operator
- primitive-procedure?
- primitive-procedures
- procedure-body
- procedure-environment
- procedure-parameters
- prompt-for-input
- quoted?
- rest-exps
- rest-operands
- self-evaluating?
- sequence->exp
- set-variable-value!
- setup-environment
- tagged-list?
- text-of-quotation
- the-empty-environment
- the-global-environment
- true?
- user-print
- variable?
- with-primitive-procedures
apply*
[procedure] (apply* procedure arguments) → objectThe SICP definition of apply; had to rename it apply*, because the redefinition of apply wrought havok on the module-system.
- procedure
- The procedure to apply
- arguments
- The arguments to which to apply it
(define (apply* procedure arguments)
(cond ((primitive-procedure? procedure)
(apply-primitive-procedure procedure arguments))
((compound-procedure? procedure)
(eval-sequence
(procedure-body procedure)
(extend-environment
(procedure-parameters procedure)
arguments
(procedure-environment procedure))))
(else (error "Unknown procedure type: APPLY*" procedure))))
eval*
[procedure] (eval* exp env) → objectThe SICP implementation of eval; had to rename it eval*, because the redefinition of eval wrought havok on the module-system.
- exp
- The expression to evaluate
- env
- The environment to evaluate it in
(define (eval* exp env)
(cond ((self-evaluating? exp) exp)
((variable? exp) (lookup-variable-value exp env))
((quoted? exp) (text-of-quotation exp))
((assignment? exp) (eval-assignment exp env))
((definition? exp) (eval-definition exp env))
((if? exp) (eval-if exp env))
((lambda? exp)
(make-procedure (lambda-parameters exp) (lambda-body exp) env))
((begin? exp) (eval-sequence (begin-actions exp) env))
((cond? exp) (eval* (cond->if exp) env))
((application? exp)
(apply*
(eval* (operator exp) env)
(list-of-values (operands exp) env)))
(else (error "Unknown expression type: EVAL" exp))))
with-primitive-procedures
[procedure] (with-primitive-procedures procedures receive-env) → objectInstalls procedures, creates a default environment and calls receive-env with the default environment; this is useful for testing new syntax, etc.
- procedures
- A key-value list of procedure-names and their primitive counter-part
- receive-env
- A procedure which takes a fresh environment
(define (with-primitive-procedures procedures receive-env)
(parameterize
((primitive-procedures (append procedures (primitive-procedures))))
(let ((env (setup-environment))) (receive-env env))))
Examples
Applying primitive addition
(with-primitive-procedures `((+ ,+)) (lambda (env) (eval* '(+ 2 3) env))) => 5
sicp-eval-anal
sicp-eval-anal
[module] sicp-eval-anal
The analyzing evaluator from section 4.1.7
- anal-eval*
- analyze
- analyze-application
- analyze-assignment
- analyze-definition
- analyze-if
- analyze-lambda
- analyze-quoted
- analyze-self-evaluating
- analyze-sequence
- analyze-variable
- execute-application
anal-eval*
[procedure] (anal-eval* exp env) → objectAnal-eval* analyzes an expression before evaluating it, storing the syntactic analysis in a thunk for re-use.
- exp
- The expression to analyze and evaluate
- env
- The environment to analyze and evaluate it in
(define (anal-eval* exp env) ((analyze exp) env))
analyze
[procedure] (analyze exp) → thunkAnalyze analyzes the expression, returning a thunk that represents the work to be done.
- exp
- The expression to analyze
(define (analyze exp)
(cond ((self-evaluating? exp) (analyze-self-evaluating exp))
((quoted? exp) (analyze-quoted exp))
((variable? exp) (analyze-variable exp))
((assignment? exp) (analyze-assignment exp))
((definition? exp) (analyze-definition exp))
((if? exp) (analyze-if exp))
((lambda? exp) (analyze-lambda exp))
((begin? exp) (analyze-sequence (begin-actions exp)))
((cond? exp) (analyze (cond->if exp)))
((application? exp) (analyze-application exp))
(else (error "Unknown expression type: ANALYZE" exp))))
sicp-eval-lazy
sicp-eval-lazy
[module] sicp-eval-lazy
The lazy evaluator from section 4.2.2
- actual-value
- apply*
- delay-it
- driver-loop
- eval*
- eval-if
- evaluated-thunk?
- force-it
- input-prompt
- list-of-arg-values
- list-of-delayed-args
- output-prompt
- thunk-env
- thunk-exp
- thunk-value
- thunk?
- with-lazy-lists
eval*
[procedure] (eval* exp env) → objectEvaluates an expression lazily, given an environment.
- exp
- The expression to evaluate
- env
- The environment to evaluate it in
(define (eval* exp env)
(cond ((self-evaluating? exp) exp)
((variable? exp) (lookup-variable-value exp env))
((quoted? exp) (text-of-quotation exp))
((assignment? exp) (eval-assignment exp env))
((definition? exp) (eval-definition exp env))
((if? exp) (eval-if exp env))
((lambda? exp)
(make-procedure (lambda-parameters exp) (lambda-body exp) env))
((begin? exp) (eval-sequence (begin-actions exp) env))
((cond? exp) (eval* (cond->if exp) env))
((application? exp)
(apply* (actual-value (operator exp) env) (operands exp) env))
(else (error "Unknown expression type: EVAL*" exp))))
with-lazy-lists
[procedure] (with-lazy-lists procedures receive-env) → objectSets up an environment where lazy cons, car and cdr have been defined.
With-lazy-lists is a wrapper around with-primitive-procedures.
- procedures
- A key-value list of names and their primitive procedures in the underlying Scheme.
- receive-env
- A lambda of one value that takes the prepared environment
(define (with-lazy-lists procedures receive-env)
(with-primitive-procedures
(append procedures `((= ,=) (- ,-)))
(lambda (env)
(eval* '(define (cons x y) (lambda (m) (m x y))) env)
(eval* '(define (car z) (z (lambda (p q) p))) env)
(eval* '(define (cdr z) (z (lambda (p q) q))) env)
(eval* '(define (list-ref items n)
(if (= n 0) (car items) (list-ref (cdr items) (- n 1))))
env)
(eval* '(define (map proc items)
(if (null? items)
'()
(cons (proc (car items)) (map proc (cdr items)))))
env)
(receive-env env))))
sicp-eval-amb
sicp-eval-amb
[module] sicp-eval-amb
The non-deterministic backtracking evaluator from section 4.3.3
- amb-choices
- amb?
- ambeval*
- ambeval-fold
- ambeval-map
- ambeval-n
- analyze
- analyze-amb
- analyze-application
- analyze-assignment
- analyze-definition
- analyze-if
- analyze-lambda
- analyze-let
- analyze-quoted
- analyze-self-evaluating
- analyze-sequence
- analyze-variable
- driver-loop
- execute-application
- failure
- failure?
- get-args
- input-prompt
- let->combination
- let-body
- let-clause-expression
- let-clause-variable
- let-clause?
- let-clauses
- output-prompt
- success?
- with-require
ambeval
[procedure] (ambeval exp env succeed fail) → objectEvaluates the expression using backtracking search.
- exp
- The expression to evaluate
- env
- The environment to evaluate it in
- succeed
- The success-continuation
- fail
- The failure-continuation
(define (ambeval exp env succeed fail) ((analyze exp) env succeed fail))
ambeval-n
[procedure] (ambeval-n exp env n) → objectAmb-evaluates the expression, invoking the success-continuation n times or until failure.
- exp
- The expression to evaluate
- env
- The environment to evaluate it in
- n
- The maximum number of times to invoke the success continuation
(define (ambeval-n exp env n)
(ambeval
exp
env
(lambda (val next-alternative)
(set! n (- n 1))
(if (zero? n) val (next-alternative)))
(lambda () failure)))
ambeval-fold
[procedure] (ambeval-fold exp env cons nil) → list[procedure] (ambeval-fold exp env cons nil n) → list
Folds over the results of up to n successful executions of exp; if n is missing, folds over all successful executions until failure.
- exp
- The expression to execute
- env
- The environment to execute it in
- cons
- The aggregator
- nil
- The initial value
- n
- The number of results to gather
(define ambeval-fold
(case-lambda
((exp env cons nil) (ambeval-fold exp env cons nil +inf.0))
((exp env cons nil n)
(let ((result nil))
(ambeval
exp
env
(lambda (val next-alternative)
(set! n (- n 1))
(if (negative? n)
result
(begin (set! result (cons val result)) (next-alternative))))
(lambda () result))))))
ambeval-map
[procedure] (ambeval-map exp env f) → list[procedure] (ambeval-map exp env f n) → list
Maps over the results of up to n successful executions of exp; if n is missing, maps over all successful executions until failure.
- exp
- The expression to execute
- env
- The environment to execute it in
- f
- The function to apply to the results
- n
- The number of results to gather
(define ambeval-map
(case-lambda
((exp env f) (ambeval-map exp env f +inf.0))
((exp env f n)
(ambeval
exp
env
(lambda (val next-alternative)
(set! n (- n 1))
(if (negative? n) '() (cons val (next-alternative))))
(lambda () '())))))
ambeval*
[procedure] (ambeval* exp env) → list[procedure] (ambeval* exp env n) → list
Gathers the results of up to n successful executions of exp; if n is missing, gathers all successful executions until failure.
- exp
- The expression to execute
- env
- The environment to execute it in
- n
- The number of results to gather
(define ambeval*
(case-lambda
((exp env) (ambeval* exp env +inf.0))
((exp env n) (ambeval-map exp env values n))))
with-require
[procedure] (with-require procedures receive-env) → objectInstalls require, an-element-of, an-integer-starting-from in the environment in addition to the primitive procedures enumerated in procedures; then calls receive-env with the configured environment.
- procedures
- A key-value list of primitive procedure-names and their definitions
- receive-env
- A lambda of one value that is called with the prepared environment
(define (with-require procedures receive-env)
(with-primitive-procedures
(append procedures `((member ,member) (not ,not)))
(lambda (env)
(ambeval* '(define (require p) (if (not p) (amb) 'success)) env)
(ambeval*
'(define (an-element-of items)
(require (not (null? items)))
(amb (car items) (an-element-of (cdr items))))
env)
(ambeval*
'(define (an-integer-starting-from n)
(amb n (an-integer-starting-from (+ n 1))))
env)
(ambeval*
'(define (distinct? items)
(cond ((null? items) true)
((null? (cdr items)) true)
((member (car items) (cdr items)) false)
(else (distinct? (cdr items)))))
env)
(receive-env env))))
About this egg
Author
Repository
https://github.com/klutometis/sicp-chicken
License
BSD
Dependencies
Versions
- 0.0
- Initial commit
- 0.0.1
- Add release-info.
- 0.0.2
- Change the repo and uri.
- 0.0.3
- Remove 0.0.
- 0.1
- Some actual code.
- 0.1.1
- Nil, etc.
- 0.1.2
- Remove SRFI-18.
- 0.1.3
- Add accumulate.
- 0.1.4
- Enumerate interval
- 0.1.5
- Add flatmap.
- 0.1.6
- Add `prime?'.
- 0.2
- Add picture language.
- 0.2.12
- Add ambeval-fold, ambeval-map; change ambeval*.
- 0.2.13
- Remove redundant ambeval*.
- 0.3
- Add the outline-painter.
- 0.4
- Add differentation.
- 0.4.1
- Add images to picture-language.
- 0.4.2
- Add write-painter-to-png.
- 0.5
- Add sets.
- 0.5.1
- Add Huffman trees.
- 0.5.2
- Add abstract data.
- 0.5.3
- Add arithmetic.
- 0.5.4
- Add queues and circuits.
- 0.6
- Add constraints, documentation.
- 0.7
- Add concurrency.
- 0.7.1
- Remove the dependency on setup-helper-cock.
- 0.7.2
- Update sxml to work with `at'.
- 0.7.3
- Drop setup-helper-cock.
- 0.8
- Add streams.
- 0.8.1
- Use match instead of match-let.
- 0.8.2
- Add a limit to stream-consumption on stream->list.
- 0.8.3
- Use +inf.0 instead of +inf.
- 0.8.4
- Evaluate examples; update docs.
- 0.8.5
- Add scale-stream.
- 0.8.6
- Add accelerated sequences.
- 0.8.7
- Add integers.
- 0.8.8
- Add interleave and pairs.
- 0.8.9
- Add merge.
- 0.8.10
- Add list->stream.
- 0.9
- Add the evaluator.
- 0.9.1
- Actually add the eval-files.
- 0.9.2
- Add with-primitive-procedures.
- 0.9.3
- Export some functions.
- 0.9.4
- Export `compound-procedure?'.
- 0.9.5
- Export functions required for analysis.
- 0.9.6
- Also export these for analysis.
- 0.9.7
- Export a few more things.
- 0.9.8
- Export more procedures.
- 0.9.9
- Add time+values.
- 0.9.10
- Export procedures.
- 0.9.11
- Export make-lambda.
- 0.9.12
- Use hahn.
- 0.10
- Add the analyzing evaluator.
- 0.11
- Add the lazy evaluator.
- 0.12
- Add the amb-evaluator.
- 0.12.1
- Export with-lazy-lists.
- 0.12.4
- Add debug to the dependencies.
- 0.12.5
- Add `distinct?' to amb-eval.
- 0.12.6
- Add member to the list of imported functions.
Colophon
Documented by hahn.