【发布时间】:2019-08-14 06:00:22
【问题描述】:
我正在学习 clojure,遇到了这种与主机平台互操作的语法。
(.toUpperCase "fred")
-> "FRED"
(.getName String)
-> "java.lang.String"
我很好奇这是如何实现的。文档说它们在扩展时扩展为点特殊形式,就像这样
(.instanceMember instance args*) ==> (. instance instanceMember args*)
这里似乎发生了一些特殊的行为。通常,宏调用中的第一个参数只是宏符号。然而,在这种情况下,(. 在某种程度上是一个通用宏,它根据调用中的第一个参数在(. 之后立即扩展为不同的东西,例如(.toUpperCase ... 或(.getName ...。
那么这是如何实现的呢?实现宏是否使用了一些我不知道的特殊语法来获得该行为,或者该类型的宏实现行为在用户空间中不可用。它使用的是实际宏还是阅读器宏?
【问题讨论】:
标签: clojure clojurescript