gpt4 book ai didi

PostScript 立即或延迟执行

转载 作者:行者123 更新时间:2023-12-01 00:27:09 25 4
gpt4 key购买 nike

我正试图围绕立即执行和延期执行。
据我了解,解释器维护一个标志,知道它是否在延迟执行中。

延迟执行过程可能是因为名称查找返回了一个过程。

现在我试图找出控制这个解释器标志的类型、 Action 或操作。

例如,下面这段代码的末尾有一个立即评估的名称,它返回一个过程。但是这个过程是被推送的,虽然它是可执行的(xcheck):

/setdata
{
/a 1 def
/b 0 def

/foo
a 0 ne
b 0 ne
and
def

{ foo false and }
} def

//setdata

我知道有一个特殊的规则:

Procedures appearing directly (either as part of a program being read from a file or as part of some larger procedure in memory) are usually part of a definition or of a construct, such as a conditional, that operates on the procedure explicitly. But procedures obtained indirectly—for example, as a result of looking up a name—are usually intended to be executed. A PostScript program can override these semantics when necessary.



我知道如果您直接遇到一个过程,您必须推送它(即使它是可执行的)。 (立即评估的名称返回一个过程,该过程是直接遇到的,因此应该将其推送到操作系统。)

现在,如果我正在考虑用代码在解释器中实现这个逻辑,我可以想到这样的事情:

如果我有文字名称查找,请设置解释器的 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 }

最佳答案

在尝试理解口译员时,我遇到了许多相同的问题和困惑。 IMO 术语延迟执行不是很有用。此外,我认为立即评估的术语也不是很有用。您不需要 DeferredFlag。

这里涉及两个独立但相关的部分:解释器循环和 token运算符(operator)。
token处理“延迟执行”的部分,它将可执行数组的所有标记收集到单个对象中。因此,如果文件或字符串以过程体开头,则调用 token在它上面产生整个过程体。

{ execution is deferred until the closing }

它看起来像一条注释,但那是一行 postscript 代码,即使没有定义 deferred、close 等词,它也能正常运行。如果您调用 exec但是,在它上面,或者将它定义为一个调用的名称,然后它将执行并且最好定义内容。

解释器循环总是从 exec 堆栈中获取顶部对象,并且在语义上,可执行数组、文件和字符串的行为都相同。解释器将其视为源并获取第一个元素。名称大小写有点不同,因为它本身不是来源。 (我正在介绍我自己的这个概念,希望它有所帮助/有效。)在 C-ish 伪代码中:
main_loop(){
while( ! quit ){
eval();
}
}

eval(){
object = pop( exec_stack );
if( !executable_flag( object ) ) push( op_stack, object );
else switch( type_of( object ) ){
case array: array_handler( object ); break;
case string: string_handler( object ); break;
case file: file_handler( object ); break;
case name: name_handler( object ); break;
default: push( op_stack, object );
}
}

在名称情况下,查找名称并在可执行时执​​行。
name_handler( object ) {
object = load( object );
push( executable_flag( object ) ? exec_stack : op_stack, object );
}

在其他三个中,您还必须检查它是否是一个数组。
array_handler( object ){
switch( length( object ){
default:
push( exec_stack, getinterval( object, 1, length( object ) - 1 ) );
/* fall-thru */
case 1:
object = get( object, 0 );
push( executable_flag( object ) && type_of( object ) != array ?
exec_stack : op_stack, object );
case 0:
/* do nothing */
}

}

仅当 executable_flag( object ) && type_of( object ) != array然后你推送到 exec 堆栈。

对于另一个问题,即立即评估的名称,我更喜欢称它们为立即加载的名称。 token接线员电话 load在返回之前就可以了。如果在正确的地方完成,则易于处理。它与“延迟执行”部分没有真正的交互。

编辑:

我通过我的 debugger 运行了您的样本与追踪。这显示了每个 token 执行后 op_stack 的运行图。左边的元素是 token返回的对象.请注意 token已经消耗了所有 // s。
$ cat test.ps
(db5.ps) run currentfile cvx traceon debug

/foo { 2 3 add } def
foo
% result: 5

/foo { 2 3 add } def
//foo
% result: { 2 3 add }

/foo { 2 3 add } def
/bar { foo } def
bar
% result: 5

/foo { 2 3 add } def
/bar { //foo } def
bar
% result: { 2 3 add }

$ gsnd -DNOSAFER test.ps
GPL Ghostscript 9.19 (2016-03-23)
Copyright (C) 2016 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
%|-
/foo %|- /foo
{2 3 add} %|- /foo {2 3 add}
def %|-
foo %|- 5
/foo %|- 5 /foo
{2 3 add} %|- 5 /foo {2 3 add}
def %|- 5
{2 3 add} %|- 5 {2 3 add}
/foo %|- 5 {2 3 add} /foo
{2 3 add} %|- 5 {2 3 add} /foo {2 3 add}
def %|- 5 {2 3 add}
/bar %|- 5 {2 3 add} /bar
{foo} %|- 5 {2 3 add} /bar {foo}
def %|- 5 {2 3 add}
bar %|- 5 {2 3 add} 5
/foo %|- 5 {2 3 add} 5 /foo
{2 3 add} %|- 5 {2 3 add} 5 /foo {2 3 add}
def %|- 5 {2 3 add} 5
/bar %|- 5 {2 3 add} 5 /bar
{{2 3 add}} %|- 5 {2 3 add} 5 /bar {{2 3 add}}
def %|- 5 {2 3 add} 5
bar GS<4>
GS<4>pstack
{2 3 add}
5
{2 3 add}
5
GS<4>

关于PostScript 立即或延迟执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44302211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com