在理解此后记代码时需要帮助:代码执行的顺序是什么?

Need help in understanding this postscript code: what is the order in which the code should be executed?

0 5 360 5 mul {sin} for
stack
quit

我知道我们有一个 for 循环,范围从 0 --> 360,增量为 5。但是,5 mul 是 confusing.Why 是在 for 循环主体之前吗? 5 mul 应用于什么?第一个参数在哪里?即:4 5 mul 即 4 x 5 = 20.

第一个参数是——猜猜看——360:

0 5 1800 {sin} for stack quit

PostScript 是面向堆栈的,for 循环没有特殊语法。因此,您可以为前三个值指定任何表达式。这将使它迭代 360 次,从 0 到 1800(即 360×5),步长为 5。不过我不知道为什么要这样做。

(不是答案,但需要格式化。)

PostScript 是一种面向堆栈的语言。运算符从堆栈中获取他们期望的参数数量。你可以在像 Ghostscript 这样的解释器中玩这个:

GS> 5 360 mul
GS<1> stack
1800

此时堆栈为[1800]。

如果您提供的参数多于运算符获取的参数,这些值仍然在堆栈中等待其他事情发生:

GS> 0 5 360 5 mul
GS<3> stack
1800
5
0

由于 mul 有两个值,它只会弹出 5360,进行乘法运算,并将答案压入堆栈。即,在 mul 之前,您的堆栈是这样的:

GS> 0 5 360 5
GS<4> stack
5
360
5
0

如果你现在做了 mul 你会得到同样的结果:

GS<4> mul
GS<3> stack
1800
5
0

然后代码像以前一样继续,{sin} for

您可以一次执行所有命令,如您所展示的那样,也可以稍后执行 - 堆栈就是堆栈:它会随着您的执行而修改。所以你是否这样做:

GS> 0 5 360 5 mul { sin } for
GS<361>

GS> 0 5 360 5
GS<4> mul
GS<3> { sin }
GS<4> for
GS<361>

你最终会得到同样的结果。

在 GhostScript (gs) 中,<nnn> 中的数字是当前堆栈深度。

如果您不习惯这种范式(或较旧的 HP 计算器),那么基于堆栈的语言可能会有些混乱 :) Forth 是基于堆栈的语言的典型示例(而且它很棒)。我怀念 Forth 和 PostScript 的日子(我以前写打印机,并在嵌入式系统中大量使用 Forth)。还有更现代的基于堆栈的语言(Kitten、Factor)。