Common Lisp的"let"宏以匹配Clojure

3

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))
1个回答

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可能会产生虚假的安全感,而Lisper则会感到困惑。

不要自欺欺人

将Common Lisp代码移植到Clojure比编写几个简单的宏要难得多。


3
如果你要模仿Clojure的let(我同意这是一个可疑的想法),那么最好使用let*而不仅仅是let,因为Clojure的let按顺序进行绑定而不是一次完成。 - amalloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接