【发布时间】:2013-07-24 06:01:40
【问题描述】:
Lisp/Clojure 代码在语法上具有一致性,这是一个优点,因为不需要理解各种不同的结构。 但有时通过使用不同的语法来查看一段代码更容易理解,例如 this is a switch case 或 this is the pattern matching structure 等没有实际阅读文本。
几个月前我开始使用 Clojure,我意识到如果不阅读表单的名称,然后在谷歌上搜索它是宏还是函数以及它是如何工作的,我将无法理解代码。
事实证明,一段 Clojure 代码,无论语法的统一性如何,都是不统一的。
它可能看起来像一个函数,但如果它是一个宏,那么它可能不会评估它的所有参数。
是否存在所有宏都使用的命名约定或缩进样式,以便人们通过名称更容易掌握发生了什么?
【问题讨论】:
-
好问题。我认为没有办法仅通过观察来了解差异。作为一个初学者,你被告知语法很简单,一切都是 (fn args),那么你问为什么不 (apply or coll) ?或者为什么不(地图报价科尔)?哦,它们是宏(或特殊形式)。你只是学会猜测哪个是哪个。
-
hehe: (fn?+) true (fn?->) 不能取宏的值!而且,没有宏?还是特殊形式?但是,(:macro (meta #'->)) true
-
@Hendekagon:这是一个人从经验中学到的东西,但人们学习的不仅仅是猜测,而是做出有根据的猜测(通常是(接近)确定性)。以
(map quote coll)为例,由于语言的基本属性,quote不可能是函数,并且无论如何(map quote coll)是接收coll后评估的函数调用,所以不清楚是什么是有意的(尽管(map #(list 'quote %) ...)在宏定义中可能非常有用,只要...是宏可以访问的集合)。 -
@michal-marczyk 但原则上没有什么可以阻止引用作为函数,它只是不在 Clojure 中(例如,它是内核中的函数(或“操作”))
-
@Hendekagon:你也可以说没有什么可以阻止
if成为一个函数,因为你可以在 Haskell 中编写这样的函数。当然,很明显,在没有像 Clojure 这样普遍的惰性求值的语言中,这是不可能的,因此理解“语言的基本属性”(引用我上面的评论)会导致正确的期望。同样,与 Kernel 相比,Clojure 没有用于诱导评估的显式构造,因此无法具有有意义的quote函数。
标签: clojure clojurescript