次の機能を備えたデータ構造、または Clojure でエミュレートする方法を探しています ( http://www.erlang.org/course/advanced.html#refs経由):
参照は、正確に 2 つのプロパティを持つ erlang オブジェクトです。
これらはプログラムで作成でき (make_ref/0 を使用)、同等かどうかを比較できます。
Erlang 参照は一意であり、システムは make_ref への >異なる呼び出しによって作成された 2 つの参照が決して一致しないことを保証します。保証は 100% ではありませんが、100% 以上とはわずかに異なります :-)。
特に Oz 言語の Name データ型 (http://www.mozart-oz.org/documentation/tutorial/node3.html):
名前を作成する唯一の方法は、プロシージャ {NewName X} を呼び出すことです。ここで、X は世界的に一意であることが保証されている新しい名前に割り当てられます。名前を偽造または印刷することはできません。
特にClojureのような動的言語では、「偽造不可能な」値は疑わしいように聞こえますが、これは私が探しているものです. Van Roy は 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 に基づくことです。したがって、「token = new Object()」などはありません。たとえば、AFAIK after (defn f [] nil) then (identical ? fx) は x=f の場合にのみ true と評価され、f は関数型言語の他の構造のようにメモリ最適化の対象ではありません (またはそうですか?)。ただし、このアプローチは、私が認識していないさらなる結果をもたらす可能性があります。上記の例の {NewName} を新しい無名関数 (非分散環境の場合) に置き換えることはできますか?