Clojure 符号用作函数时有什么作用?

2024-03-08

在尝试解决 4Clojure 问题时”通用计算引擎 http://www.4clojure.com/problem/121”涉及重新实现评估,我不小心最终调用了这样的内容:

(apply '/ '(16 8))

而不是预期的:

(apply / '(16 8))

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

经过一些调试后,我后来意识到我的错误——我未能评估/尝试调用它之前的符号 - 因此意识到clojure.lang.Symbol必须执行clojure.lang.IFn。但是这个实现是做什么的do?我所能做的就是返回nil带有一个参数,或者第二个参数(如果给出)。


Symbols 抬头看看自己在地图中,就像关键字一样。看符号的实现 https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Symbol.java#L122:

…
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 }
…

(RT is clojure.lang.RT https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java,它几乎可以完成所有事情。 “运行”?)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clojure 符号用作函数时有什么作用? 的相关文章

  • Clojure deftype 在同一命名空间中调用函数会抛出“java.lang.IllegalStateException:尝试调用未绑定的 fn:”

    我将 Clojure 放入一个大量使用 Jersey 和注释的现有 Java 项目中 我希望能够利用之前工作中现有的自定义注释 过滤器等 到目前为止 我已经粗略地使用了 deftype 方法和 javax ws rs 注释 参见第 9 章C
  • 如何将 Clojure memfn 与 Java 构造函数一起使用?

    我想使用 Java 构造函数作为一流的 Clojure 函数 我的用例是将字符串序列转换为具有单个字符串构造函数的 Java 对象序列 简单的Java对象 public class Foo public Foo String aString
  • Clojure:在 let 绑定中展开 var

    我想在let不同功能的形式 比方说 def common assign x 10 y 20 一种方法是用eval eval defn foo let common assign hello world balala 问题是现在你必须引用所有
  • 什么是谓词调度

    我最近看到很多关于 Clojure 中谓词分派的讨论 想知道这件事是否有什么意义 换句话说 什么是谓词分派以及它与泛型函数 OOP 多态性和模式有何不同 谢谢 谓词分派包含泛型函数 OOP 多态性 模式匹配等 一个好的概述是谓词调度 统一的
  • Clojure:将哈希映射键字符串转换为关键字?

    我使用 Aleph 从 Redis 提取数据 apply hash map r hgetall key medication id 问题是这些数据返回时带有键字符串 例如 name Tylenol how instructions 当我需要
  • 如何在 Clojure 中处理大型二进制数据?

    如何在 Clojure 中处理大型二进制数据文件 我们假设数据 文件大约为 50MB 小到足以在内存中处理 但不是简单的实现 以下代码正确地从小文件中删除 M 但它会抛出OutOfMemoryError对于较大的文件 如 6MB defn
  • Clojure:避免埃拉托斯特尼筛中的堆栈溢出?

    这是我在 Clojure 中实现的埃拉托斯特尼筛法 基于 SICP 流课程 defn nats from n iterate inc n defn divide p q zero rem q p defn sieve stream lazy
  • Lisp / Clojure:编写函数生成宏是个好主意吗?

    这个问题 https stackoverflow com q 7852351 346587要求创建一个 Clojure 宏来生成多个函数 我们找到了一种方法来做到这一点 但仍被 这是一个好主意吗 的问题所困扰 我的第一反应是并不真地 有两个
  • 为什么我不能将 Clojure 的 :^const 与 Java 字节数组一起使用?

    Using lein repl使用 Clojure 1 4 0 我可以定义一个 constJava 字节数组的 但我不能用它做任何事情 user gt def x byte array map byte 0 1 2 3 user x use
  • 在 Clojure 中创建映射条目

    是什么built inClojure 方式 如果有 创建单个映射条目 换句话说 我想要类似的东西 map entry key value 换句话说 结果应该或多或少等于 first key value Remarks 当然 我已经尝试过谷歌
  • clojure 中的反转哈希映射

    我在 clojure 中有哈希映射 key1 value1 key2 value2 key3 value1 我需要将其转换为哈希映射 value1 key1 key3 value2 key2 有 Clojure 方法可以做到这一点吗 clo
  • 如何创建惰性序列向量

    运行它按预期工作 defn long seq n lazy seq cons list n somekey n 2 long seq n 1 take 3 long seq 3 gt 3 somekey 6 4 somekey 8 5 so
  • Clojure/Java:用于声音频谱分析的 Java 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以接受大量音频数据并返回给定频带内随时间变化的平均幅度的库 我已经在 comp dsp
  • 什么时候应该在 Clojure 中使用临时重新绑定特殊变量这一习惯用法?

    我注意到一些库 例如 clojure twitter 使用特殊的变量 用于动态绑定的变量 被星号包围 进行 oauth 身份验证 您将身份验证保存在 var 中 然后使用 with oauth myauth 我认为这是解决此类问题的一个非常
  • 从 JVM 线程本地空间卸载 Clojure 变量

    我正在 Clojure 中为 BaseX 编写一个插件 通过 lein uberjar 构建 并包含 Clojure 解释器 在大多数情况下 这效果很好 然而 当通过 BaseX HTTP 实例运行时 评估在 Jetty 的线程池内进行 而
  • 使用 ProGuard 混淆 clojure uberjar

    我想知道是否有人有使用 proguard 混淆他们的 leiningen 编译的 uberjar 的经验 我已经尽力在谷歌上寻找解决方案 但找不到真正的答案 我想知道这是否可能 我一直在尝试混淆默认的 lein 项目 这是 core clj
  • 将向量作为绑定传递给 for 宏时出现问题

    我有任意数量的列表 我想使用 for 宏来处理它们 我想创建一个传递向量作为绑定的函数 因为列表的数量各不相同 如果我对绑定进行硬编码 它会按我的预期工作 gt def list1 pink green gt def list2 dog c
  • Clojure读行函数问题

    我试图在我的 Clojure 程序中获取控制台输入 但是当它到达程序的该部分时它给我这个错误 Exception in thread main java lang ClassCastException clojure lang LineNu
  • 获取调用表单的名称空间

    我想要一个宏this ns这样它就会返回调用它的位置的名称空间 例如 如果我有这段代码 ns nstest main require nstest core as nstest defn ns str x gt x getName name
  • 如何在 Clojure 中链接 Promise

    在 Scala 中 您可以使用map and flatMap在未来的成功结果上运行函数 val x Future Int val y Future String x map toString 有没有比以下更好的 Clojure 类似物 de

随机推荐