チャペルは、固定サイズのn次元配列とタプルに焦点を当てているようです。一見、動的なデータ構造がないように見えます。チャペルには動的なデータ構造がありますか?
特に重要な点は、結合配列のサイズを事前に宣言する必要があるように見えることです。他の言語の地図や辞書はこのように制限されていません。
チャペルはもっとダイナミックなマップ/辞書タイプを持っていますが、私はそれを見逃しましたか?
チャペルは、固定サイズのn次元配列とタプルに焦点を当てているようです。一見、動的なデータ構造がないように見えます。チャペルには動的なデータ構造がありますか?
特に重要な点は、結合配列のサイズを事前に宣言する必要があるように見えることです。他の言語の地図や辞書はこのように制限されていません。
チャペルはもっとダイナミックなマップ/辞書タイプを持っていますが、私はそれを見逃しましたか?
まず、あなたの質問に対する答えは「はい」です。マップ/ディクショナリに相当するビルトインはChapelの連想配列です。 associative arrays primerを参照してください。
たとえば、有名人の名前から誕生年までの辞書を宣言しましょう。
まず、名前が含まれます、ドメイン(すなわちインデックスセット)を作成:ドメインの
var setOfNames : domain(string); // a domain (set) whose indices are strings
タイプ宣言(t)は、tはいくつかのタイプで、連想ドメインを作成します。
次に、整数年齢を格納するドメイン上に配列を作成します。実際には、string - > intからマップを作成します。
var nameToBirthYear : [setOfNames] int;
誰かをセットに追加するには、まずそれらをドメインに追加して、その誕生年を配列に設定する必要があります。
setOfNames.add("Thomas Jefferson");
nameToBirthYear["Thomas Jefferson"] = 1743;
setOfNames.add("Alan Turing");
nameToBirthYear["Alan Turing"] = 1912;
チャペルは、同じドメインで複数のアレイをサポートするように設計されています。ですから、出生地を別に知りたければ、別の配列を作成してそれを追跡することができます。
var nameToBirthPlace : [setOfNames] string;
nameToBirthPlace["Thomas Jefferson"] = "the Colony of Virginia";
nameToBirthPlace["Alan Turing"] = "London, England";
ここで、新しい有名人を追加する場合はどうなりますか?
setOfNames.add("Ada Lovelace");
// note now that both nameToBirthYear and nameToBirthPlace now have
// a value for the key "Ada Lovelace". That new element starts out with
// the default value - so it's 0 and the empty string in this case.
nameToBirthYear["Ada Lovelace"] = 1815;
nameToBirthPlace["Ada Lovelace"] = "London, England";
デモンストレーションとして、インデックスセットをループして関連する配列要素を出力します。 (このループは、ジッパー付きの反復ではより意味をなさないことに注意してください。しかし、私はこの例を連想配列やドメインに集中させようとしています)。
for name in setOfNames {
var birthYear = nameToBirthYear[name];
var birthPlace = nameToBirthPlace[name];
writeln(name, " started out in ", birthPlace, " in the year ", birthYear);
}
これらの連想配列およびドメインは現在、ハッシュテーブルで実装されています。カスタム連想配列の実装を作成したり、赤黒のツリーや必要なもののカスタム(非配列)データ構造を作成することは可能です。
将来的には、配列のドメインに明示的に言及することなく、キーと値のペアを連想配列に直接追加することは可能かもしれません。 1-D配列は、ドメインが他の配列と共有されていない場合にそのような機能をサポートします(array vector operations primer参照)。
連想配列を反復処理する方法は? (k、v)in zip(x.domain、x){...} 慣用方法ですか? –
はい、zip(x.domain、x)の(k、v){...}は慣用的な方法です – mppf