引言:
这是第二篇关于 PostScript 的系列文章。本文的主要目的是论述堆栈的操作。操作数栈可能是 PostScript 中最主要的部分。赋值、算术或数学运算、循环和逻辑运算都在这块特殊的存储区内进行。是的!堆栈是一块特殊的存储区,被 PostScript 用来执行几乎所有我们要求它完成的操作。堆栈以后进先出的规则保持信息。你可以把它形象化成一根一端封闭的导管。当你向它里面放入某物时,它会将管内所有 的东西都推向封闭的一端以释放出空间。因此,最后进入的元素总是离开口的那一端最近。堆栈内的元素可以是字符串、数字常量、键码、数据块……
栈操作符
虽然堆栈内的元素已经排列有序,但同时还存在着一些允许我们重新对这些元素进行排列的栈操作符。这些操作应用于堆栈内的一个或多个元素。操作符按其定义操纵堆栈内的元素。它们是否需要参数(在 PostScript 的术语中被称为操作数)依所进行的操作而定。若需要参数,则它们首先必须被推入堆栈中。之后,操作符依据这些参数采取相应的动作。这里我们给出了这些操作符的一个列表,并有详细的说明。我们还在后面给出了一些例子以阐明更多的细节。
pop: 此操作符删除操作数栈顶(最后进入)的元素。
exch: 此操作符对换操作数栈顶的两个元素。
dup: 此操作符复制最后进入操作数栈的元素并将其推入操作数栈,即复制栈顶元素。
copy: 此操作符需要一个在执行前被推入操作数栈的整型操作数(即参数)。设此整型参数为n,则给出命令 n copy 。此操作完成后,位于栈顶的n个元素的拷贝作为一批最后进入的元素而被置入操作数栈中。换言之,copy 是一个批复制操作符。
index: 此操作符需要一个在执行前被推入操作数栈的整型操作数。设此整型参数为n,则给出命令 n index 。操作完成后,栈顶第n个元素的一个拷贝作为最后进入的元素被置入操作数栈。换言之,index 操作符能选中操作数栈的一个内部元素,生成它的拷贝,并置入操作数栈内。元素的索引以栈顶元素为零开始。
roll: 此操作符需要两个在执行前被推入操作数栈的整型参数。设它们分别为m和n,则给出命令 m n index 。这里m指明加入滚转操作(roll)的元素数,n指明滚转操作的次数。一次滚转操作定义为:操作数栈顶元素变为栈内的第m个元素,而原栈顶以下的m-1个元素依次向栈顶移动一个位置。此过程只在n为1时成立。当n为2时,将进行连续的两次滚转操作。换言之,m 2 roll 等效于 m 1 roll m 1 roll 。参数n可以为负数。这时发生的操作过程与n为正数时