3

私は2つの変数を持つ単純な関数を持っています

/func {
/var1 exch def
/var2 exch def
... process ...
} def

(var2)(var1)func

var2 をオプションにしたい。ただし、var2 を指定しないと、stackunderflow エラーが発生します。スタックが空でない場合にのみ var2 をキャッチし、スタックが空の場合はおそらくデフォルト値を割り当てる if ステートメントを作成するにはどうすればよいですか。

何かのようなもの

(Stack is no empty) {/var2 exch def}{/var2 (default) def} ifelse
4

3 に答える 3

4

count演算子は、スタック上のオペランドの数をカウントします。[代わりに を使用してスタックにマークを付け、代わりに を使用することもできcounttomarkます。これにより、ルーチンが他のルーチンから呼び出されたときに、オペランドが残っていたり、まだ使用されていなかったりして混乱することがなくなります。もちろん[、スタックのオペランドとして を指定する必要があることを意味します。

もう 1 つの通常の方法は、最上位のオペランドを、追加のオペランドの数をカウントする整数にすることです。

于 2012-09-11T12:46:39.057 に答える
2

さらに別の方法は、名前付きパラメーターの辞書を渡すことです。あなたの例を変更しています...

/func { %<<params>>
%begin currentdict /var2 2 copy known not {(default) put}{pop pop} ifelse
<</var2(default)>> copy begin
% ... process ...
end } def

<<
/var1 (var1)
/var2 (var2)
>> func
于 2012-09-18T18:18:46.450 に答える
1

もう 1 つの一般的な方法は、最上位のオペランドの型を使用して、検索するオペランドの数を決定することです。

rotateこれを行う演算子を実装する 1 つの方法を次に示します。

/rotate { % angle ([matrix])?  rotate  -|[matrix]
    dup type /arraytype ne 
        { true exch matrix } % no array: create array, concat later
        { false 3 1 roll } % array: do not create, do not concat later
    ifelse                    % bool angle matrix
    dup 0                     % bool angle matrix matrix 0
          3 index cos put     % bool angle matrix
    dup 1 3 index sin put     % bool angle matrix
    dup 2 3 index sin neg put % bool angle matrix
    dup 3 4 3 roll cos put    % bool matrix
    exch { concat } if % [matrix]
} def
于 2012-09-16T01:19:05.600 に答える