3

私はこのようなものを持っています:

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"

したがって、基本的に頂点を別の名前にバインドすることはできません。関数や let などに defrecord 型を渡そうとしても同じことです。これはなぜですか? defrecord の名前を一時的に変更するにはどうすればよいですか?

Java相互運用性に関係するトリックだと思います。

4

2 に答える 2

3

これは私の知る限り不可能です。

defrecord がどのように機能するかを考えると、実際には、バイト コードによって (Java) クラスが生成されます。ある名前空間で defrecord を実行し、それを別の名前空間で使用したい場合、これを実際に見ることができます...

(ns my-first-namespace)
(defrecord Foo [x y])

(ns my-second-namespace
   (:use my-first-namespace)
   (:import my_first_namespace Foo)) ; still have to import the java class 
                                     ; underlying the defrecord even tho 
                                     ; the defining namespace is use'd (note 
                                     ; hyphen / underscore changes). 

残念ながら、クラス名を別のクラス名にエイリアスする Java (実際には JVM) には方法がありません。あなたが得ることができる最も近いのは、新しい名前にサブクラス化することですが、それはかなり粗雑です.

于 2012-04-07T17:13:52.813 に答える