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))))