Gehversuche in Forth

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
Antworten
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Gehversuche in Forth

Beitrag von U-Held »

Hallo, ich weiß nicht mehr weiter:

: hello_file
mount? parsenw dup if
dup adm:newfile .err
c" Hello file!" 09 adm:fkt!s!
adm:close
else drop 23 .err then ;

...erzeugt mit einem Aufruf wie "hello_file hf.txt" nur eine leere Datei. :-(

Was habe ich falsch gemacht?

Verzweifelte Grüße vom U-Held.
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Gehversuche in Forth

Beitrag von drohne235 »

Hatte ich in schon irgendwo adm:newfile definiert, oder ist die Definition von dir?

Aber egal wie: die Administra-Funktion sd_newfile erzeugt nur eine neue Datei ohne implizites öffnen! Wenn ich richtig sehe, muss dem adm:newfile also noch ein adm:open (schreibend) folgen, um die erzeugte Datei erst zu öffnen. Versuch mal.

Edit: Sorry, die adm.lib ist noch ziemlich unvollständig. Vielleicht können wir sie aber zusammen ein wenig erweitern?
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Re: Gehversuche in Forth

Beitrag von U-Held »

drohne235 hat geschrieben:Hatte ich in schon irgendwo adm:newfile definiert, oder ist die Definition von dir?
Nein, adm:newfile habe ich in der sd0.lib gefunden. Hätte ich auch dazuschreiben können. So wie das "ifnot" für einzelne Wörter müsste es noch ein "require" für ganze Libs und Mods geben, das im aktuellen und im Forth-Verzeichnis nach der Datei sucht und sie bedingt einliest. Das wäre Build-Hilfe und Doku in einem. Die Gefahr besteht darin, dass der Speicher voll ist mit unbenutzten Wörtern und das eigene Programm keinen Platz mehr hat. Das ist mit einem Ein-Pass-Compiler aber nicht zu schaffen.
drohne235 hat geschrieben:Wenn ich richtig sehe, muss dem adm:newfile also noch ein adm:open (schreibend) folgen, um die erzeugte Datei erst zu öffnen. Versuch mal.
Hatte ich schon versucht. Aber ich versuche es noch einmal und melde mich.

Wie überrede ich eigentlich .err resp. ERR dazu, den Fehlercode vor dem Reset auch auszugeben?
drohne235 hat geschrieben:Sorry, die adm.lib ist noch ziemlich unvollständig. Vielleicht können wir sie aber zusammen ein wenig erweitern?
Danke für das Angebot, ich nehme es gern an!

Grüße, U-Held
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Gehversuche in Forth

Beitrag von drohne235 »

Habe gerade noch ein Problem gefunden. Die Funktion adm:putblk kann nicht mit "09 adm:fkt!s!" definiert werden! Bei der Übertragung eines Strings (s!) wird als erstes die Stringlänge als Byte übertragen. Ein String kann also eine maximale Länge von 256 Byte haben. Die Funktion adm:putblk/getblk erwarten aber als Länge ein Long, damit größere Datenblöcke im Stück übertragen werden können. Korrekt müsste man also ein "adm:fkt!blk!" definieren und für diese Funktion verwenden.

Wo die Fehlerausgabe von .err verschwunden ist, sehe ich grad nicht. Kann sein, dass ich sie versehentlich wegrationalisiert habe, um Speicher zu sparen... :(
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Re: Gehversuche in Forth

Beitrag von U-Held »

OK, habs. Danke für die Tips.

Code: Alles auswählen

\ require sd0.lib
\ adm:puts  ( str -- )
: adm:puts
  dup C@ dup
  b[
    09 [a!] [a.l!]      \ adm:putblk
    0 do
      1+ dup C@ [a!]
    loop
  ]b
  drop ;

: hello_file
  mount? parsenw dup if 
    dup adm:newfile .err
    57 adm:open .err
    c" Hello file!" adm:puts
    adm:close
  else drop 23 .err then ;  
Man könnte noch ein "open" schreiben, das die Datei ggf. neu anlegt.

Gruß, U-Held
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Gehversuche in Forth

Beitrag von drohne235 »

Man könnte noch ein "open" schreiben, das die Datei ggf. neu anlegt.
Meine Wortnamen sind da noch nicht so ausgegoren. Vielleicht wäre "newopen" ein guter Name. Ansonsten habe ich gerade in meinem basics.mod gesehen, dass "open" nur lesend öffnet - sollte vielleicht auch parametrisierbar sein.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
Antworten