PostScript 中的index 方法有什么作用?

问题描述 投票:0回答:1

我不明白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
1个回答
3
投票

您有 PostScript 语言参考手册吗?如果您想使用 PostScript 进行编程,您将需要它。

索引运算符在第 3 版 PLRM 第 610 页上定义:

索引anyn …any0 n 索引anyn…any0anyn

从操作数堆栈中删除非负整数 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
?

并做一个索引。 Index 删除 2,然后倒数 3 个位置,得到 ?。它被复制到堆栈顶部,因此堆栈现在看起来像这样:

?
3
3
?

然后它会测试“?” (不检查它是否是数字数据类型)针对数值 3。如果 3 大于?然后它推送 true,否则推送 false。

所以现在我们的堆栈是:

true|false
3
?

然后我们压入一个可执行数组,导致这个堆栈:

{exch}
true|false
3
?

并执行“if”运算符。如果布尔值为“true”,我们将执行可执行数组,如果为 false,则不会执行并将其丢弃。因此,如果 ? > 3 我们有 :

?  % Numeric value > 3
3

否则我们有:

3
?

然后我们执行“pop”,从堆栈中删除顶部操作数,留下“?”或 3.

然后我们再次循环,使用值 2,最后再次使用值 4。

看起来这是一个“max”函数,它返回数值数据数组中的最大值。大概初始值是 0 左右。

© www.soinside.com 2019 - 2024. All rights reserved.