/halfwayAcross 8.5 72 mul def % define the variables

% определяем переменные

/halfwayUp 11 72 mul def
/pageCenter {halfwayAcross halfwayUp} def

Теперь фрагмент кода pageCenter moveto перемещает CP в середину страницы.

В чем разница?

Отметим, что hal fwayAcross лучше было бы определить как процедуру, а не как переменную:

/halfwayAcross { 8.5 72 mul} def % define it as a procedure % определяем ее как процедуру В чем же разница? Когда halfwayAcross определяется как переменная, то оператор 8.5 72 mul выполняется раньше, чем def, и полученное значение связано с hal fwayAcross. Если же hal fwayAcross определена как процедура, то код 8.5 72 mul выполняется всякий раз, когда интерпретатор встречает hal fwayAcross в дальнейшем тексте сценария. Таким образом, оба варианта - с переменной и с процедурой - делают в конце концов одно и то же, хотя и различными способами: оба они проталкивают в стек значение 612. Однако в других случаях результат может быть ошибочным. Допустим, например, что мы попытаемся написать pageCenter как переменную:

/pageCenter halfwayAcross halfwayUp def

Данный код проталкивает первые три элемента в стек, а затем def выталкивает два верхних элемента и пытается осмыслить их, что приводит к ошибке.

Связывание процедур После определения процедуры можно поместить оператор bind: /bigCirc { 2 2 scale cire .5 .5 scale} bind def

Оператор bind не влияет на стек; в то же время он предписывает PostScript компилировать связанное с ним определение. Фактически bind «отыскивает» определение каждого слова внутри скобок, таких как scale и cire, и заменяет их соответствующим машинным кодом. Такой подход обладает следующими двумя преимуществами:

1. Когда процедура bigCirc вызывается в следующий раз, она будет выполняться быстрее, поскольку ее определение не нужно будет интерпретировать повторно.

2. Если какие-либо слова в определении, например drawDot, между вызовами были переопределены, то такое изменение никак не повлияет на bigCirc; с процедурой bigCirc связан исходный смысл слова cire.


⇐ Предыдущая| |Следующая ⇒