質問: (0, -2); match pair { (0, y) => println!("first is `0` and `y` is `{:?}`", y), (x, 0) => println!("`x` is `{:?}` and last is `0`", x), _ => println!("it doesn't matter what they are"), } タプルが分解され、値も処理できる場所はどこですか?
回答: 超基本的な例を考えてみましょう。あなたの言語には、intとpairの2つのタイプしかありません。ペアは他のペアを保持できます。 「ケース」には、バインドされていない変数もあります。したがって、一致する値を渡すと、intまたはpairを持つことができます。一致するパターンは、int、pair、または非バインド変数にすることができます。次に、パターンマッチングアルゴリズムは次のようになります。if my pattern is an int, and the input is an int, if they're equal, do this. if my pattern is a var, assign the value to the var, and do this. if my pattern is a pair, and the input is a pair, then if pattern-match(pattern.first, value.first) && pattern-match(pattern.second, value.second), do this. otherwise, try the next pattern. シンボルとペアしかない基本的なlispの場合、必要なのはそれだけです。他の言語の場合、他のタイプや他の構造を処理するために基本を拡張する必要があるかもしれません。そしてうまくいけば、変更可能な状態になると、これがどのように危険になるかを見ることができます。