Clojure的let比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))
Clojure的let比Common Lisp更加简洁,括号更少:
;Clojure
(let [a 1 b 2]
(+ a b))
;Common Lisp
(let ( (a 1) (b 2))
(+ a b))
(letmac ( a 1 b 2)
(+ a b))
(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可能会产生虚假的安全感,而Lisper则会感到困惑。
将Common Lisp代码移植到Clojure比编写几个简单的宏要难得多。
let
(我同意这是一个可疑的想法),那么最好使用let*
而不仅仅是let
,因为Clojure的let
按顺序进行绑定而不是一次完成。 - amalloy