gpt4 book ai didi

java - 为什么我不能在 clojure 中绑定(bind) defrecord?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:52:34 27 4
gpt4 key购买 nike

我有这样的东西:

user> (defrecord vertex [id val]) => user.vertex
user> (def v vertex) => #'user/v
user> (= v vertex) => true
user> (type v) => java.lang.Class
user> (type vertex) => java.lang.Class
user> (vertex. 1 2) => #user.vertex{:id 1, :val 2}
user> (v. 1 2) => "Unable to resolve classname v"
user> (new v 1 2) => "Unable to resolve classname v"

所以基本上我无法将顶点绑定(bind)到另一个名称。尝试将 defrecord 类型传递给函数、let 或其他任何东西也是如此。为什么会这样,我该怎么做才能临时重命名 defrecord?

我猜这是与 Java 互操作有关的一些技巧。

最佳答案

defrecord 生成一个 Java 类,我认为它实际上被视为 Clojure 中的一种特殊情况,特别是在互操作方面(尽管我并不肯定)。

如果您的目标是能够轻松地传递一个可以创建顶点的函数,那么解决方案是使用调用构造函数的本地函数,而不是自己进行互操作。

在 Clojure 1.3 中,deftype 和 defrecord 自动生成两个额外的方法:

  • ->{type}相当于构造函数
  • map->{type} 将参数映射作为参数

对于上面的内容,(->vertex 1 2)(map->vertex {:id 1 :val 2}) 起作用,并且允许你做您所追求的 build 。

如果您在传递类时确实需要可用的类,您可以使用宏来做一些事情,但我不确定。

关于java - 为什么我不能在 clojure 中绑定(bind) defrecord?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10055965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com