(私はさらに別の質問に戻ってきました:-))
次の PostScript コードがあるとします。
/riverside { 5 pop } def
/star { 6 pop 2 {riverside} repeat } def
star
ネストされたプロシージャをどのように処理する必要があるのか 疑問に思っています。(私は自分のインタープリターを作成しています)。 star プロシージャを実行すると、途中で nameObjec(riverside) が見つかり、riverside プロシージャの値を含む実行可能配列に置き換えて実行します。繰り返し演算子を実行すると、スタックにアイテムが 1 つしか残っていないため、インタープリターがクラッシュします。
既に実行可能配列 (=prodecure) にいるときに実際に実行可能配列 (=procedure) を直接実行する必要がありますか、それとも実行可能配列 (=procedures) を常に (operand?/execution?) スタックにプッシュする必要がありますか? または別のオペレーターによってのみ実行されますか? この川岸は何回処刑されるべきか?(2回か3回?)2回かな?
参考までに: これは、3 行目でstarを実行したときの状況です(エラーを参照)。
% begin execute 3rd line (star)
% OP = operand stack
% EX = execution stack
% handle 6
OP: 6
EX: star
% handle pop (removes 6 from OP)
OP: -
EX: star
% handle 2
OP: 2
EX: star
% set the riverside executable array on the EX, execute the values
OP: 2
EX: star riverside
% repeat operator:
CRASH, only one item on the OP left, but repeat operator requires 2 operands.
OP: 5
EX:
% end
この問題はやや複雑/紛らわしいので、光を当ててください:-)
更新: 別のコード サンプルは次のようになります。
/starside
{ 72 0 lineto
currentpoint translate
-144 rotate } def
/star
{ moveto
currentpoint translate
4 {starside} repeat
closepath
gsave
.5 setgray fill
grestore
stroke } def
200 200 star
showpage
インタプリタが/star { moveto をトークン化するとき ...ネストされた{starside}に遭遇した場合、それはどのように扱われますか? (+ {starside}だけでなく{starside 5 2 mul pop}があったとしたら?)