我正试图围绕立即执行和延期执行。 从我的理解是,解释器维护一个标志,知道它是否在延期执行或不。PostScript立即执行或延期执行
推迟执行过程可能是因为名称查找返回了一个过程。
现在我试图找出哪些类型,操作或操作控制这个解释器标志。
例如,下面这段代码在最后有一个立即评估的名称,它返回一个过程。但这个过程是推,虽然它是可执行文件(xcheck):
/setdata
{
/a 1 def
/b 0 def
/foo
a 0 ne
b 0 ne
and
def
{ foo false and }
} def
//setdata
我知道有一个特殊的规则:直接出现
程序(无论是作为计划的一部分,正在读 从一个文件或作为内存中一些较大过程的一部分)通常是定义或构造的一部分,例如条件, 明确地对该过程进行操作。但是间接获得的程序(例如,作为查找名称的结果)通常是 意图被执行。 PostScript程序可以在必要时覆盖这些语义。
我明白,如果您直接遇到需要推送它的过程(即使它是可执行的)。 (立即评估的名称返回一个直接遇到的过程,所以它应该被推送到操作系统。)
现在,如果我在代码中思考在解释器中实现此逻辑,我可以想到类似这样的事情:
如果我有一个文字名查找,请设置解释器的DeferredFlag = true; 现在我怎么知道延迟执行何时结束?如果我遇到“def”名字,我可以硬编码,但也可能有其他名称。
(+什么的情况下,程序嵌套在正在执行的程序。等...)
我无法找到一个方法来控制在解释器DeferredFlag知道当前的执行模式。
希望问题清楚。
更新:
一些额外的代码示例我尝试没有成功调试。
代码1:
/foo { 2 3 add } def
foo
% result: 5
代码2:
/foo { 2 3 add } def
//foo
% result: { 2 3 add }
代码3:
/foo { 2 3 add } def
/bar { foo } def
bar
% result: 5
代码4:
/foo { 2 3 add } def
/bar { //foo } def
bar
% result: { 2 3 add }
关于立即评估的名称。例如在应该返回的程序的情况下(作为imm评估名称的结果)。 这会返回1个过程对象,例如{2 3 add}还是会返回5个表示过程的标记:标记{,标记2,标记3,标记添加,标记}? – juFo
它返回1个过程对象。有两种方法可以考虑这一点。 'def'总是为该值接受一个单一对象,并且立即评估的名称总是从早期的“def”生成值,因此立即评估的名称只能返回单个对象。 OTOH的所有程序结构通过'token'运算符进入解释器,'token'总是消耗最多}并返回一个对象。如果没有右大括号,'token'指示/语法错误。所以,没有像“令牌{”这样的东西。在postscript中它本身永远不会存在。 –