3

我有一个带有两个变量的简单函数

/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

3 回答 3

4

运算符计算堆栈上的count操作数。您可能想改为使用[在堆栈上放置一个标记,然后counttomark改为使用。当从其他例程调用您的例程时,这可以避免您对剩余或尚未使用的操作数感到困惑。当然,这意味着您必须将 提供[为堆栈上的操作数。

另一种常用的方法是让顶部操作数是一个整数,计算附加操作数的数量。

于 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

另一种常用的方法是使用最顶层操作数的类型来确定要查找多少个操作数。

这是实现执行此操作的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
于 2012-09-16T01:19:05.600 回答