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