2016-07-23 16 views
1

Ich möchte Code für permanente Änderungen innerhalb einer PostScript-Prozedur ausführen. Ohne es zu einem Verfahren Einwickeln Dinge funktionieren:Verwenden Sie den Exitserver in einer PostScript-Prozedur

serverdict begin 0 exitserver 
(PERMANENT_STUFF_HERE) == 

Wenn jedoch diese in eine Postscript-Prozedur Einwickeln und es mit myprocedure Aufruf, den Code scheinen nach exitserver nicht mehr ausgeführt wird:

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

Warum ist das? Ich dachte, PostScript-Prozeduren wären einfache Makros, die den Prozedurnamen beim Aufruf einfach durch seinen Inhalt ersetzen. Gibt es eine Möglichkeit, exitserver/startjob-Code innerhalb einer Prozedur aufzurufen?

Antwort

1

Wenn Sie exitserver ausführen, beenden Sie die Serverschleife. Sofort. Wenn Sie in einer Schleife sind:

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

Dann würden Sie sehen, dass die ‚vor‘ verarbeitet wurde, aber die nach nicht. Exitserver ist im Wesentlichen die gleiche Art von Operation. Jeder ausführende Kontext wird beendet, Stapel werden bereinigt, etc.

Also, wenn Sie dies auf halbem Weg durch eine Prozedur machen (was ein ausführbares Array ist und nein, sind sie keine Makros), wird der Ausführungsstapel aufgeräumt und die Kontrolle wiederhergestellt der aufrufende Kontext

Jetzt, wenn Sie die Job-Server-Schleife beenden, verarbeitet der Interpreter die Eingabe weiter, weshalb Sie das tun, was Sie erwarten, wenn Sie sich nicht in einer Prozedur befinden. Die Server-Schleife wird beendet, wenn Sie den Exit-Server ausführen, der Interpreter interpretiert weiterhin Bytes von der Eingabe.

Sie können 'exitserver' sicher von einer Prozedur ausführen, aber Sie können nicht erwarten, dass die Prozedur danach weiter ausgeführt wird.

Normalerweise ist die Ausführung von exitserver verpönt, Sie sollten einen guten Grund haben, warum Sie es im Laufe eines PostScript-Programms ausführen wollen.

+0

Ich habe darüber weiter nachgedacht und jetzt bin ich mir nicht so sicher. Wie ist es möglich, dass "der Interpreter die Eingabe weiter bearbeitet", wenn der Exec Stack gelöscht wurde? Die Verarbeitung der Eingabe muss über eine innere Leseschleife oder eine ausführbare Datei auf dem Exec Stack erfolgen. Also muss 'exitserver' chirurgischer sein, als nur den execstack zu löschen. –

+0

Der Interpreter bearbeitet den Eingabestrom weiter. Alles, was in der Mitte der Verarbeitung ist, wird natürlich gelöscht. Jede neue Eingabe nach dem Exit-Server wird normal verarbeitet. Im Wesentlichen führt dies den Interpreter in einen "sauberen" Zustand zurück und beendet die Job-Server-Schleife. Die Eingabe nach dem Exitserver hat einen "permanenten" Effekt. Sie deaktivieren damit die Job-Kapselung. Beachten Sie, dass ** extrem ** alte Versionen von Ghostscript keine Job-Server-Schleife ausgeführt haben. – KenS

+0

Einverstanden, aber der eigentliche Effekt auf den Execstack muss sein, das Dateiobjekt zumindest zu packen, bevor Sie zum Jobserver abrechnen Schleife und Starten einer neuen Schleife, um die wiederhergestellte Datei zu lesen und einen Neustart des Jobservers zu planen, nachdem die Datei beendet wurde. Es scheint, dass es nicht unvorstellbar ist, 'exitserver' zu entwerfen, um den Jobserver von unten zu trimmen und den Benutzerbereich ungestört zu belassen . Die Nutzer in nicht tragbare Funktionen zu verführen, scheint ein großer Nachteil dieses Ansatzes zu sein.(Ich sollte gestehen, dass die Hälfte dieser intellektuellen Übung auf das Ziel der Umsetzung gerichtet war, nicht auf die Frage von OP.) –

0

Wie Ken sagt, wird exitserver in einem Verfahren nicht verwendbar sein. Es muss Mainline-Code sein, der aus einem Stream ausgeführt wird. Aber Sie können möglicherweise eine wiederverwendbare null-decodierte gefilterte Datei verwenden. Überprüfen Sie die Oktober 2006 Ausgabe des Acumen Journal für wie man eines von denen macht. Das Beispiel dort verwendet es für Bilddaten. Aber Sie können auch Code darin einfügen, und dann cvx exec es.