2016-07-23 21 views
1

我想在PostScript过程中运行永久更改的代码。 不包成一个程序,东西很好地工作:在PostScript过程中使用exitserver

serverdict begin 0 exitserver 
(PERMANENT_STUFF_HERE) == 

然而,包装纸这个时候到的PostScript程序与myprocedure调用它,它似乎代码后,不再执行exitserver:

/myprocedure { 
    serverdict begin 0 exitserver 
    (PERMANENT_STUFF_HERE) == 
} def 
myprocedure 

这是为什么?我虽然PostScript程序是简单的宏,只是调用过程名称与其内容。有没有可能从程序中调用exitserver/startjob代码?

回答

1

当你运行exitserver时,你终止服务器循环。立即。如果你在一个循环中:

{ 
    (before exit\n) print 
    exit 
    (after exit\n) print 
} loop 

然后你会看到'before'被处理,但不是after。 exitserver基本上是同一种操作。任何正在执行的上下文都会被终止,堆栈被清理等等。

所以如果你通过一个过程(这是一个可执行数组,并且它们不是宏)来完成这个过程,那么执行堆栈就会被清理并且控制权返回调用上下文。

现在,当您终止作业服务器循环时,解释器会执行处理输入,这就是您不在过程中时所期望的效果。当你执行exitserver时服务器循环终止,解释器从输入进行解释字节。

你当然可以在程序中运行'exitserver',但是你不能指望这个程序在之后继续执行。

无论如何,执行exitserver通常是不被接受的,你应该有一个很好的理由你想在PostScript程序中运行它。

+0

我一直在想这件事,现在我不太确定。如果执行堆栈已被清除,“解释器如何进行处理输入”怎么可能?输入的处理必须通过内部读取循环或exec堆栈上的可执行文件。所以'exitserver'必须比清除execstack更具有手术能力。 –

+0

翻译对输入流进行处理。当然,处理中的任何东西都会被甩掉。在exitserver之后的任何新输入都会正常处理。本质上,这将解释器返回到“干净”状态并终止作业服务器循环。 exitserver之后的输入具有“永久”效应。这样做可以关闭作业封装。请注意**非常**旧版本的Ghostscript没有执行作业服务器循环..... – KenS

+0

同意,但对execstack的实际影响必须至少抓取文件对象,然后清理到作业服务器循环,并开始一个新的循环来读取保存的文件,安排在文件终止后重新启动作业服务器。看来,设计'exitserver'来裁剪作业服务器离开底部并且保持用户部分不受干扰并不是不可思议的。将用户引入不可移植的功能似乎是这种方法的一大缺点。(我应该承认,这个智力练习的一半是朝着实现这个目标而不是OP的Q.) –

0

正如肯说的,exitserver不会在程序中使用。它必须是从流中执行的主线代码。但是您可能能够使用可重复使用的空解码过滤文件。检查2006年10月号的Acumen Journal如何制作其中的一个。那里的例子将它用于图像数据。但是你也可以把代码放进去,然后cvx exec它。