Beispiel für die Anwendung einer Metasprache (Forth)
Beispiel für die Anwendung einer Metasprache (Forth)
von cas » Mo 27. Nov 2006, 00:34
Hallo,
dieses habe ich auf
Forth-Ev in einem Beitrag von AndiElgeti gefunden. Probiert es doch einmal unter VolksForth aus:
Der Traum der Menschen war und ist, mit dem Computer in möglichst natürlicher Sprache zu kommunizieren. Weil das vom Wortumfang her nicht geht, einigt man sich auf eine Kunstsprache, die Teil der natürlichen Sprache ist, und meist einen speziellen Satzbau besitzt.
So eine Sprache ist eine Metasprache.
In Forth ist es ganz einfach, so eine Metasprache zu schaffen.
Das Beispiel habe ich vor 20 Jahren gelesen, es ist also nahezu klassisch, und sicher kennen es viele.
- Code: Alles auswählen
: dazu + ;
: macht cr . ;
: Bockwurst 300 + ;
: Bier 200 * ;
: Korn 150 * ;
Diese Worte ermöglichen dann diese Anzeige
2 Bier 3 Korn dazu 2 Bockwurst dazu macht
1450 ok
Das ist also quasi genau das, was im klassischen Eintzelhandel die Verkäuferin in ihre Kasse eingibt.
Viel Spass
Carsten
von cas » Mo 27. Nov 2006, 00:39
Aufgabe:
Wie muss das Word "macht" umgeschrieben werden um als Ausgabe
14 Euro und 50 Cent ok
zu bekommen?
Schreibt Eure Ideen hier. Die Antwort gibt es am Mittwoch.
Ciao
Carsten
von FlorianD » Mo 27. Nov 2006, 15:55
von Ghost » Di 28. Nov 2006, 13:12
Hi,
wenn man die (fast) Festpreisbockwurst anpasst..
- Code: Alles auswählen
: Bockwurst 300 * ;
waere mein Vorschlag..
- Code: Alles auswählen
: macht cr /mod . ." Euro und " . ." Cent" ;

-/\/\artin
von cas » Do 30. Nov 2006, 14:25
Martin hat (fast) recht, es fehlt nur der Divisor (100).
- Code: Alles auswählen
: macht cr 100 /mod . ." Euro und " . ." Cent" ;
Danke für den gefundenen Fehler bei "Bratwurst".
Ciao
Carsten
von Ghost » Do 30. Nov 2006, 15:59
Hi,
ups.. die fehlenden 100....das ist nicht schoen fuer den Stack

Wie koennte man das Beispiel denn umbauen, damit
man wie folgt bestellen kann:
- Code: Alles auswählen
1 VitaCola 2 Bier 3 Korn dazu 1 Bockwurst macht
oder
- Code: Alles auswählen
1 VitaCola 2 Bier und 3 Korn dazu 1 Bockwurst macht
oder auch
- Code: Alles auswählen
1 VitaCola und 2 Bier 3 Korn dazu 1 Bockwurst dazu macht
Ich hab's ueber die Stacktiefe geloest

Gruesslis
-/\/\artin
ps
- Code: Alles auswählen
: VitaCola 200 * ;
von Ghost » Sa 2. Dez 2006, 11:16
Moin,
der Vollstaendigkeit halber..

- Code: Alles auswählen
: dazu + ;
: macht depth 1- 0 do + loop 100 /mod . ." Euro und " . ." Cent" ;
: Bockwurst 300 * ;
: Korn 150 * ;
: und ;
: vitacola 200 * ;
Gruss
-/\/\artin
von cas » Sa 2. Dez 2006, 15:37
Ghost hat geschrieben:Moin,
der Vollstaendigkeit halber..

- Code: Alles auswählen
: dazu + ;
: macht depth 1- 0 do + loop 100 /mod . ." Euro und " . ." Cent" ;
: Bockwurst 300 * ;
: Korn 150 * ;
: und ;
: vitacola 200 * ;
Das funktioniert bei der Annahme das der Stack vor Beginn der Berechnung leer ist. Um das zu garantieren sollte die Berechnung mit einem Wort starten, welches den Stack leert.
Oder noch besser, mit einem Wort beginnen, welches sich die aktuelle Stacktiefe merkt und "macht" benutzt diesen Wert um dann alle Preise aufzurechnen.
Ciao
Carsten
von Ghost » So 3. Dez 2006, 14:53
Hallo,
cas hat geschrieben:Das funktioniert bei der Annahme das der Stack vor Beginn der Berechnung leer ist. Um das zu garantieren sollte die Berechnung mit einem Wort starten, welches den Stack leert.
Oder noch besser, mit einem Wort beginnen, welches sich die aktuelle Stacktiefe merkt und "macht" benutzt diesen Wert um dann alle Preise aufzurechnen.
Ciao
Carsten
stimmt. Also entweder bei der alten Loesung vorher ein
- Code: Alles auswählen
clearstack
eingeben.
Oder folgende Loesung..ob die so gut ist? Funktion ist jedenfalls
gegeben

- Code: Alles auswählen
create initialdepth -1 ,
: check initialdepth @ -1 = if depth 1- initialdepth ! then ;
: dazu + ;
: und ;
: macht depth 1- dup . initialdepth @ -
dup 0 > if
0
do
+
loop
else
drop
then
100 /mod
. ." Euro und " . ." Cent"
-1 initialdepth ! ;
: Bockwurst check 300 * ;
: Bier check 200 * ;
: Korn check 150 * ;
: VitaCola check 200 * ;
bis denne dann
-/\/\artin