考虑以下宏:
(defmacro somemacro []
(list 'let ['somevar "Value"] 'somevar))
展开它会得到以下结果:
(macroexpand '(somemacro))
结果:
(let* [somevar "Value"] somevar)
关于 let*(带星号)我有两个问题:
- 它是什么意思?(特别是:是否有记录在某处?)
- 为什么这个宏在使用“正常”的let时没有被展开呢?(即,没有星号的let。)两者产生相同的结果(在我的实验中)。是否存在反例?
不幸的是,我找不到任何关于let*的“官方”文档,这就是为什么我在这里提问的原因。
我已经考虑过的来源:
(doc let*) ; --> nil
(source let*) ; --> source not found
- https://clojuredocs.org/clojure.core --> 我看不到 let*,虽然有 list* 等函数。
- https://clojuredocs.org/clojure.core/let --> 在评论中只提到了一次,对我来说不太清楚:
Nota Bene:Clojure 中的 let 就像 Scheme 中的 let* -- 每个 init-expr 都可以访问前面的绑定形式。(也有一个 let*,但它更像是没有解构的 let,实际上是底层实现。)
- LET versus LET* in Common Lisp --> 这个问题是关于 Common Lisp 的,但在 Clojure 中可能是一样的吗?
- 这个答案:https://dev59.com/jG445IYBdhLWcg3wBVrz#5084339
在 Clojure 中,它基本上意味着 "foo* 就像 foo,但某种程度上不同,你可能想要 foo"。换句话说,这意味着该代码的作者无法想出第二个函数的更好名称,因此他们只是在其后加了一个星号。
--> let 和 let* 是否也是如此?但即使如此,问题仍然存在,究竟有什么区别?
- Scheme 中 let 和 let* 有什么区别? --> 在 Clojure 中是一样的吗?
if
和if*
对。与let
一样,文档不容易找到。我不知道if
是否解构,所以肯定还有其他事情发生了。 - Reb.Cabinif*
没有被记录,它可能是内部使用的,而不是用于公共消费。我查看了GitHub上的Clojure源代码,但GitHub的搜索功能会去掉*
。有很多if
的情况。我想答案是下载本地源代码并在本地运行grep
。 - Shannon Severancelet
等价物。Clojure的let
具有Scheme的let*
的语义。 - DaoWen