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