jch*_*eat 3 macros clojure common-lisp
Clojure的let比Common Lisp更简洁,括号更少:
;Clojure
(let [a 1 b 2]
(+ a b))
;Common Lisp
(let ( (a 1) (b 2))
(+ a b))
Run Code Online (Sandbox Code Playgroud)
你如何在Common Lisp中编写一个宏来等效?:
(letmac ( a 1 b 2)
(+ a b))
Run Code Online (Sandbox Code Playgroud)
sds*_*sds 10
(defmacro clojure-let (bindings &body body)
`(let ,(loop for (a b) on bindings by #'cddr collect (list a b))
,@body))
Run Code Online (Sandbox Code Playgroud)
看看它怎么运作:
> (macroexpand-1 '(clojure-let (a b c d) (foo) (bar)))
(LET ((A B) (C D)) (FOO) (BAR)) ;
T
Run Code Online (Sandbox Code Playgroud)
您的代码可能是一个Clojure的用户更可读的,但它会是少了利斯佩尔可读.
一个clojurer 可能会得到一种虚假的安全感,而一个lisper 会感到困惑.
将Common Lisp代码移植到Clojure比编写一些简单的宏要困难得多.