索引方法在后记中有什么作用?



我不明白索引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 页定义:

索引任意...any0 n 索引 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)

错误:范围检查、堆栈下溢、类型检查

另请参阅:复制、复制、滚动

因此,在您的情况下,索引从堆栈中删除"2",然后沿着堆栈再计数 3 个位置(索引 = 2、索引=1、索引=0(,并将其在那里找到的对象复制到堆栈顶部。

现在,您的代码片段在"forall"中运行,因此当它运行时,它会查看堆栈顶部的操作数类型。在你的例子中,这是一个数组 [3 2 4]。forall 运算符将数组的每个元素依次推送到堆栈上,然后调用提供给 forall 运算符的可执行数组(即您的代码(。

代码要做的第一件事是调用"dup",它复制堆栈上的操作数。因此,第一次通过循环时,forall 运算符将推送数组的第一个元素 '3',然后你的代码将复制它。所以堆栈将是:

3
3
?

这里的 ? 表示堆栈上有未知的东西,我们知道它在那里,因为 GS 交互式提示中有一个"2",但你还没有告诉我们它是什么。

然后我们推一个 2 :

2
3
3
?

并做一个索引。索引删除 2,然后倒数 3 位,这将我们带到 ?。它被复制到堆栈的顶部,所以堆栈现在看起来像这样:

?
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。

最新更新