用于“让”匹配Clojure的Common Lisp宏

时间:2014-07-18 02:08:49

标签: macros clojure common-lisp

Clojure的使用比Common Lisp更简洁,括号更少:

 ;Clojure
(let [a 1 b 2]
     (+ a b))


;Common Lisp
(let ( (a 1) (b 2))
    (+ a b))

你如何在Common Lisp中编写一个等效的宏?:

(letmac ( a 1 b 2)
    (+ a b))

1 个答案:

答案 0 :(得分:10)

这不太难:

(defmacro clojure-let (bindings &body body)
  `(let ,(loop for (a b) on bindings by #'cddr collect (list a b))
     ,@body))

了解它的工作原理:

> (macroexpand-1 '(clojure-let (a b c d) (foo) (bar)))
(LET ((A B) (C D)) (FOO) (BAR)) ;
T

但是,这是一个非常好的主意(和not a new one either!):

对于clojure用户,您的代码可能更具可读性,但

当一个lisper 会混淆时,一个clojurer 可能会得到一种虚假的安全感。

不要自欺欺人

Porting Common Lisp code to Clojure比编写一些简单的宏要困难得多。