相关疑难解决方法(0)

让我们在Clojure中结束

我知道它们是不同的,因为一个用于设置*compile-path*,一个不用.但是,我需要帮助他们为什么不同.

let使用给定的绑定创建一个新的范围,但是binding......?

binding clojure let

68
推荐指数
3
解决办法
2万
查看次数

如何以惯用的clojure方式重复n次?

在Ruby中,"str" * 3会给你"strstrstr".在Clojure中,我能想到的最接近的是,(map (fn [n] "str") (range 3))是否有更惯用的方法呢?

clojure

34
推荐指数
4
解决办法
8996
查看次数

使 Clojure 的 defprotocol 与现有函数一起玩得很好(多态)

我如何编写一个defprotocol(并defrecord实现它)来声明一个与现有函数同名的方法,并动态分派到协议/记录的方法,如果我用协议/记录的实例调用它,否则分派到现有的功能?

例如,我想创建一个支持基本算术的几何助手(在这个例子中只是乘法,以保持简短):

(defprotocol SizeOps
  (* [this factor] "Multiply each dimension by factor and return a new Size"))
Run Code Online (Sandbox Code Playgroud)

在这一点上,我已经从编译器那里得到了一些不祥的预感:

警告:协议#'user/SizeOps 正在覆盖函数 *
警告:* 已经引用:#'clojure.core/* 在命名空间中:user,被替换为:#'user/*

然后实现:

(defrecord Size [width height]
  SizeOps
  (* [this factor] (Size. (* width factor) (* height factor))))
Run Code Online (Sandbox Code Playgroud)

编译没问题,但是当我尝试使用它时,它唯一*知道的是我的协议中的那个:

(* (Size. 1 2) 10)
Run Code Online (Sandbox Code Playgroud)

IllegalArgumentException 没有方法的实现::* of protocol: #'user/SizeOps found for class: java.lang.Long

我可以通过*在我的实现中完全指定核心函数来解决这个问题:

(defrecord Size [width height]
  SizeOps
  (* [this factor] (Size. (clojure.core/* width factor) (clojure.core/* height …
Run Code Online (Sandbox Code Playgroud)

operator-overloading clojure clojurescript

4
推荐指数
1
解决办法
731
查看次数