timothy235 icon

sicp-4-1-4-repl-test

timothy235 | PRO | 12/19/24 01:07:55 AM UTC (Edited) | 0 ⭐ | 7139 👁️ | Never ⏰ | []
Racket |

5.55 KB

|

None

|

0 👍

/

0 👎

#lang racket
(require rackunit
         "4-1-4-repl-program.rkt")
 
(test-case "self-evaluating expression"
           (check-equal? (my-eval "x" the-global-environment)
                         "x")
           (check-equal? (my-eval 23 the-global-environment)
                         23)
           )
 
(test-case "quotation"
           (define quote-expr '(quote ("x" 23 a)))
           (check-equal? (my-eval quote-expr the-global-environment)
                         '("x" 23 a))
           )
 
(test-case "variable definition"
           (define def-expr '(define a 42))
           (check-equal? (my-eval def-expr the-global-environment)
                         'ok)
           (check-equal? (my-eval 'a the-global-environment)
                         42)
           )
 
(test-case "procedure definition"
           (define proc-expr '(define (multiply x y) (* x y)))
           (check-equal? (my-eval proc-expr the-global-environment)
                         'ok)
           )
 
(test-case "procedure application"
           (define application-expr '(multiply 3 4))
           (check-equal? (my-eval application-expr the-global-environment)
                         12)
           (check-equal? (my-eval '(car (cons 1 (cons 2 '())))
                                  the-global-environment)
                         1)
           )
 
(test-case "assignment"
           (define assign-expr '(set! a 23))
           (check-equal? (my-eval assign-expr the-global-environment)
                         'ok)
           (check-equal? (my-eval 'a the-global-environment)
                         23)
           )
 
(test-case "predicate"
           (check-true (true? (my-eval 'a the-global-environment)))
           (check-true (true? (my-eval "false" the-global-environment)))
           (check-false (true? (my-eval 'false the-global-environment)))
           (check-true (false? (my-eval 'false the-global-environment)))
           )
 
(test-case "if statement"
           (define ie '(if true 1 2))
           (check-equal? (my-eval ie the-global-environment)
                         1)
           (define ie2 '(if false 1 2))
           (check-equal? (my-eval ie2 the-global-environment)
                         2)
           )
 
(test-case "cond statement"
           (define ce '(cond ("a" 1 2) ("b" 3)))
           (check-equal? (my-eval ce the-global-environment)
                         2)
           (define alt-ce '(cond ((cons 1 (cons 2 '())) => car) (else 87)))
           (check-equal? (my-eval alt-ce the-global-environment)
                         1)
           )
 
(test-case "begin statement"
           (define be '(begin "a" "b" 1 2 (* 3 4)))
           (check-equal? (my-eval be the-global-environment)
                         12)
           )
 
(test-case "boolean operator"
           (my-eval '(define c 38) the-global-environment)
           (check-equal? (my-eval '(and 1 "a" c) the-global-environment)
                         38)
           (check-equal? (my-eval '(and 1 1 false) the-global-environment)
                         false)
           (check-equal? (my-eval '(or false false 1) the-global-environment)
                         1)
           (check-equal? (my-eval '(or false false false) the-global-environment)
                         false)
           )
 
(test-case "let"
           (define le '(let ((x 1) (y 2) (z 3)) 'side-effect (+ x y z)))
           (check-equal? (my-eval le the-global-environment)
                         6)
           (define le2 '(let ((x 1) (y 2)) (+ x y)))
           (check-equal? (my-eval le2 the-global-environment)
                         3)
           (define le3 '(let ((x 1)) 'side-effect (+ x 2)))
           (check-equal? (my-eval le3 the-global-environment)
                         3)
           (define le4 '(let () 'side-effect (+ 3 2)))
           (check-equal? (my-eval le4 the-global-environment)
                         5)
           (define le5 '(let () (+ 3 2)))
           (check-equal? (my-eval le5 the-global-environment)
                         5)
           (define le6 '(let ([x 1]) (define y 2) (+ x y)))
           (check-equal? (my-eval le6 the-global-environment)
                         3)
           )
 
(test-case "named-let"
           (my-eval '(define (fib n)
                       (let fib-iter ((a 1)
                                      (b 0)
                                      (my-count n))
                         (if (= my-count 0)
                           b
                           (fib-iter (+ a b) a (+ my-count -1)))))
                    the-global-environment)
           (check-equal? (my-eval '(fib 0) the-global-environment)
                         0)
           (check-equal? (my-eval '(fib 1) the-global-environment)
                         1)
           (check-equal? (my-eval '(fib 10) the-global-environment)
                         55)
           )
 
(test-case "let*"
           (define lse '(let* ((x 1) (y (+ x 1)) (z (+ y 1))) (+ x y z)))
           (check-equal? (my-eval lse the-global-environment)
                         6)
           (define lse2 '(let* ((a 1) (b 2)) 'side-effect (+ a b)))
           (check-equal? (my-eval lse2 the-global-environment)
                         3)
           (define lse3 '(let* ((a 1)) 'side-effect (+ a 2)))
           (check-equal? (my-eval lse3 the-global-environment)
                         3)
           (define lse4 '(let* ((a 1)) (+ a 2)))
           (check-equal? (my-eval lse4 the-global-environment)
                         3)
           )

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎