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))
答案 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
对于clojure用户,您的代码可能更具可读性,但将
当一个lisper 会混淆时,一个clojurer 可能会得到一种虚假的安全感。
Porting Common Lisp code to Clojure比编写一些简单的宏要困难得多。