Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Clojure代理生成类似java的类?_Clojure - Fatal编程技术网

如何使用Clojure代理生成类似java的类?

如何使用Clojure代理生成类似java的类?,clojure,Clojure,我想在Clojure中创建一个具有属性和方法的对象,我读到gen类和代理可以完成我需要的工作,但是它的实现对我来说非常混乱 我想使用代理来避免AOT编译步骤,我读过这方面的内容,我想我最好学习如何使用这两个步骤中比较简单的一个 以下是我想在Clojure做的事情 Java代码: public class MyClass { public float myFloat; MyClass( float _myFloat ) { myFloat = _myFloat

我想在Clojure中创建一个具有属性和方法的对象,我读到gen类和代理可以完成我需要的工作,但是它的实现对我来说非常混乱

我想使用代理来避免AOT编译步骤,我读过这方面的内容,我想我最好学习如何使用这两个步骤中比较简单的一个

以下是我想在Clojure做的事情

Java代码:

public class MyClass {
    public float myFloat;

    MyClass( float _myFloat ) {
        myFloat = _myFloat
    }

    public void showNumber() {
        println( myFloat );
    }
}
我正在努力使用proxys将代码翻译成Clojure,任何帮助都将不胜感激


更新:

显然deftype更适合我的目的,但我仍在努力实现它

这是我的Clojure代码:

(deftype Particle [x y]
  Object
  (render [this]
    (no-stroke)
    (fill 200 30 180)
    (ellipse x y 200 200)))
(defprotocol ParticleProtocol
  (update [this])
  (render [this]))

(deftype Particle [position]
  ParticleProtocol
  (update [this])
  (render [this]
    (no-stroke)
    (fill 200 30 180)
    (ellipse (.x position) (.y position) 20 20)))
问题是我需要指定一个协议,我不确定使用哪个协议,所以我使用Object,因为我试图创建一个类似java类的对象,但我得到以下错误消息:

无法定义不在接口中的方法:render

我使用的是quill,这是Clojure的处理端口,如果有帮助的话


更新2:

好的,我设法得到了一个工作的defprotocol和deftype组合,但我还需要做一件事,那就是向我的类添加成员变量或属性,下面是我的clojure代码:

(deftype Particle [x y]
  Object
  (render [this]
    (no-stroke)
    (fill 200 30 180)
    (ellipse x y 200 200)))
(defprotocol ParticleProtocol
  (update [this])
  (render [this]))

(deftype Particle [position]
  ParticleProtocol
  (update [this])
  (render [this]
    (no-stroke)
    (fill 200 30 180)
    (ellipse (.x position) (.y position) 20 20)))
对于这个对象,我想添加一些变量,如半径等,有什么想法吗?

您可以在
位置
旁边添加“变量”,如下所示:

(deftype Particle [position radius]
   ...
  )
(Particle. (atom (Position. 3 4)) (atom 5.0))
position
radius
不是真正的变量,它们更像是
final
属性。如果需要“改变”它们,则应将原子存储在其中,如下所示:

(deftype Particle [position radius]
   ...
  )
(Particle. (atom (Position. 3 4)) (atom 5.0))

但是你真的应该听从@m0skit0的建议,停止从对象和类的角度思考问题,开始从函数和不变的数据结构的角度思考问题。

我同意
deftype
(或者可能
defrecord
)比
proxy
更适合在Clojure中这样做,但是最后请看我的评论,考虑所有的可能性。< /P> 更新2后的问题

通过在arglist中指定“属性”,可以向记录添加“属性”:

(deftype粒子[位置半径prop3 prop4]
...
)
请记住,Clojure中的类型是不可变的,因此没有在创建实体后设置属性的概念。如果某些属性是可选的,建议最好创建帮助器“工厂”方法,如:

(定义生成粒子)
([位置](粒子位置为零)
([位置半径](粒子位置半径为零)
;等。根据需要在此处添加更多内容
)

一个考虑的选项是完全删除类型,只使用映射,其中包含了所需的“属性/字段”。当需要实现抽象时,类型很有用。对于您的partileprotocol-它提供了什么价值?协议是为了提供一种多态性的方法,所以您会有多个该协议的实现吗

Chas Emerick对如何在Clojure中选择数据类型做了深入的流程图,这可能会帮助您:


[显示地图实施示例的更新]

要使用“属性”构建地图并检索该属性,您需要执行以下操作:

(def mymap{:myfloat 3.1415926})
(println“myfloat有值:”(:myfloat mymap))
要提供附加功能,例如“渲染”功能,只需创建一个fn,该fn接受具有所需关键帧的贴图:

;;细节是假的,只是显示了语法
(定义渲染[m]
(无中风)
(填充(:半径m)(:位置m))
(做点别的(:位置m)))
对于
更新
,如果要更新粒子贴图中的值,则需要创建新贴图,而不是更新现有贴图

(def myparticle{:位置100:半径25})
(定义更改位置[粒子贴图新位置]
(粒子贴图中的关联[:位置]新位置))
(让[新粒子(更改位置myparticle 300)]
(新粒子)
;; 打印出{:位置300:半径25}
;; 原始myparticle仍然具有值{:位置100:半径25}
;; 或者直接做
(打印项次(关联粒子:位置300))
;; 打印出{:位置300:半径25}

Offtopic:如果你要在Clojure中开发,你必须停止以面向对象的方式思考。谢谢,好的,停止思考OO,所以不变的数据结构我会做我的家庭作业。非常感谢,我对这门语言很陌生,所以大多数这些东西对我来说都是新的,我正在学习。请允许我提供一个使用maps实现的示例?好的。我添加了一组简单的示例。如果没有告诉我你想要什么,请告诉我。