Entweder meinte Wolfgang das als Pseudo-Code, was dann ein Wort (Wort=Funktion, in C-Sprache) sein kann und "z-achse-freigeben" heissen könnte, oder man könnte es tatsächlich auch so schreiben, indem "Z" zu einer Konstante auflöst, die z.B. ein Bit eines Ports definiert, "Achse" zu einer Portadresse und "freigeben" ein Wort ist, was dann den Wert des Ports setzt (und blockieren löscht) und somit schließlich z.B. ein Relais steuert, um eine Verankerung für die z-Achse zu lösen.
Fangen wir mal mit den Low-Level Funktionen an:
\ setze das angegebene Bit im angegebenen Port : set-port-bit ( port bit -- ) 1 lshift ( port mask ) over c@ or swap ( neue-bits port ) c! ;
\ lösche das angegebene Bit im angegebenen Port : clear-port-bit ( port bit -- ) 1 lshift ( port mask ) invert over c@ and swap ( neue-bits port ) c! ;
Das schöne an Forth ist nun, daß man einfach Teile auslagern kann (wenn man keine locals verwendet). Ich bin da kein Profi drin, gibt ein paar praktische Idiome, die ich nicht kenne, besonders mit Speicherzugriffen, aber könnte z.B. so aussehen:
: exp2 ( bit -- mask ) 1 lshift ; : load ( addr x -- addr x c@ ) over c@ ; : store ( addr value -- ) swap c! ;
\ setze das angegebene Bit im angegebenen Port : set-port-bit ( port bit -- ) exp2 load or store ;
\ lösche das angegebene Bit im angegebenen Port : clear-port-bit ( port bit -- ) exp2 invert load and store ;
Das ist die Philosophie von Forth: viele kleine und übersichtliche Wörter definieren, die leicht einzeln getestet werden können und wo sofort klar ist, was die machen. Bei set-port-bit und clear-port-bit kann man an der refaktorierten Version schon fast im Klartext lesen, was die Wörter machen.
Jetzt kann man ein paar Konstanten definieren:
0 constant x 1 constant y 2 constant z42 constant achse
und die beiden Wörter für die freigeben und blockieren Funktion sind dann trivial, werden aber für eine bessere Lesbarkeit definiert, statt die Low-Level-Funktionen später aufzurufen:
: freigeben ( bit port -- ) swap set-port-bit ; : blockieren ( bit port -- ) swap clear-port-bit ;
und schon kann man schreiben
z achse freigeben
Das ganze geht alles interaktiv, z.B. per Terminal-Session, wenn man einen Microcontroller mit ausreichender Speicherkapazität hat (also die erwähnten
8 kB Flash für ein komplettes Forth-System und ein paar kB RAM oder so, je nach Anwendung).Zum einlesen, nicht mehr ganz aktuell, aber immer noch sehr gut:
Sonst einfach den Artikel und die Links und Referenzen hier durchlesen: