From: Ken A. <kan...@bb...> - 2004-08-17 14:47:36
|
Geoffrey reminded me that its good to take inspiration from other languages. Here are some macros i've been playing with. ;;; Alternatives to lambda. (define-macro (\\ args . body) `(lambda ,args ,@body)) ;; Convenient for writing simple one argument functions. (define-macro (_ . body) `(lambda (_) ,@body)) (define-macro (| . body) ;; Ruby like: (| a b | (* a (+ 1 b))) -> (lambda (a b) (* a (+ 1 b))) (define (crack rest sofar) (cond ((null? rest) (error "No closing | found!")) ((eq? (car rest) '|) (cons (reverse sofar) (cdr rest))) (else (crack (cdr rest) (cons (car rest) sofar))))) (mvbind (args . body) (crack body '()) `(lambda ,args ,@body))) (define-macro (mvbind pattern source . body) ;; Like multiple-value-bind. `(apply (lambda ,pattern ,@body) ,source)) (define-macro (while cond . actions) `(let loop () (if ,cond (begin ,@(append actions (list '(loop))))))) (define-macro (for var vals . body) ;; Python like for loop ;; Example: (for x in xs if (prime? x) (print x)) (if (eq? (car body) 'if) `(for-each* (lambda (,var) ,body) ,vals) `(for-each* (lambda (,var) ,@body) ,vals))) (define-macro (lt var val . body) ;; Arc 1 variable let. `(let ((,var ,val)) ,@body)) (define-macro (if. . args) ;; Arc if. (if (null? args) '() (if (null? (cdr args)) (car args) `(if ,(car args) ,(cadr args) (if. ,@(cddr args)))))) |