2012-04-26 12 views
0

でErlangのようなリファレンス私は(http://www.erlang.org/course/advanced.html#refs経由)のClojureでそれをエミュレートするために以下の機能や方法でデータ構造を探しています:トークンとClojureの

参照がちょうど二つのプロパティを持つオブジェクトをアーランされています

プログラムで作成することができます(make_ref/0を使用)。 これらは同等かどうか比較できます。

Erlangの参照は一意です。システムは、make_refとの異なる呼び出しによって作成された2つの参照が一度も一致しないことを保証します。保証は100%ではありませんが、ごくわずかですが、> 100%とは異なります。

特にオズ言語(http://www.mozart-oz.org/documentation/tutorial/node3.html)からのデータ型に名前を付ける:

名を作成するための唯一の方法です{NewName X}という名前のプロシージャを呼び出すことで、Xが割り当てられます>世界的に一意であることが保証されている新しい名前。名前は偽造または印刷することはできません。

Clojureのような動的言語では、 "偽造不可能な"値が疑わしいと聞こえますが、これは私が探しているものです。ヴァン・ロイは、コード内の信頼できるエンティティ間で共有セキュアトークンのために、後で上のいわゆる「安全なデータ構造」を作成し、しCTMでこの機能を使用しています。

declare NewWrapper in 
proc {NewWrapper ?Wrap ?Unwrap} 
    Key={NewName} 
in 
    fun {Wrap X} 
      fun {$ K} if K==Key then X end end 
    end 
    fun {Unwrap C} 
      {C Key} 
    end 
end 

% A secure declarative unbundled Stack 
declare NewStack Push Pop IsEmpty in 
local Wrap Unwrap in 
    {NewWrapper Wrap Unwrap} 
    fun {NewStack} {Wrap nil} end 
    fun {Push S E} {Wrap E|{Unwrap S}} end 
    fun {Pop S E} 
     case {Unwrap S} of X|S1 then E=X {Wrap S1} end 
    end 
    fun {IsEmpty S} {Unwrap S}==nil end 
end 

この動作は、Clojureのでエミュレートすることはできますか?このように私は保証することができます。そのプログラマーは、私が彼にトークンを与えた場合に限り、データ構造をアンラップすることができます。私はそれが安全ではないことに気づいていますが、私は、Van Royと機能的に同等で、少なくともプログラマーによって回避するのは難しい解決策を見出したいと思います。

次の要件は、JVMの魔法ではなく、純粋なClojureに基づいているためです。たとえば、関数値はAFAIK after(defn f [] nil )then(same?fx)はx = fに対してのみtrueと評価され、fは関数型言語の他の構造体と同様にメモリの最適化の対象となりません(またはそれは?)。しかし、このアプローチは私が気づいていないさらなる結果をもたらす可能性があります。上記の例の{NewName}を新しい匿名関数(非分散環境で提供)に置き換えることができますか?

答えて

5

gensymは、名前を付けるために使用できる一意のシンボルを生成することが保証されています。

user> (gensym 'token) 
token3783 
user> (gensym 'token) 
token3788 
user> (gensym 'token) 
token3793 
user> (gensym 'token) 
user> (def mine (gensym 'token)) 
#'user/mine 
user> (def yours (gensym 'token)) 
#'user/yours 
user> (= mine yours) 
false 
user> (= mine mine) 
true