Arrays 阵列的PostScript复制运算符

Arrays 阵列的PostScript复制运算符,arrays,postscript,Arrays,Postscript,我正在寻找有关PostScript中复制运算符的一些额外详细信息,这些信息是在将其与数组(或字典/字符串/…)一起使用时提供的 在PostScript语言参考手册中,我发现: 阵列1阵列2复制子阵列2 在一个网站上,我发现了以下示例: 复制操作后堆栈上保留了什么 只有子阵列?: ---------------top- [1 2 3] ------------bottom- 或子阵列+阵列2的一部分?: ---------------top- [1 2 3 7 8] ------------bo

我正在寻找有关PostScript中复制运算符的一些额外详细信息,这些信息是在将其与数组(或字典/字符串/…)一起使用时提供的

在PostScript语言参考手册中,我发现:

阵列1阵列2复制子阵列2

在一个网站上,我发现了以下示例:

复制操作后堆栈上保留了什么

只有子阵列?:

---------------top-
[1 2 3]
------------bottom-
或子阵列+阵列2的一部分?:

---------------top-
[1 2 3 7 8]
------------bottom-

提前感谢。

来自PostScript语言参考手册,第3版,第548页,复印操作员:

“…在其他形式中,copy复制第一个 将对象合成为第二个。复合对象操作数必须为 类型相同,但压缩数组可以复制到 数组(且仅复制到数组中)无法复制到压缩数组中, 因为它们是只读的)。这种形式的副本复制了 复合对象。这与dup和其他运营商截然不同 仅复制对象本身(参见第3.3.1节“简单和 复合对象”)。但是,“复制”仅执行一个级别的复制。 它不会递归地应用于元素本身 复合对象;相反,这些元素的值变为 共享

对于数组或字符串,必须指定第二个对象的长度 至少和第一个一样伟大;复制返回初始子数组 或将元素放入其中的第二个操作数的子字符串 抄袭的。array2或string2的任何剩余元素不受影响。”

在你的例子中,你(我认为)被复合对象被引用的事实绊倒了。您需要根据指针或引用来考虑堆栈上的复合对象,而不是物理内存块

因此,在第一个实例中,创建2个数组并将指向它们的指针放在堆栈上,这两个数组都没有指向它们的任何其他引用。然后执行copy

copy运算符将第一个操作数指向的数组中的前3个元素复制到第二个操作数指向的数组中。然后它创建一个新的子数组,其中只包含修改后的元素

然后,它从堆栈中删除这两个数组,如果您认为它们是指针,那么它只是从堆栈中删除指针。由于这些数组不在其他任何地方引用,因此会释放内存

最后,它在堆栈上放置一个指向新数组的指针。pstack解析指向数组的指针并打印结果元素

现在,在第二种情况下,您创建了一个数组,并从名称/ar(将存储在当前字典中)引用它。然后创建第二个数组,并在操作数堆栈上放置指向它的引用(指针),然后在堆栈上放置对“ar”的引用

下一步你叫复制。Copy将前3个元素从初始数组复制到“ar”引用的数组。它还会创建一个新的子数组。然后从操作数堆栈中删除对操作数的引用。由于初始数组现在未被引用,因此它被释放。但是,当前字典包含一个键'/ar',其值是对第二个数组的引用。所以我们不释放与它相关的内存,它仍然被引用。最后,它将新的子阵列放在堆栈上

然后在堆栈上放置另一个对由“/ar”键控的数组的引用,并再次调用pstack。pstack解析数组引用并打印内容

如您所见,copy更改了“/ar”引用的数组的前3个元素,并返回了包含复制元素的子数组

注意:在原始示例中,第一个“副本”在堆栈上留下了对包含[1 2 3]的数组的引用(由第一个pstack打印)。这就是为什么第二个pstack(在第二次执行copy之后)会将显然是同一个数组的内容打印两次,而不是,它会将引用打印到两个不同的子数组,每个子数组都由“copy”的一次执行返回。因此,不是:

我们本可以简单地做到:

GS>[1 2 3] [4 5 6 7 8] copy pstack
[1 2 3]
GS<1>/ar [4 5 6 7 8] def
GS<1> ar copy
GS>ar pstack
[1 2 3 7 8]
[1 2 3]
GS<2>
GS>[1 2 3][4 5 6 7 8]复制pstack
[1 2 3]
GS/ar[4 5 6 7 8]def
GS ar副本
GS>ar pstack
[1 2 3 7 8]
[1 2 3]
GS
也就是说,我们从第一个副本得到[1 2 3]子数组,并将其用作第二个副本的初始操作数

请注意,“GS”提示符有数字指示操作数堆栈上的条目数

因此,为了回答您最初的问题,堆栈上没有任何内容,两个操作数都被删除,并创建一个新的子数组,并将对它的引用放置在堆栈上。

实际上“[1 2 3][4 5 6 7 8]复制”是一个无用的操作,您最好弹出数组,以便在堆栈上有[1 2 3]。如果我理解正确,那么如果您有数组引用(/ar…def),那么copy将非常有用。
---------------top-
[1 2 3 7 8]
------------bottom-
GS>[1 2 3] [4 5 6 7 8] copy pstack
[1 2 3]
GS<1>/ar [4 5 6 7 8] def
GS<1> ar copy
GS>ar pstack
[1 2 3 7 8]
[1 2 3]
GS<2>