示例值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> }
答案 0 :(得分:4)
在postscript中,过程只是设置了可执行标志的数组。所以你可以构造一个数组(不管你喜欢)然后在它上面调用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
答案 1 :(得分:2)
嗯,为什么不执行生成值的脚本呢?然后他们就像在调用&#34; point1&#34;之后一样在堆栈中。
但你可以使用
/xyz [ <call you procedure producing the numbers> ] cvx def
所以xyz包含一个在堆栈上生成两个生成数字的过程......