将记录从一个函数传递到另一个函数,然后在Clojure中分配值

将记录从一个函数传递到另一个函数,然后在Clojure中分配值,clojure,record,Clojure,Record,我刚开始学Clojure。我有一个函数,我用键创建一个记录。现在,我希望将记录传递给另一个函数,在这个函数中,我可以将一些数据绑定到标签。我试过了 (defn structure[] (let [record1 (defrecord rec1 [field1 field2])] record1)) (defn init-structure[record] (def initialized (record. name 23))) (defn -main[] (println (init-str

我刚开始学Clojure。我有一个函数,我用键创建一个记录。现在,我希望将记录传递给另一个函数,在这个函数中,我可以将一些数据绑定到标签。我试过了

(defn structure[]
(let [record1 (defrecord rec1 [field1 field2])] record1))

(defn init-structure[record]
(def initialized (record. name 23)))

(defn -main[]
(println (init-structure structure)))


我希望输出为
{:field1 name:field2 23}
。但是,clojure向我抛出了一个“无法解析classname:record”错误……我如何从这里开始?

您创建了一个名为
rec1
的新记录类型,但后来尝试调用
record。

另外,您正在调用
init structure
,其中引用了
structure
,这可能不是您想要的。 通常,应在函数之外使用以
def
开头的特殊形式或函数

下面是一个例子:

(defrecord rec1 [field1 field2])

(defn init-structure []
  (rec1. "name" 23))

(defn -main []
  (println (init-structure)))


通常,您会使用REPL来处理代码,而不是一直尝试使用
-main
。这是Clojure有趣的事情之一。编写一两个函数,在REPL中进行计算,调用它,看看它是否完成了它应该做的事情。

您创建了一个名为
rec1
的新记录类型,但后来尝试调用
record。
我建议此时不要使用记录。改用地图。使用记录会以不必要的方式“冻结”程序。以后可以从地图切换到记录。另外,广泛使用Clojure规范和Clojure测试。非常感谢..我修改了你的答案,它成功了..我在函数中创建的记录不能作为参数发送给另一个吗?我正在从结构返回record1,我正在考虑在init结构中使用它…我还尝试做一些类似(init结构(structure))…这样结构返回的值就可以被init结构使用…您没有从
结构返回记录,而是返回
defrecord
的结果,不是唱片本身
defrecord
返回一个类对象。Defrecord还创建各种函数来创建实际记录。i、 defrecord实际上更像是一个类型声明,而不是创建一个特定类型的对象