Clojure deftype 中的可变字段?

2024-01-08

我正在尝试 Clojure 1.2,特别是受支持的可变字段deftype根据clojure.org 文档 http://clojure.org/datatypes.

但我无法让装置工作。更新字段的语法是什么?或者可变性还没有实现吗?

(definterface IPoint
  (getX [])
  (setX [v]))

(deftype Point [x]
  IPoint
  (getX [this] x)
  (setX [this v] (set! (.x this) v)))

user=> (def p (Point. 10))
user=> (.getX p)
10
user=> (.setX p 20)
ClassCastException: user.Point cannot be cast to compile__stub.user.Point

使用几天前的 1.2 快照。


deftype的默认值仍然是字段不可变;要覆盖它,您需要使用适当的元数据注释可变字段的名称。另外,语法为set!实例字段不同。使上述工作正常进行的示例实现:

(deftype Point [^{:volatile-mutable true} x]
  IPoint
  (getX [_] x)
  (setX [this v] (set! x v)))

还有:unsynchronized-mutable。区别正如经验丰富的 Java 开发人员从名称中所暗示的那样。 ;-) 请注意,提供任一注释都会产生使字段私有的额外效果,因此不再可能直接访问字段:

(.getX (Point. 10)) ; still works
(.x (Point. 10))    ; with annotations -- IllegalArgumentException, works without

另外,1.2 可能会支持语法^:volatile-mutable x作为简写^{:volatile-mutable true} x(这已经在一些新的数字分支上可用)。

这两个选项都在(doc deftype);相关部分如下——请注意警告!

字段可以被限定 与元数据 :volatile-mutable true 或 :unsynchronized-mutable true,此时方法将支持 (set!afield aval) 身体。请注意,可变字段极难使用 正确,并且存在只是为了促进更高的建设 Clojure 中的级别构造,例如 Clojure 的引用类型 本身。它们仅供专家使用 - 如果语义和 :volatile-mutable 或 :unsynchronized-mutable 的含义不是 您立刻就会明白,您不应该使用它们。

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

Clojure deftype 中的可变字段? 的相关文章

随机推荐

  • C#中如何获取对象的地址

    在c 中如何获取对象的地址 我搜索并发现 GCHandle handle GCHandle Alloc obj GCHandleType WeakTrackResurrection int address GCHandle ToIntPtr
  • 从二进制文件存储/加载 numpy 数组

    我想从二进制文件存储和加载 numpy 数组 为此 我创建了两个小函数 每个二进制文件应包含给定矩阵的维数 def saveArrayToFile data fileName with open fileName w as file a a
  • 我们可以从函数中按值返回具有已删除/私有复制/移动构造函数的对象吗?

    在 C 03 中 不可能按值返回具有私有非定义复制构造函数的类的对象 struct A A int x private A A const A f return A 10 error return 10 error too 我想知道 C 1
  • 使用 jsoncpp 迭代 JSON 对象数组

    我有一个 JSON 对象数组 例如 jsonArr 如下所示 attr1 somevalue attr2 someothervalue attr1 yetanothervalue attr2 andsoon 使用 jsoncpp 我尝试迭代
  • TWRequest 泄露?

    我在 ios5 中使用 Request 但 Leaks 报告 Request 内存泄漏 我正在做这样的事情 我是不是哪里出错了 TWRequest postRequest TWRequest alloc initWithURL NSURL
  • 无法将类型“float”隐式转换为“int”

    当我尝试运行以下代码时 出现错误 无法将类型 float 隐式转换为 int 我做了很多搜索 遗憾的是我无法找到针对此类错误的任何帮助 int sum1 cols rows float h twoEnds x sum1 h cols x t
  • android System.loadLibrary 加载文件的位置

    网上的一些文章告诉我System loadLibrary 将加载文件 data data app package 目录 我想知道这是否因每个供应商的实施而异或固定 最终由供应商来定义文件系统 文件系统布局 所以它可能在不同的地方 如果没有自
  • Html-loader + file-loader 未捆绑正确的图像源

    我计划在一个项目中使用 Webpack 并使用 Html loader file loader 设置我的工作流程 以获取带有图像动态 src 的生产 html 文件 正如 Colt Steele 所教的那样 这是我的 src 文件 索引 h
  • 如果程序的一部分表现出未定义的行为,它会影响程序的其余部分吗?

    假设程序员忘记初始化他的一个自动变量 并且他使用了它的值 从而调用了未定义的行为 int i 0 j printf value of j d n j char buf 256 fputs Enter query stdout fgets b
  • nvlink、可重定位设备代码和静态设备库

    在调查可重定位设备代码的一些问题时 我偶然发现了一些我不太理解的东西 这是如图所示的用例slide 6 http on demand gputechconf com gtc express 2012 presentations gpu ob
  • 无法使用 rarfile 模块提取 RAR 存档

    我一直在尝试制作一个提取 rar 文件的脚本 但收到错误 我一直在努力理解该模块的文档 但无济于事 我是编程新手 所以有时会迷失在所有文档中 这是我的代码的相关部分以及收到的错误 我的代码片段 import rarfile rarpath
  • 我可以在 Flutter 中使用自定义环境变量吗?

    我想以与我的同事不同的方式配置我们的日志库 并且我不想冒险检查我的本地配置 即 void main LOG minLevel Logger VERBOSE LOG showSymbols false runApp RestartWidget
  • 如何检测文本中的源代码?

    是否可以检测文本中的编程语言源代码 主要是 Java 和 C 例如我想知道本文中是否有源代码部分 text text text text text text text text text text text text text text t
  • 理解Java中的继承和抽象类

    好吧 我通过谷歌搜索寻找文档 但是我没有找到任何真正描述我想要回答的内容 所以我在这里问你们 所以我得到了继承 以及它是如何工作的 我遇到的问题是有时我看到一个对象最初定义为一种类型 然后设置为不同的类型 但我不明白到底发生了什么 这是一个
  • python 找到两个numpy数组的交点

    我有两个描述空间曲线的 numpy 数组 它们在一个点上相交 我想在两个数组中找到该交点的最近值 我有这段代码可以正常工作 但对于大量点来说它会变慢 from scipy import spatial def nearest arr0 ar
  • 在模板文字中使用条件语句

    我知道有更优雅的方法来定义包含变量的字符串 但如果我想在 ES6 之前添加一个条件 我会这样做 var a text conditional a b more text 现在使用模板文字我会做 let a if conditional a
  • 线程上的 Clojure 错误:java.lang.IllegalArgumentException:键必须是整数

    我对两件事感到困惑 一 错误消息本身 第二 这段代码启动了如此多的线程 我本以为它会启动 2 或 3 个线程来响应单个请求 但是当我在本地主机上运行它并将浏览器指向它 仅一次 时 它会启动 40 个线程 诚然 我使用的是 Chrome 它在
  • 我想在 JavaDoc 中添加 JavaScript

    div class en Documentation in English div div class nl Documentatie in Nederlands div public void myFunction 随后编辑 JavaDo
  • QT:qmake 无法识别 3dcore、3drender

    我在用qmake编译我的QT项目 在我的 pro文件我有一行 QT 3dcore 3drender 3dinput 3dextras 执行时qmake myprofile pro我收到错误 Project ERROR Unknown mod
  • Clojure deftype 中的可变字段?

    我正在尝试 Clojure 1 2 特别是受支持的可变字段deftype根据clojure org 文档 http clojure org datatypes 但我无法让装置工作 更新字段的语法是什么 或者可变性还没有实现吗 definte