Clojure中let和let*之间的区别

Att*_*lio 13 clojure

考虑以下宏:

(defmacro somemacro []
    (list 'let ['somevar "Value"] 'somevar))
Run Code Online (Sandbox Code Playgroud)

扩展它会产生以下结果:

(macroexpand '(somemacro))
Run Code Online (Sandbox Code Playgroud)

结果:

(let* [somevar "Value"] somevar)
Run Code Online (Sandbox Code Playgroud)

我有两个关于let*(带星号)的问题:

  • 这是什么意思?(特别是:它是否在某处记录?)
  • 为什么宏没有随着'正常'而扩展?(即,没有星号.)两者产生相同的结果(在我的实验中).有反例吗?

不幸的是,我找不到关于let*的任何"官方"文档,这就是我在这里问的原因.

我已经考虑过的来源:

(doc let*)  ; --> nil
(source let*)  ; --> source not found
Run Code Online (Sandbox Code Playgroud)
  1. https://clojuredocs.org/clojure.core - >我看到不让*在这里(虽然有例如列表*)
  2. https://clojuredocs.org/clojure.core/let - >在评论中只提到过一次,这对我来说并不完全清楚:

    Nota Bene:让Clojure就像让我们在Scheme中一样 - 每个init-expr都可以访问前面的绑定表单.(还有一个let*,但它或多或少都没有解构,实际上是底层实现.)

  3. 在Common Lisp中LET与LET* - >这个问题是关于常见的lisp,但也许它在Clojure中是一样的?
  4. 这个答案:https://stackoverflow.com/a/5084339/3398271

    在Clojure中,它基本上意味着"foo*就像foo,但有些不同,你可能想要foo".换句话说,这意味着该代码的作者无法为第二个函数提供更好的名称,因此他们只是在它上面打了一个星.

- >这是let和let*的情况吗?但如果是这样,问题仍然存在,究竟有什么区别?

  1. Scheme中let和let*有什么区别? - >这在Clojure中是一样的吗?

Sha*_*nce 17

let*是一个内部实现细节.let是一个实现的宏let*.https://github.com/clojure/clojure/blob/clojure-1.7.0/src/clj/clojure/core.clj#L4301

let添加参数解构let*.这是Clojure中的标准模式,xyz并且没有记录版本.一个例外是和.xyz**listlist*