- ポイントは、ambの中のshiftでキャプチャされた継続kを呼び出すと、resetに渡された式を最後まで評価した後、kの呼び出し元に戻ってくる事。基本的に↓という感じ。
- a = amb(1, 2, 3)
- shift{k:(Int => Unit) => elements.foreach(k)}
- foreach x in (1, 2, 3) 1. k(x)が呼び出されるて、shiftからxが返る(==> aがxに束縛される) 2. block { ... } の最後まで評価した後、k(x)の呼び出し元、つまりforeachの内側に戻ってくる
- b = amb("A", "B", "C")
- shift{k:(String => Unit) => elements.foreach(k)}
- foreach y in ("A", "B", "C") 1. k(y)が呼び出されて、shiftからxが返る(==> bがyに束縛される) 2. block { ... } の最後まで評価した後、k(y)の呼び出し元、つまりforeachの内側に戻ってくる