【发布时间】:2015-10-18 02:47:42
【问题描述】:
考虑以下宏:
(defmacro somemacro []
(list 'let ['somevar "Value"] 'somevar))
展开它会产生以下结果:
(macroexpand '(somemacro))
结果:
(let* [somevar "Value"] somevar)
我有两个关于 let*(带星号)的问题:
- 这是什么意思? (特别是:它是否记录在某处?)
- 为什么宏没有用“普通”let 展开? (即,不带星号。)两者都产生相同的结果(在我的实验中)。有反例吗?
不幸的是,我找不到任何关于 let* 的“官方”文档,这就是我在这里问的原因。
我已经考虑过的来源:
(doc let*) ; --> nil
(source let*) ; --> source not found
- https://clojuredocs.org/clojure.core --> 我在这里看到 not let* (虽然有例如列表*)
-
https://clojuredocs.org/clojure.core/let --> 只提到过一次
评论,这对我来说并不完全清楚:
注意事项:Clojure 中的 let 就像 Scheme 中的 let* —— 每个 init-expr 都可以访问前面的绑定形式。 (还有一个let*,但多多少少是不解构的let,其实是底层实现。)
- LET versus LET* in Common Lisp --> 这个问题是关于 common lisp 的,但在 Clojure 中可能是一样的?
- 这个答案:https://stackoverflow.com/a/5084339/3398271
在 Clojure 中,它的基本意思是“foo* 与 foo 类似,但有些不同,你可能想要 foo”。换句话说,这意味着该代码的作者无法为第二个函数想出更好的名称,所以他们只是给它打了一颗星。
--> let 和 let* 是这种情况吗?但如果是这样,那么问题仍然存在,到底有什么区别?
- What is the difference between let and let* in Scheme? --> Clojure 也是这样吗?
【问题讨论】:
-
显然还有一对
if和if*。与let一样,文档也不容易找到。我不知道if会解构,所以肯定有其他事情发生。 -
@Reb.Cabin,有趣。
if*没有被记录在案,它可能是内部的,不适合消费。我查看了 GitHub 上的 Clojure 源代码,但 GitHub 的搜索将*删除了。if的案例很多。我想答案是在本地下载源代码并在本地运行grep。 -
Clojure 没有 Scheme 的
let等价物。 Clojure 的let具有 Scheme 的let*的语义。
标签: clojure