2012-09-11 3 views
3

У меня есть простая функция с двумя переменными, какКак избежать stackunderflow (используйте переменные # аргументов) в PostScript

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

(var2)(var1)func 

Я хочу сделать var2 необязательными. Однако, если не предоставить var2, это приведет к ошибке потока. Как я могу сделать оператор 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 

 Смежные вопросы

  • Нет связанных вопросов^_^