http://t3x.org/klisp/klsys/letrec

KLSYS Example Programs

LETREC Macro

towers of hanoi  |  Takeuchi function  |  combinations of a set  |  letrec macro

;;; Scheme's LETREC and LETREC*

(defmacro letrec (bs x . xs)
  (let ((vs (mapcar car bs))
        (as (mapcar cadr bs))
        (gs (mapcar (lambda (x) (gensym)) bs)))
    (let ((ns (mapcar (lambda (x) @(,x nil)) vs))
          (is (mapcar (lambda (v g) @(setq ,v ,g))
              vs gs)))
      @(let (,@ns) ((lambda ,gs ,@is ,x . ,xs) . ,as)))))

(defmacro letrec* (bs x . xs)
  (let ((vs (mapcar car bs))
        (as (mapcar cadr bs))
        (ns (mapcar (lambda (x) nil) bs)))
    (let ((is (mapcar (lambda (v a) @(setq ,v ,a))
              vs as)))
      @((lambda ,vs ,@is ,x . ,xs) . ,ns))))

contact  |  privacy