Schemeを使ってevalを書くのは容易
だけどどの程度ホスト処理系の機能を使う事が要求されているんですか?
特別式は使っていいんですか?

(define (my-eval e env)
  (cond ((self-evaluate? e) e)
        ((symbol? e)
         (let ((x (assq e env)))
           (if x
               (car x)
               'UNBOUND)))
        ((and (pair? e)
              (eq? (car e) 'if)
              (pair? (cdr e))
              (pair? (cddr e))
              (pair? (cdddr e))
              (null? (cddddr e)))
         (if (my-eval (cadr e) env)
             (my-eval (caddr e) env)
             (my-eval (cadddr e) env)))
        ... ))
みたいな程度でいいんですか?