Common Lisp Macro
(setq name 123)
(name)
=> 123
('name)
=> (quote name)
=> name
#'name
=> (symbol-function 'name)
(setq b (1 2 3))
`(a b c) => (list 'a 'b 'c)
`(a ,b c) => (list 'a (1 2 3) 'c)
`(a ,@b c) => (list 'a 1 2 3 'c)
defmacro
- compile time calculation
( defun average (&rest args)
(/ (apply #'+ args) (length args) )
)
( defmacro average (&rest args)
(list '/ (list '+ @args) (llength args))
)
( defmacro average (&rest args)
`(/ (+ ,@args) ,(llength args))
)
defmacro our-let
( let ( (x 123) (y 456) )
(+ x y)
)
( defmacro out-let (binds &body body)
`(
(lambda
, (mapcar #'(lambda (x) (car x)) binds)
,@body
)
,@(mapcar #'(lambda (x) (cadr x)) binds)
)
)
《On Lisp》