XEmacs Font: Lucidia Console Font-Size: b Frage in den Raum: Wer von euch hat schon einmal mit einem alten BASIC-Dialekt gearbeitet (GWBasic, C64-BASIC oder so etwas ähnliches)? Ich habe mir gedacht: Schade, dass es soetwas nicht mehr gibt. {Vorführung: PRINT "Hallo Welt" PRINT 3*(2+3) {Basic arbeitet mit Infix-Operatoren} LET a=3 {Variablen} let a=a+5 print a dim b(5) {Arrays} let b(1) =7 let b(2)=2 let b(3)=b(1)+b(1+1) print b(3) {...und ich kann programmieren...} 10 PRINT "Hallo Welt" RUN { um das Hallo Welt eine Schleife herumprogrammieren } 5 FOR x=1 to 10 20 NEXT x list run } Nun zum wirklich interessanten Teil: Wie ist das programmiert? Erste Herausforderung: Infix-Ausdrücke bekannter Infix->Postfix-Algorithmus Code-Beispiele in der Forth-Newsgroup Statt 3 5 2 * + . kann ich sagen A[ 3 + 5 * 2 ]A . Tafel: 2 Stacks: 3> +> 5> *> (weil höhere Präzedenz) 2> Hätte * niedrigere Präzedenz gehabt, wäre + evaluiert worden. Als Operandenstack normalen Forth-Stack verwendet --> das machen die Literale eh schon. Neue Operatoren + * usw. Zeigen in Code: ' * 7 infix * INFIX A[ Zwischenziel erreicht: Infix-Ausdrücke Ich will aber nicht 2 + 3 * 4 sondern 2+3 *4 eingeben können. -> benötige Parser s" 3+5 *2" infix-eval . Damit simple Anweisungen möglich, z.B. ein einfaches PRINT : simple-PRINT 10 parse infix-eval . ; simple-PRINT 3+5*2 : simple-LET [Char] = parse 10 parse infix-eval -rot ['] constant execute-parsing ; (eher auf Tafel zeichnen) Nächster Schritt: Programme Benötigt: Code-Speicher (linked list, leicht einzufügen und sequenziell abzuarbeiten), Rücksprungstack (beides aufzeichnen) +--------------+---------------+------+ | Zeilennummer | Code (String) | next | +--------------+---------------+------+ LIST DEF 10 abcdef DEF 20 xyz DEF 15 --- LIST In Basic macht man aber: 10 PRINT "Hallo" Um nicht immer DEF schreiben zu müssen: Trick! Prüfe in PRINT, ob schon was am Stack liegt (= Zeilennummer). Wenn ja, schreib Zeile in den Codespeicher, sonst führe aus. Damit ich das nicht für jedes Wort einzeln machen muss: Im Code zeigen: STATE-AWARE PRINT _PRINT STATE-EXEC Was passiert nun, wenn ich ein Programm mit RUN ausführe? Im Code zeigen: RUN NEXTLINE wird vorher gesetzt, damit es von GOTO, GOSUB, RETURN, NEXT usw. verändert werden kann. (Zeige GOTO usw.) Erwähnen: Arrays (neuer Infix-Operator), FOR-NEXT-Schleifen (mehrere Werte am Return-Stack) ... das würde den Rahmen sprengen, wer sich dafür interessiert, kann sich den Source-Code herunterladen (www.heinzi.at) oder danach noch kurz mit mir plaudern. Um zu zeigen, dass das ganze funktioniert, altes BASIC-Programm aus dem Internet heruntergeladen. Zeigen: TICTAC.BAS Fragen? Limitations: * nur Integer * nicht Fehlertolerant