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》