Updated README.
[scheme.forth.jl.git] / examples / metacirc.scm
index 4778591..fe4c965 100644 (file)
@@ -2,12 +2,14 @@
 ;; Mandatory SICP Metacircular Evaluator ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+;; To use, simply (load "metacirc.scm") and run the (driver-loop) command.
+
 (define apply-in-underlying-scheme apply)
+(define true #t)
+(define false #f)
 
 ;; Verbatim code from SICP
 
-(display "eval and apply\n")
-
 (define (eval exp env)
   (cond ((self-evaluating? exp) 
          exp)
     env)
   'ok)
 
+(define (eval-definition exp env)
+  (define-variable! 
+    (definition-variable exp)
+    (eval (definition-value exp) env)
+    env)
+  'ok)
+
 (define (self-evaluating? exp)
   (cond ((number? exp) true)
         ((string? exp) true)
       (cddr exp)))) ; body
 
 
-(display "lambda... \n")
-
 (define (lambda? exp) 
   (tagged-list? exp 'lambda))
 (define (lambda-parameters exp) (cadr exp))
 (define (rest-operands ops) (cdr ops))
 
 
-(display "cond... \n")
-
 (define (cond? exp) 
   (tagged-list? exp 'cond))
 (define (cond-clauses exp) (cdr exp))
   (eq? x false))
 
 
-(display "make-procedure...\n")
-
-
 (define (make-procedure parameters body env)
   (list 'procedure parameters body env))
 (define (compound-procedure? p)
 (define the-empty-environment '())
 
 
-(display "make-frame\n")
-
 (define (make-frame variables values)
   (cons variables values))
 (define (frame-variables frame) (car frame))
   (set-car! frame (cons var (car frame)))
   (set-cdr! frame (cons val (cdr frame))))
 
-(display "extend-environment\n")
-
 (define (extend-environment vars vals base-env)
   (if (= (length vars) (length vals))
     (cons (make-frame vars vals) base-env)
              vars 
              vals))))
 
-(display "lookup-variable\n")
-
 (define (lookup-variable-value var env)
   (define (env-loop env)
     (define (scan vars vals)
               (frame-values frame)))))
   (env-loop env))
 
-(display "set-variable\n")
-
 (define (set-variable-value! var val env)
   (define (env-loop env)
     (define (scan vars vals)
               (frame-values frame)))))
   (env-loop env))
 
-(display "define-variable\n")
-
 (define (define-variable! var val env)
   (let ((frame (first-frame env)))
     (define (scan vars vals)
                var val frame))
             ((eq? var (car vars))
              (set-car! vals val))
-            (else (scan (cdr vars) 
+            (else
+                (scan (cdr vars) 
                         (cdr vals)))))
     (scan (frame-variables frame)
           (frame-values frame))))
 
-(display "setup-environment...\n")
-
 (define (setup-environment)
   (let ((initial-env
           (extend-environment 
     (define-variable! 'false false initial-env)
     initial-env))
 
+
 (define (primitive-procedure? proc)
   (tagged-list? proc 'primitive))
 
          (list 'primitive (cadr proc)))
        primitive-procedures))
 
-
-
 (define (apply-primitive-procedure proc args)
     (apply-in-underlying-scheme
          (primitive-implementation proc) args))
 (define output-prompt ";;; M-Eval value:")
 
 
-(display "driver-loop...\n") 
-
-
 (define (driver-loop)
   (prompt-for-input input-prompt)
   (let ((input (read)))
             '<procedure-env>))
     (display object)))
 
-(define the-global-environment 
-  (setup-environment))
+
+(define the-global-environment (setup-environment))