在理解此后记代码时需要帮助:代码执行的顺序是什么?
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
有两个值,它只会弹出 5
和 360
,进行乘法运算,并将答案压入堆栈。即,在 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)。
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
有两个值,它只会弹出 5
和 360
,进行乘法运算,并将答案压入堆栈。即,在 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)。