【问题标题】:Common Lisp macro for "let" to match Clojure用于“let”以匹配 Clojure 的 Common Lisp 宏
【发布时间】:2014-07-18 02:08:49
【问题描述】:

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))

【问题讨论】:

    标签: macros clojure common-lisp


    【解决方案1】:

    这并不难:

    (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 可能得到一种错误的安全感,而一个lisper 感到困惑。

    别自欺欺人

    Porting Common Lisp code to Clojure 比写几个简单的宏要难得多。

    【讨论】:

    • 如果你要模仿 Clojure 的 let(我同意这是一个可疑的想法),你最好发出 let* 而不仅仅是 let,因为 Clojure 的 let 可以做到顺序绑定而不是一次全部绑定。
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多