如何在 postscript 中为堆栈中的每个项目添加 1?

问题描述

我真的在为 postscript 中的语法苦苦挣扎。该程序在堆栈中给出了 6 个值,并且需要以相同的顺序返回堆栈,每个项目都添加 1。我在这一点上迷路了,下面的程序是我能得到的最接近的程序。这当前需要一个堆栈并将 2 添加到其中的最后一个值。

/map {
    1 dict begin
    
    count 0 gt %if more than 0 on stack
    {   
        /x exch def %get first value
        x 1 add
        /x
        
    }if
    
    end
} def

解决方法

可能最简单的方法是将值包装在一个数组中。然后您可以使用 forall 循环对每个项目进行操作。

/map {
    6 array astore
    {
        1 add
    } forall
} def

如果您想避免创建数组,可以使用 roll 重新排列堆栈中的项目。

/map {
    6 {
        1 add
        6 1 roll
    } repeat
} def

另请注意,在您的代码中,您可能不想要最后一个 /x(它会将名称留在堆栈中,以后可能会妨碍到它)。由于堆栈中的顶部项目已经是堆栈顶部的项目,因此您不需要 /x exch def x。但是,您可以继续这种风格,只需对所有 6 个值进行定义。

/map {
    /z exch def
    /y exch def
    /x exch def
    /w exch def
    /v exch def
    /u exch def
    u 1 add
    v 1 add
    w 1 add
    x 1 add
    y 1 add
    z 1 add
} def