solution to 4.26
authorRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Wed, 18 Jan 2012 15:58:46 +0000 (21:28 +0530)
committerRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Wed, 18 Jan 2012 15:58:46 +0000 (21:28 +0530)
src/sicp/ex4_26.rkt [new file with mode: 0644]
src/sicp/metacircular2-test.rkt
src/sicp/metacircular2.rkt

diff --git a/src/sicp/ex4_26.rkt b/src/sicp/ex4_26.rkt
new file mode 100644 (file)
index 0000000..01c33af
--- /dev/null
@@ -0,0 +1,19 @@
+#lang racket
+
+#|
+
+Yes, if 'unless' were implemented in an applicative order language, then
+it would be implemented as a special form and would be translated into
+other functions before evaluation.
+
+Now, if such a special form is used in a higher order function like 'map'
+for instance:
+
+(map unless '((p-list) (usual-list) (exception-list)))
+
+then, unless gets expanded before evaluation. But map expects a function
+as its second argument.
+
+To see the implementation of unless, see metacircular2.rkt
+
+|#
index 1644f95a9ac1aee0b8a548f614eeb0894f5d0c72..cda363a446632ae0ccbb9dafe186e7a51429772e 100644 (file)
@@ -77,7 +77,8 @@
                   1
                   (* (factorial (- n 1)) n)))
            env1)
-     (check-equal? (eval '(factorial 10) env1) 3628800 "factorial test"))))
+     (check-equal? (eval '(factorial 10) env1) 3628800 "factorial test")
+     (check-equal? (eval '(unless true "true" "false") env1) "false" "unless test 1"))))
 
 
 (run-tests metacircular2-tests)
\ No newline at end of file
index c45a5e71c24730a6350ce60ae7fecabbf62adb60..ef387d444483742257056a6c6e12afd5ca60587f 100644 (file)
     [`(define ,(? (lambda (x) (not (pair? x))) var) ,b) (define-variable! var (eval b env) env)]
     [`(define ,(? pair? var) ,b ..1) (define-variable! (car var) (eval (make-lambda (cdr var) b) env) env)]
     [`(if ,pred ,consequent ,alternative) (if (true? (eval pred env)) (eval consequent env) (eval alternative env))]
+    [`(unless ,condition ,consequent ,alternative) (if (true? (eval condition env)) (eval alternative env) (eval consequent env))]
     [`(lambda ,parameters ,body ..1) (make-procedure parameters body env)]
     [`(begin ,exp ...) (eval-sequence exp env)]
     [`(cond ,clauses ...) (eval (cond->if clauses) env)]