;; lambda-h.scm - (c) rohan drape, 2000-2007 (module lambda-h scheme/base (require "lambda-c.scm" "lambda-m.scm") (provide let-h lambda-h define-h) ;; n = name, v = value, e = expression (define-syntax let-h (syntax-rules () ((_ n v e) (let-m1 n v e)) ((_ n0 v0 n1 v1 ... e) (let-m1 n0 v0 (let-h n1 v1 ... e))))) (define-syntax rec-h (syntax-rules () ((_ r () e) (let r () e)) ((_ r ((n v) ...) e) (let r ((n v) ...) e)) ((_ r ((n v) ...) n0 v0 e) (rec-h r ((n v) ... (n0 v0)) e)) ((_ r ((n v) ...) n0 v0 n1 v1 ... e) (rec-h r ((n v) ... (n0 v0)) n1 v1 ... e)) ((_ r e) (let r () e)) ((_ r n v e) (rec-h r ((n v)) e)) ((_ r n0 v0 n1 v1 ... e) (rec-h r ((n0 v0)) n1 v1 ... e)))) (define-syntax cond-h (syntax-rules (else) ((_ else e) e) ((_ c e) (if c e (error 'cond-h "no clause" c e))) ((_ c0 e0 c1 e1 ...) (if c0 e0 (cond-h c1 e1 ...))))) (define-syntax lambda-h (syntax-rules () ((_ n ... e) (lambda-ml lambda-c (n ...) e)))) (define-syntax define-h (syntax-rules () ((_ n v) (define n v)) ((_ n v ... e) (define n (lambda-h v ... e))))) )