在PostScript中:如何将一些堆栈元素(在运行时计算)放入可以分配给名称的过程中



具有值10和20已知的示例在运行时以更好地理解下面的实际问题:

/point1 { 10 20 } def将数字10和20放入(匿名)过程中然后将其分配给名称point1(因此不再匿名)。然后可以使用名称point,即每当解释器找到它,将执行{ 10 20 },即10和20将被推到堆栈上。

执行def之前和之后堆叠:

Stacke before:             Stack after:
{ 10 20 }                  -
/point1
Dict before:               Dict after:
-                          point1 --> { 10 20 }

现在实际的问题:假设将在运行时计算两个值10和20。如何分配它们(或任何数量的顶级n堆栈元素)给定名称以稍后使用?

Stacke before:             Stack after:
<y>                        -
<x>
/<name>
Dict before:               Dict after:
-                          <name> --> { <x> <y> }

在PostScript中,过程只是带有可执行flag 设置的数组。因此,您可以构造一个数组(无论您喜欢),然后在其上调用cvx

/x 3 def
/y 4 def
[ x y ] cvx  % { 3 4 }
x y [ 3 1 roll ] cvx
x y 2 array astore cvx
{ //x //y }
({//x //y}) cvx exec
({//x //y}) token pop exch pop

因此,对于您的假设程序,可以这样做:

/makepairproc { % x y  ->  { x y }
    [ 3 1 roll ] cvx
} def

您可以做的另一件有趣的事情是拥有一个可执行的数组和一个同一基础数组的文字数组。您可以使用定义为过程的一个名称,而另一个定义为目标。这样,您可以在不每次分配新内存的情况下更新内容。

/point1 { 10 20 } def
/point1arr //point1 cvlit def
30 40 point1arr astore  %update contents
point1  % 30 40         %execute contents

嗯,为什么不执行产生值的脚本?然后,他们就像在调用" Point1"之后一样在堆栈上。

但是您可以使用

/xyz [ <call you procedure producing the numbers> ] cvx def

so xyz包含一个过程,该过程在堆栈上产生两个产生的数字...

最新更新