9.引き金
9.1 置換引き金
置換引き金に対する構文は次のとおりである。
"on" "replace"
[旧値]
[ "[" 最低索引値 ".." 最高索引値 "]" "=" 新要素 ]
区画
置換引き金は、引き金を取り付けた変数に対するすべての変更に続いて呼び出される。構文上の非終端子である旧値、最低索引値、最高索引値、および新要素は、その本体が区画であるところの関数に対する、事実上の仮引数である。
・旧値は変数の事前の値であり、変数と同じ型を持つ。
・最低索引値と最高索引値は、旧値において置換対象となる部分の範囲を区切る。それらの型はIntegerである。純然たる挿入に対しては、「最高索引値==最低索引値-1」である。
・新要素は、部分列「旧値[最低索引値..最高索引値]」を置き換える値の列である。その型は変数と同じである。
引数「[最低索引値..最高索引値]=新要素」は、引き金が取り付けられた変数が列型であるときのみ認められる。
旧値と新要素は非対称であることに留意せよ。すなわち、旧値は、引き金が取り付けられた変数の事前の値であるのに対し、新要素は、その変数で変更される要素のみを含んでいる新値の部分列であるということである。
置換引金の構文は、部分列の割り当てを思い起こさせるようになっている。次を想定する。
attribute x
on replace oldVal[lo..hi]=newVals { exp };
var save = x;
x[i..j] = y;
すると、oldVal はsaveに、loはiに、hiはjに、そしてnewValsはyに結びつけられた上で、expが評価される。
統合置換引き金は、部分列の割り当てとうまく機能する。たとえば、次のように結合を定義することができる。
attribute x;
attribute y = bind x;
これは次と等価である。
attribute x =
on replace [i..j]=n
{ y[i..j]=n };
attribute y = [];
次のように、yがxの写像だとする。
attribute x;
attribute y = bind for (xi in x) f(xi);
これは次と等価である。
attribute x =
on replace [i..j]=n
{ y[i..j] = for (k in n) f(k) };
attribute y = [];
列の要素のある範囲を削除または置換すること、もしくは列を一箇所に挿入することは、すべて単一の引き金呼び出しに帰着する。述語条件を満たすすべての要素の削除のような、別の演算のあるものは、複数の引き金呼び出しに分解できるかもしれない。In that case the state as seen by each trigger invocation is consistent in the sense that the programmer-visible state is as if the predicate-delete (for example) were implemented as a set of independent slice-delete operations.
陳謝:最後の文は、拙には何が言いたいのか判然としないため、原文のまま載せておきます。m(_ _;)m
0 件のコメント:
コメントを投稿