2012-09-11 52 views
3

我有兩個變量的簡單函數作爲如何避免stackunderflow(使用不同的參數#)中的PostScript

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

(var2)(var1)func 

我要讓VAR2可選。但是,如果不提供var2,則會導致stackunderflow錯誤。我如何才能讓if語句只在​​棧不爲空時才捕獲var2,並且如果棧是空的,可能會分配一個默認值。

喜歡的東西

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

回答

4

count操作計算堆棧上操作數的數目。您可能希望改爲使用[在堆棧上放置標記,然後改爲使用counttomark。這可以節省您在操作數從其他例程調用時被操作數遺留或未被使用的困擾。當然,這意味着你必須提供[作爲堆棧中的操作數。

另一個通常的方法是爲具有頂部的操作數是一個整數的計數操作數附加數..

1

另一個通常的方法是使用最上面的操作數的類型來確定多少操作數尋找。

這裏的落實rotate運營商,這是否一種方法:

/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 
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