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