チャペルは、固定サイズの n 次元配列とタプルに焦点を当てているようです。一見すると、動的なデータ構造がないように見えます。
特定の問題の 1 つは、連想配列のサイズを事前に宣言する必要があるように見えることです。他の言語の地図と辞書は、このように制限されません。
チャペルにはもっと動的なマップ/辞書タイプがありますが、私はそれを見逃しましたか?
チャペルは、固定サイズの n 次元配列とタプルに焦点を当てているようです。一見すると、動的なデータ構造がないように見えます。
特定の問題の 1 つは、連想配列のサイズを事前に宣言する必要があるように見えることです。他の言語の地図と辞書は、このように制限されません。
チャペルにはもっと動的なマップ/辞書タイプがありますが、私はそれを見逃しましたか?
まず、あなたの質問に対する答えはイエスです。マップ/辞書に相当する組み込みのものは、チャペルの連想配列です。連想配列のプライマーを参照してください。
たとえば、有名人の名前から誕生年までの辞書を宣言してみましょう。
最初に、名前を含むドメイン (つまり、インデックス セット) を作成します。
var setOfNames : domain(string); // a domain (set) whose indices are strings
domain(t) の型宣言 (t は何らかの型) は、連想ドメインを作成します。
次に、そのドメイン上に整数の年齢を格納する配列を作成します。実際には、string -> int からマップを作成します。
var nameToBirthYear : [setOfNames] int;
誰かをセットに追加するには、最初にドメインに追加してから、その誕生年を配列に設定する必要があります。
setOfNames.add("Thomas Jefferson");
nameToBirthYear["Thomas Jefferson"] = 1743;
setOfNames.add("Alan Turing");
nameToBirthYear["Alan Turing"] = 1912;
Chapel は、同じドメイン上で複数のアレイをサポートするように設計されています。したがって、出生地も個別に知りたい場合は、それを追跡するために別の配列を作成できます。
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";
デモンストレーションとして、インデックス セットをループし、関連する配列要素を出力します。(このループはzippered反復でより意味があることに注意してください.
for name in setOfNames {
var birthYear = nameToBirthYear[name];
var birthPlace = nameToBirthPlace[name];
writeln(name, " started out in ", birthPlace, " in the year ", birthYear);
}
これらの連想配列とドメインは現在、ハッシュテーブルで実装されていることに注意してください。カスタムの連想配列の実装を作成したり、赤黒ツリーなどのカスタム (非配列) データ構造を作成したりできます。
将来的には、キーと値のペアを連想配列に直接追加できる日が来るかもしれません (配列のドメインを明示的に言及する必要はありません)。1-D 配列は、ドメインが他の配列と共有されていない場合に、このような機能をサポートします (配列ベクトル操作の入門書を参照してください)。