2012-09-30 5 views
6

Ich habe versucht, dies zu lesen, aber ich kann keine Erwähnung finden.Was ist die Lebenszeit von S "..." in Forth?

Nach der Norm, eine Zeichenfolge mit S" erstellt wird, kann nicht geändert werden, und aus einem einfachen Experiment in Gforth es ist offensichtlich, dass der Raum für die Zeichenfolge nicht aus dem Wörterbuch oder Padflächen kommt:

hex 
here . 7F48AB3B8758 ok 
pad . 7F48AB3B8808 ok 
s" test" .s <2> 77FDD0 4 ok 

Wie lange kann ich erwarten, dass diese Adresse gültig ist?

Mit anderen Worten, wenn ich diese Adresse (und Anzahl) in einer Variablen speichern, kann ich später darauf im Programm verweisen, oder muss ich es an einen anderen Ort im Wörterbuch oder Heap verschieben? Und wenn ich die Adresse nicht speichere, lecke ich Speicher?

Antwort

7

Wenn in eine Definition kompiliert wird, ist die Lebensdauer der Zeichenfolge die der Definition. s" wird normalerweise nur zur Kompilierzeit verwendet.

Nicht alle Forths erlauben sogar die Verwendung von s" für die Interpretation und tatsächlich sagt ANS: "Die Semantik der Interpretation für dieses Wort ist undefiniert." Das Verhalten wird zumindest für Ihr bestimmtes Forth spezifisch sein.

Sie scheinen Gforth zu verwenden, das über einen reservierten Speicherplatz für mindestens eine Interpretierungszeitzeichenfolge verfügt. Das Gforth-Handbuch sagt: "... die Zeichenfolge existiert nur bis zum nächsten Anruf von s"". Es heißt weiter: "Einige Forth-Systeme behalten mehr als eine dieser Saiten, aber normalerweise haben sie immer noch eine begrenzte Lebensdauer." (Section 3.24 Characters and Strings).

Ich hoffe, dass hilft!

+0

Vielen Dank! Ich habe diese Absätze offensichtlich verpasst. Zumindest macht das klar. – harald

+1

Sie haben Recht, obwohl in gForth "mindestens eine Interpretationszeit-Zeichenfolge" eigentlich soviel bedeutet wie Sie möchten. In gForth teilt 'S '' zur Interpretierzeit Speicher zu, kopiert die Zeichenkette dort und gibt sie nie wieder frei (was man zum Interpretieren tun kann). Ich habe dies entdeckt, indem ich 'se s'' und dann 'save-mem 'eingegeben habe. –