Loops 在Postscript堆栈中查找最大数字
我无法使代码正常工作。 我正在比较堆栈上的前两个数字。最高的数字将在顶部结束,较低的数字将回滚到底部Loops 在Postscript堆栈中查找最大数字,loops,compare,max,postscript,Loops,Compare,Max,Postscript,我无法使代码正常工作。 我正在比较堆栈上的前两个数字。最高的数字将在顶部结束,较低的数字将回滚到底部 count /length exch def length { 1 index 0 index gt { 2 1 roll count 1 sub -1 roll }if }repeat 首先,在为定义选择名称时要非常
count
/length exch def
length {
1 index 0 index gt {
2 1 roll
count 1 sub -1 roll
}if
}repeat
首先,在为定义选择名称时要非常小心<代码>长度是运算符的名称。因此,当您的定义生效时(可能在
userdict
中),操作员(在systemdict
中)无法通过名称访问*
对于任何棘手的堆栈操作代码,在每行末尾编写描述堆栈的注释是一个非常好的习惯。这是可以使用“自由”变量名的地方
count % ... n
现在,由于我们立即使用这个值,实际上根本不需要定义它。把它放在书堆上就行了
{ %
} repeat
现在,循环似乎很难记录堆栈,但实际上它是完全相同的。repeat循环从堆栈中去掉repeat count参数,因此过程从下面的内容开始
{ % ...
1索引0索引
与1索引1索引
一样更好(对吗?因为第一个索引移动了堆栈深度)。但最好是2份
2 copy gt { % ... x y (x>y)
这里的(x>y)
不在堆栈上,而是表示变量关系的知识。
2 1滚动
更好,因为exch
exch % ... y x (x>y)
count 1 sub -1 roll %
这将把第二个从底部拉到顶部。请参阅我的roll
操作员指南:
但是如果x
exch % a b ... y x (x>y)
} if
count 1 sub -1 roll % a ... y x b
} repeat
count % ... n
{ % ...
2 copy gt { % a ... x y (x>y)
exch % a ... y x (x>y)
} if % a ... y x (x>y)
count -1 roll % ... y x a (x>y)
} repeat
count 1 roll % a ... y x (x>y)
a b c d e f g h
g>h
f>g
e>f
d>e
c>d
b>c
a>b
count 1 sub % a b c ... x y n-1
{
count -1 roll % b c ... x y a
2 copy gt { exch } if % b c ... x y a (a>y)
} repeat