1

我有一些预定义的函数和记录的 clojure 文件

;outer.clj
(ns outer )
(defn foo [a] (println a))
(defrecord M [id])

现在使用文件

;inner.clj
(ns inner (:use outer ))
(foo 2)    ;works fine
(println (:id (M. 4))) ;throws IllegalArgumentException: Unable to resolve classname: M

为什么函数导入正常但记录定义不行?我应该如何导入它?

4

2 回答 2

5

因为 defrecord 会“隐藏”生成一个 JVM 类,所以您需要导入该类...

;inner.clj
(ns inner 
    (:use outer )
    (:import outer.M)
(foo 2)    ;works fine
(println (:id (M. 4))) ; works with import
于 2012-08-02T08:15:47.523 回答
4

虽然 sw1nn 是正确的,但从 1.3 开始,您无需进行单独的导入。两者都defrecord创建构造函数,就像任何其他函数一样deftype,它可以通过use/获得。require

两者创建的函数都遵循格式->MyType并采用位置参数。

此外,defrecord创建第二个构造函数,该函数采用映射 arg, map->MyRecord

于 2012-08-02T18:40:51.130 回答