Kin*_*aro 17 clojure type-hinting
我有以下记录:
(defrecord Signal [samples ^double sample-rate ^double scaling-factor])
Run Code Online (Sandbox Code Playgroud)
如何指定samples为双数组?
我正在使用clojure 1.2.0
编辑:
@dreish当我(show Signal)从levand更改后调用时,我得到以下输出:
[35] <init> (Object,double,double)
[36] <init> (Object,double,double,Object,Object)
[37] __extmap : Object
[38] __meta : Object
[39] sample_rate : double
[40] samples : Object
[41] scaling_factor : double
Run Code Online (Sandbox Code Playgroud)
我知道暗示非原始类型只是用来避免反射.来自http://clojure.org/datatypes
谢谢大家!
lev*_*and 19
像这样:
(defrecord Signal [^doubles samples ^double sample-rate ^double scaling-factor])
Run Code Online (Sandbox Code Playgroud)
Rich Hickey补充说了一会儿:
为原始数组添加了特殊类型提示 - #^ ints,#^ floats,#^ longs,#^ double
有关其工作原理的讨论,请参见http://clojure.org/news.
我没有Clojure环境,看看这是否仍然是最好的方法.我假设#^语法更新为^以及1.2中Clojure中的所有其他类型提示
编辑:关于它的另一篇博文:http://asymmetrical-view.com/2009/07/02/clojure-primitive-arrays.html
我同意levand关于使用哪种类型提示的答案,但您可能想检查是否defrecord实际使用了这些类型提示.在我的安装(也是1.2.0)上,它没有.
user=> (defrecord Signal [^doubles samples ^double sample-rate ^double scaling-factor])
user.Signal
user=> (use '[clojure.contrib.repl-utils :only [show]])
nil
user=> (show Signal)
=== public final user.Signal ===
[stuff deleted]
[38] <init> (Object,Object,Object)
[39] __extmap : Object
[40] __meta : Object
[41] sample_rate : Object
[42] samples : Object
[43] scaling_factor : Object
[more stuff deleted]
Run Code Online (Sandbox Code Playgroud)
如您所见,构造函数参数(38)和成员变量(41-43)仍然只是Objects.(无论如何,数组都是引用,但有一天能够在实现该功能后将未装箱的数字存储在记录中会很好.)