index 方法在 postscript 中的作用是什么?
What does the index method does in postscript?
我不明白索引method
在后记中的作用?
我们以这段代码为例:
GS<2>stack
--nostringval-- <-- is an array [3 2 4]
3
GS<2> {
dup
2 index <-- What is the index doing?
gt
{exch} if
pop
} forall
您有 PostScript 语言参考手册的副本吗?如果您想在 PostScript 中编程,您将需要它。
索引运算符在第 3 版 PLRM 的第 610 页定义:
index anyn … any0 n index anyn … any0 anyn
从操作数栈中取出非负整数n,倒数到
堆栈顶部的第 n 个元素,并将该元素的副本压入
堆叠。
例子
(a) (b) (c) (d) 0 index Þ (a) (b) (c) (d) (d)
(a) (b) (c) (d) 3 index Þ (a) (b) (c) (d) (a)
错误: 范围检查、stackunderflow、类型检查
另请参阅: 复制、复制、滚动
所以在你的例子中,索引从堆栈中删除“2”,然后它沿着堆栈计算另外 3 个位置(索引=2、索引=1、索引=0),并复制它找到的对象到堆栈的顶部。
现在,您的代码片段在 'forall' 中运行,因此当它运行时,它会查看堆栈顶部的操作数类型。在您的情况下,这是一个数组 [3 2 4]。 forall 运算符将数组的每个元素依次压入堆栈,然后调用提供给 forall 运算符的可执行数组(即您的代码)。
您的代码所做的第一件事是调用 'dup',它复制堆栈上的操作数。因此,第一次通过循环时,forall 运算符将压入数组的第一个元素“3”,然后您的代码将复制它。所以堆栈将是:
3
3
?
那个?这里表示堆栈上有一些未知的东西,我们知道它在那里,因为 GS 交互式提示中有一个“2”,但你没有告诉我们它是什么。
然后我们推一个 2 :
2
3
3
?
并做一个索引。索引删除 2,然后倒数 3 个位置,这将我们带到了 ?。 THat 被复制到堆栈的顶部,所以堆栈现在看起来像这样:
?
3
3
?
然后测试'?' (不检查它是否是数字数据类型)针对数值 3。如果 3 大于?然后它推送一个 true,否则它推送一个 false。
所以现在我们的堆栈是:
true|false
3
?
然后我们压入一个可执行数组,导致这个堆栈:
{exch}
true|false
3
?
并执行 'if' 运算符。如果布尔值为 'true' 我们执行可执行数组,如果它为假我们不执行并将其丢弃。因此,如果 ? > 3 我们有:
? % Numeric value > 3
3
否则我们有:
3
?
然后我们执行 'pop' 从堆栈中删除顶部操作数,留下 '?'或 3.
然后我们再次循环,使用值 2,最后再次使用值 4。
看起来这是一个 'max' 函数,它返回数值数据数组中的最大值。大概初始值是 0.
我不明白索引method
在后记中的作用?
我们以这段代码为例:
GS<2>stack
--nostringval-- <-- is an array [3 2 4]
3
GS<2> {
dup
2 index <-- What is the index doing?
gt
{exch} if
pop
} forall
您有 PostScript 语言参考手册的副本吗?如果您想在 PostScript 中编程,您将需要它。
索引运算符在第 3 版 PLRM 的第 610 页定义:
index anyn … any0 n index anyn … any0 anyn
从操作数栈中取出非负整数n,倒数到 堆栈顶部的第 n 个元素,并将该元素的副本压入 堆叠。
例子
(a) (b) (c) (d) 0 index Þ (a) (b) (c) (d) (d)
(a) (b) (c) (d) 3 index Þ (a) (b) (c) (d) (a)
错误: 范围检查、stackunderflow、类型检查
另请参阅: 复制、复制、滚动
所以在你的例子中,索引从堆栈中删除“2”,然后它沿着堆栈计算另外 3 个位置(索引=2、索引=1、索引=0),并复制它找到的对象到堆栈的顶部。
现在,您的代码片段在 'forall' 中运行,因此当它运行时,它会查看堆栈顶部的操作数类型。在您的情况下,这是一个数组 [3 2 4]。 forall 运算符将数组的每个元素依次压入堆栈,然后调用提供给 forall 运算符的可执行数组(即您的代码)。
您的代码所做的第一件事是调用 'dup',它复制堆栈上的操作数。因此,第一次通过循环时,forall 运算符将压入数组的第一个元素“3”,然后您的代码将复制它。所以堆栈将是:
3
3
?
那个?这里表示堆栈上有一些未知的东西,我们知道它在那里,因为 GS 交互式提示中有一个“2”,但你没有告诉我们它是什么。
然后我们推一个 2 :
2
3
3
?
并做一个索引。索引删除 2,然后倒数 3 个位置,这将我们带到了 ?。 THat 被复制到堆栈的顶部,所以堆栈现在看起来像这样:
?
3
3
?
然后测试'?' (不检查它是否是数字数据类型)针对数值 3。如果 3 大于?然后它推送一个 true,否则它推送一个 false。
所以现在我们的堆栈是:
true|false
3
?
然后我们压入一个可执行数组,导致这个堆栈:
{exch}
true|false
3
?
并执行 'if' 运算符。如果布尔值为 'true' 我们执行可执行数组,如果它为假我们不执行并将其丢弃。因此,如果 ? > 3 我们有:
? % Numeric value > 3
3
否则我们有:
3
?
然后我们执行 'pop' 从堆栈中删除顶部操作数,留下 '?'或 3.
然后我们再次循环,使用值 2,最后再次使用值 4。
看起来这是一个 'max' 函数,它返回数值数据数组中的最大值。大概初始值是 0.