【问题标题】:What do Clojure symbols do when used as functions?Clojure 符号在用作函数时有什么作用?
【发布时间】:2012-08-30 04:25:26
【问题描述】:

在尝试解决涉及重新实现评估的 4Clojure 问题“Universal Computation Engine”时,我不小心最终调用了这样的代码:

(apply '/ '(16 8))

而不是预期的:

(apply / '(16 8))

这有返回 8 的令人困惑的副作用,这让我觉得我搞砸了我的数学。

我后来在一些调试后意识到我的错误——我在尝试调用它之前未能评估/ 符号——因此意识到clojure.lang.Symbol 必须实现clojure.lang.IFn。但是那个实现做什么呢?我所能做的就是返回 nil 并带有一个参数,或者如果给定了第二个参数。

【问题讨论】:

标签: clojure


【解决方案1】:

符号在地图中自行查找,就像关键字一样。见Symbol's implementation

…
122 public Object invoke(Object obj) {
123         return RT.get(obj, this);
124 }
125
126 public Object invoke(Object obj, Object notFound) {
127         return RT.get(obj, this, notFound);
128 }
…

RTclojure.lang.RT,它几乎可以做所有事情。“RunTime”?)

在给出的示例中,查找失败(因为 16 不是映射),因此返回 notFound 值 (8)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2012-02-13
    • 2011-04-14
    相关资源
    最近更新 更多