2015-08-08 19 views
5

John Hayes' ANS Forth Testsuite enthält Tests, die wie folgt aussehen:Was passiert, wenn ich DOES zweimal anrufe?

: WEIRD: CREATE DOES> 1 + DOES> 2 + ; 
WEIRD: W1 
W1 

Ich bin eher an ratlos, genau das, was diese tun soll. Die ANS Forth Specification auf DOES> ist weitgehend undurchdringlich.

Von der Test-Suite zu lesen, es sieht aus wie es um den ersten Anruf zu DOES> ist erwartet W1, zu modifizieren, aber dann, dass W1 aktiviert die SekundenDOES> aufrufen. Ich nehme an, dass die zweite Funktion auf dem Wort basiert, das durch den letzten Aufruf an CREATE definiert wurde, aber das ist bereits DOES> ified, also bin ich mir nicht sicher, was das tun soll.

gforth besteht die Testsuite, daher scheinen die Tests gültig zu sein; aber mein Haustier Forth-Interpreter nicht, und ich muss herausfinden, wie es funktioniert ...

+0

Es ist eine Weile (30+ Jahre) seit ich in Forth versuchte, aber vielleicht [http://www.vintagecomputer.net/fjkraan/comp/atom/doc/ForthTheory&Practice_10-index.pdf] wird helfen . –

+0

Re "DOES>": Kapitel 11, "Definieren definierender Wörter", p. 229-246, in * [Forth - Ein Text und Hinweis] (http://www.amazon.com/Forth-Reference-Prentice-Hall-Software-Series/dp/0133263312) * von Mahlon G. Kelly und Nicholas Spies (ISBN 0133263312/978-0133263312), kann von Nutzen sein. Die zentrale Seite ist Seite 234. [Sie ist möglicherweise in Google Books verfügbar] (https://books.google.dk/books?hl=da&id=AIVGAAAAYAAJ&focus=searchwithininvolume&q=various+defining+words) (aber ich konnte nur die ersten Zeilen) - ein praktikabler Weg ist es, es aus einer Bibliothek zu leihen. –

Antwort

5

Der zweite Anruf an DOES> ändert auch W1.

WEIRD: erstellt W1 mit einer Laufzeitaktion von 1 + DOES> 2 +. Der erste Aufruf an W1 setzt die Laufzeit auf 2 +.

Dies wird deutlicher, wenn Sie den Code ändern, um etwas zu drucken, z.

: weird: create does> drop ." ONE" does> drop ." TWO" ; ok 
weird: w1 ok 
w1 ONE ok 
w1 TWO ok 
w1 TWO ok 
w1 TWO ok 

Die Erklärung dafür ist, dass DOES> arbeitet immer auf dem neuesten definierten Wort.

+0

Yup. Vielen Dank. Da meine Implementierung von 'DOES>' funktioniert, indem ich ein neues Wort definiere, das das alte aufruft, ist das natürlich ziemlich schwer zu implementieren. Ich überlege ernsthaft, diesen Teil des ANS-Standards einfach aufzugeben. Anscheinend wird viel davon sowieso als ziemlich seltsam angesehen. –

Verwandte Themen