【问题标题】:Practical Clojure: macros and Java interop实用 Clojure:宏和 Java 互操作
【发布时间】:2016-02-21 21:51:02
【问题描述】:

Practical Clojure关于 Java 互操作的章节中,作者注意到以下关于 Java 互操作“语法糖”的内容(例如 (.method object arguments) 而不是 (. object method arguments)):

由于这些“语法糖”扩展发生在与宏扩展相同的编译阶段,执行复杂代码生成的宏可能需要避免它们并使用新的 and . (点)直接特殊形式。

我不明白为什么在与宏扩展相同的阶段发生“语法糖”扩展是一个问题。是不是因为展开的顺序可能有问题?

【问题讨论】:

  • 您的问题到底是什么?您引用的文本中没有提到“问题”或“问题”一词。您能否详细说明您的意思,最好举个例子?
  • “可能需要避免它们”表明存在问题,但正如@amalloy 指出的那样,这不是技术限制。

标签: clojure macros clojure-java-interop


【解决方案1】:

与生成互操作调用有关的宏通常应该使用去糖的特殊形式,但这不是因为何时发生去糖,也不是问题。而且他们不必:比我想数的次数还要多,我见过有人写:

(defmacro call [obj method & args]
  `(~(symbol (str "." (name method))) ~obj ~@args))

与使用适当工具的外观相比,这简直是一团糟:

(defmacro call [obj method & args]
  `(. ~obj ~method ~@args))

【讨论】:

  • 好的,这是一个风格和良好实践问题,而不是技术限制。作者没有说清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2012-08-09
相关资源
最近更新 更多