_____________ _____________ /zZzZzZzZzZzZz/ /tTtTtTtTtTtTt/ /zZ/ /tT/ /Zz/ /Tt/ /Zz/ /tT/ /zZ/ /Tt/ /zZ/ /tT/ /Zz/ /Tt/ /Zz/________ /tT/ /ZzZzZzZzZzZz/ /Tt/ ZT Programmiersprache - Dokumentation Verfasst von Philipp Winterberg Juli 2002 Einführung ---------- Willkommen zu ZT. Sie haben sich entschieden, eine der biestigsten Programmiersprachen des Planeten zu lernen. Obwohl die Syntax von ZT leicht zu erlernen ist, ist es ein kleines Abenteuer, darin zu programmieren. Einige strukturelle Überlegungen in ZT sind inspiriert von 4DL, Numberix und unbabtized. ZT hat sich umarmende Datenpaare und Kommandos, die allein durch den Programmfluss definiert werden. Um die Sache nicht zu einfach zu machen, ist der Programmfluss übrigens diagonal. All diese Features dienen dazu, die Möglichkeit der Wiederverwertung von bereits geschriebenem ZT Quelltext auf ein Minimum zu reduzieren. Andere Programmiersprachen wie Brainfuck etc. sind viel zu benutzerfreundlich in dieser Beziehung: Nach nur kurzer Zeit des intensiven Lernens kann man kleine Programme schreiben und deren Quelltexte wiederverwenden, um die nächste Applikation sogar noch schneller zu kreieren. Falls Sie einen viablen Weg finden, dies in ZT zu tun, lassen Sie es mich wissen! Nebenbei: Der Name ZT ("Zer0 Tolerance") wird normalerweise einfach "Z" gesprochen, aber lassen Sie sich nicht davon abhalten, neue Möglichkeiten zu erfinden. ;-) Grundlagen ---------- Ein ZT Programm besteht aus vielen vielen kleinen weiblichen und männlichen Personen, genannt Romeos und Juliets. Jede Person hat - wie im richtigen Leben - einen Kopf (H = head), einen Körper (XY) und Füße (F): H <--- head X <--- body Y <--- body F <--- feet Abbildung 1: Struktur einer ZT Person (männlich) Kopf und Füße werden benutzt, um den weiteren Programmfluss zu steuern, der Körper enthält Daten. Da der normale Programmfluss langweilig ist und alle Juliets da draussen etwas einzigartiges wollen, werden ZT Programme diagonal in allen Richtungen abgearbeitet: _ _ |\ /| \ / +--------------+ | Programfluss | +--------------+ / \ |/_ _\| Abbildung 2: Richtungen des ZT Programflusses Weil Romeo und Juliet sich lieben, umarmen sie einander oft und gerne. Wie Sie wahrscheinlich schon vermuteten, tun sie es permanent in ZT Programmen. Das sieht in etwa folgendermaßen aus: xyfH hFXY Abbildung 3: Romeo umarmt Juliet Weil sie sich sehr sehr lieben, stört es Romeo und Juliet nicht einmal, dass sie einander die Füße in dieser ungewöhlichen 69er Stellung küssen. Dies machen sie speziell für Sie, damit der ZT Quelltext kompakter wird. Übrigens, Juliet ist oben. :-) Juliets Füße ______ v xyfH <-- Romeos Kopf Juliets Kops --> hFXY ^------ Romeos Füße Abbildung 4: Romeo küsst Juliets Füße Wenn sie sich so umarmen, bilden Romeo und Juliet ein gut stapelbares Packet. Jede Menge dieser Packete können in Zeilen und Spalten angeordnet werden. Wir verlassen nun die Welt der langweiligen HXYF-Abbildungen und werfen einen Blick auf ein echtes ZT program: 1st Juliet --> ZT<> <<2A <-- 1st Romeo 2nd Juliet --> XX<> <>ZT <-- 2nd Romeo Abbildung 5: ZT Programm mit zwei "Romeo & Juliet"-Pärchen Wir können schneller vorangehen? Okay, sehr gut, im Folgenden sehen Sie das gleiche ZT Programm wie in Abbildung 5, aber mit sehr viel mehr Pärchen: ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<> <--- 7 Juliets <<2A<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT <--- 7 Romeos XX<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<> <--- 7 Juliets <>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT <--- 7 Romeos Abbildung 6: Viele "Romeo & Juliet"-Pärchen Jetzt im Detail: Ein ZT Programm beginnt in der linken oberen Ecke mit Juliet (Ladies first!). Wie Sie sich erinnern, beinhaltet Juliets Körper Daten ("ZT"). Ihr Kopf ("<") und ihre Füße ("<") sagen dem ZT Interpreter, wo es weitergeht. Die verschiedenen möglichen Richtungen, die Juliet einschlagen kann, sind (um die Übersichtlichkeit zu verbessern, wurde Romeo komplett durch Punkte ersetzt): ZT<. \ <... _\| (weiter beim nächsten Romeo in Richtung rechts unten) ZT>. / <... |/_ (weiter beim nächsten Romeo in Richtung links unten) _ ZT>. |\ >... \ (weiter beim nächsten Romeo in Richtung links oben) _ ZT<. /| >... / (weiter beim nächsten Romeo in Richtung rechts oben) Abbildung 7: Juliets Kopf und Füße sagen dem ZT Interpreter wo es weitergeht Glücklicherweise war der ZT Interpreter Psychologe in einem früheren Leben. Er versteht daher die verschiedenen Sprachen von Männern und Frauen. Das wird im weiteren Verlauf noch wichtiger, allerdings ist schon jetzt nicht zu übersehen, dass Romeo und Juliet die gleichen Worte bzw. Zeichen für sehr unterschiedliche Dinge benutzen: ...> \ .>ZT _\| (weiter bei der nächsten Juliet in Richtung rechts unten) ...> / .ZT / (weiter bei der nächsten Juliet in Richtung rechts oben) Abbildung 8: Romeos Kopf und Füße sagen dem ZT Interpreter wo es weitergeht Gratulation! Sie haben gerade den ersten großen Schritt auf dem Weg zum professionellen ZT Entwickler gemeistert! Sie haben die Struktur von ZT Personen verstanden, das Konzept der "Romeo & Juliet"-Pärchen und den diagonalen Programmfluss kennengelernt. Jetzt geht es weiter mit einer satten Portion Action... Romeo und Juliet können beide "TALK", "JUMP", "MATH" und "SET" Kommandos verstehen. Aber es gibt da diese kleinen Unterschiede: Romeo redet nur über Zahlen, Juliet kann nicht sehr weit springen... Deshalb wählt der erfahrene ZT Programmierer sorgfältig die Person aus, die die Aufgabe am besten bewältigen kann. Aber wie sagt man Romeo, dass er springen soll? Oder Juliet, sie möge reden? Es ist ganz simpel: Sie sagen es ihnen durch den Programmfluss! Jeder Romeo und jede Juliet hat einen Datenkörper, der normalerweise Hexadezimaldaten enthält. Wenn nun beispielsweise der Programmfluss von links oben kommt, dann benutzt Juliet die hex-Daten, um darüber zu reden (sprich: sie gibt die hex-Daten als ASCII Zeichen auf dem Bildschirm aus). +--------------+ | Programfluss | +--------------+ \ _\| 4A<. --> TALK --> "J" (hex 4a) auf dem Bildschirm ausgeben <... Abbildung 9: Programfluss lässt Juliet reden Manchmal - naja, okay, wahrscheinlich oft - möchte man wirklich, das Juliet still ist und ausnahmsweise mal den Mund hält. Dies kann - anders als im wahren Leben - schnell und ohne Diskussion erreicht werden: Füllen Sie ihren Datenkörper mit "ZT" und es herrscht Stille. +--------------+ | Programfluss | +--------------+ \ _\| ZT<. --> DON'T TALK! <... Abbildung 10: Mit "ZT" in ihrem Datenkörper muss Juliet still sein, obwohl der Programfluss sie zum Reden auffordert Memory & Kommandos ------------------ ZT erlaubt Romeo und Juliet etwas, wovon echte Paare sehr oft träumen - zumindest in den ersten zwei Wochen der Beziehung -, sie dürfen ihre Gedanken miteinander teilen (ihren Speicher bzw. ihr Memory, um exakt zu sein). Es gibt 16 (hex 0..F) Speicherplätze, die entweder über einen Index Pointer angesprochen werden, oder direkt aus dem Datenkörper: "°[0..F]" (statt "°" darf alternativ auch "^", "*" oder sogar "?" verwendet werden). Wie Sie bereits wissen, wird das Kommando durch den Programmfluss und den Datenkörper (XY) bestimmt. Wenn der Datenkörper "ZT" beinhaltet, wird der Programmfluss fortgesetzt, ohne dass die normalerweise fällige Aktion von Romeo oder Juliet ausgeführt wird. Juliets TALK Aktion: ^^^^^^ +--------------+ | Programfluss | +--------------+ \ _\| XYF. H... --> TALK "XY" Abbildung 11: Programfluss fordert Juliet zum Reden auf TALK: XY als ASCII Zeichen auf dem Bildschirm ausgeben (XY: hex-Wert), dann MOVE in Richtung HF (definiert durch H und F. Siehe Abbildung 7). Beispiel: 5A<. \ <... --> "Z" (hex 5A) ausgeben, dann _\| _ °0<. /| >... --> memory[0] als ASCII ausgeben, dann / _ Juliets JUMP Aktion: /| \ ^^^^^^ XYF. --> JUMP / , wenn memory[index] <> 0, sonst JUMP _\| F... _ /| / +--------------+ | Programfluss | +--------------+ Abbildung 12: Programfluss fordert Juliet zum Springen auf _ \ /| JUMP: Wenn memory[index] = 0 spring einen Schritt _\| , sonst / . Dieses Kommando ignoriert alle HXYF Werte, schreiben Sie also hinein, was Sie wollen (außer "ZT"). _ Beispiel: UMP. /| \ J... --> jump / , wenn memory[index] <> 0, sonst JUMP _\| _ ???. /| \ ?... --> jump / , wenn memory[index] <> 0, sonst JUMP _\| _ ZT<. /| >... --> Nicht springen, aber MOVE / Juliets SET Aktion: ^^^^^^ +--------------+ | Programfluss | +--------------+ / |/_ XYF. H... --> All SET? Dann ZT Programm beenden und Party machen! Abbildung 13: Programfluss lässt Juliet die SET Aktion ausführen SET: All SET? Go party! (XY <> "ZT"). Dieses Kommando ignoriert alle HXYF Werte, schreiben Sie also hinein, was Sie wollen (außer "ZT"). Beispiel: UIT. Q... --> Quit ZT Programm ???. ?... --> Quit ZT Programm _ ZT<. /| >... --> Nicht Quit, aber MOVE / Juliets MATH Aktion: ^^^^^^ XYF. H... _--> MATH XY |\ \ +--------------+ | Programfluss | +--------------+ Abbildung 14: Programfluss fordert Juliet auf, das MATH-Kommando auszuführen MATH: index = (index + XY) mod 16 (X: '-' oder hex-Wert, Y: hex-Wert), dann MOVE in Richtung HF (definiert durch H und F. Siehe Abbildung 7). Beispiel: 01<. \ <... --> index = index + 1, dann _\| _ -2<. /| >... --> index = index - 2, dann / Romeos TALK Aktion: ^^^^^ +--------------+ | Programfluss | +--------------+ \ _\| ...H .FXY --> TALK "XY" Abbildung 15: Programfluss fordert Romeo zum Sprechen auf TALK: XY als Dezimalzahl auf dem Bildschirm ausgeben (XY: hex-Wert), dann MOVE in Richtung HF (definiert durch H und F. Siehe Abbildung 8). Beispiel: ...> \ .>63 --> output "99" (hex 63), dann _\| _ ...< /| .>°0 --> output memory[0], dann / Romeos JUMP Aktion: ^^^^^ ...H --> JUMP "HF" .FXY _ /| / +--------------+ | Programfluss | +--------------+ Abbildung 16: Programfluss fordert Romeo zum Springen auf JUMP: Spring Y Schritte MOVE in Richtung HF (definiert durch H und F. Siehe Abbildung 8), X wird wahrgenommen, aber ROMEO ist nicht fähig, so weit zu springen. Beispiel: ...> \ .>63 --> jump 3 Schritte _\| _ ...< /| .>°0 --> jump memory[0] Schritte / [aber nicht mehr als 16] Romeos SET Aktion: ^^^^^ +--------------+ | Programfluss | +--------------+ / |/_ ...H .FXY --> SET memory[index] = "XY" Abbildung 17: Programfluss fordert Romeo zum Setzen eines Wertes auf SET: Setze memory[index] auf Wert XY (hex-Wert, gespeichert als Dezimalzahl), dann MOVE in Richtung HF (definiert durch H und F. Siehe Abbildung 8). Beispiel: ...> \ .>63 --> set memory[index] = 99, dann _\| _ ...< /| .>°0 --> set memory[index] = memory[0], dann / ...> \ .>-3 --> set memory[index] = - 3 , dann _\| Romeos MATH Aktion: ^^^^^ ...H .FXY _--> MATH XY |\ \ +--------------+ | Programfluss | +--------------+ Abbildung 18: Programfluss fordert Romeo zum Rechnen auf MATH: Memory[index] = memory[index] + XY (X: '-' oder hex-Wert, Y: hex-Wert), dann MOVE in Richtung HF (definiert durch H und F. Siehe Abbildung 8). Beispiel: ...> \ .>63 --> memory[index] = memory[index] + 99, dann _\| _ ...< /| .>°0 --> memory[index] = memory[index] + memory[0], dann / ...> \ .>-3 --> memory[index] = memory[index] - 3, dann _\| Eingaben -------- Ich folge in diesem Punkt der 'unbabtized'-Input-Philosophie von Gerson Kurz: "There is no input. There is a philosophy behind this, you know! To my view, there are two kinds of input, user input and hardcoded input. User input sucks, and hardcoded input rules, so there." (2002.07.02, http://www.p-nand-q.com/unbabtized.htm) Beispiele --------- ZT bietet eine gigantische Welt voller Möglichkeiten, die Sie jetzt selbstständig erforschen dürfen. Um Ihnen dabei ein wenig Hilfe und einen abschließenden Überblick zu geben, sehen Sie hier noch einige kleine ZT Beispielprogramme: 5A<>........ <>ZT........ ....65<>.... ....<>ZT.... ........72<> ...Zer0.<<00 .Tolerance.. Abbildung 19: ZT Programm, das "Zer0" ausgibt 47<>..................... <>ZT..................... ...>6F>>................. .>FF<>ZT................. ....ZT<.21<>...>ZT><..... ....>...<>ZT.....ZT><. ............<>°0....>. ................<>ZT< // MOVE -_> <<2A // 42 ausgeben, MOVE <_- NICE // ZT beenden CODE Abbildung 21: Kürzestes komplettes ZT Programm mit Kommentaren 48<>>>>>ZT<>ZT<> Hello | <>ZT>>ZT<>ZT<>ZT World!| <<<<65<>6F<>6F<>6C<>>>>> >>>2<>ZT<>ZT<>ZT<>ZT<<<8 ZT<<<<<<6C<>20<>72<>64<< >ZT<>ZT<>ZT><<5 >>>>ZT><<<<<6C<>57<>ZT<< >>ZT><<<<<<7 ZT<<21<>ZT>>ZT<<<<<| >ZT><42<<<<<>ZT by| >>>>ZT><21<>>>> Philipp| >>>>>........................................................................ <>ZT.....ZT version of 99 Bottles of beer (Bottles.zt)...................... ...>ZT>..Philipp Winterberg, http://www.winterbergs.de...................... .<63<....................................................................... ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>.... <>°0<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>.. ZT<>20<>62<>6F<>74<>74<>74<>6C<>65<>28<>73<>29<>20<>6F<>66<>20<>62<>65<>65<> >ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>> <>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT ZT<>72<>20<>6F<>6E<>20<>74<>68<>65<>20<>77<>61<>6C<>6C<>2C<>0D<>0A<>ZT<>ZT<> >ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>> <>°0>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT ZT<>20<>62<>6F<>74<>74<>74<>6C<>65<>28<>73<>29<>20<>6F<>66<>20<>62<>65<>65<> >ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>> <>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT ZT<>72<>2E<>0D<>0A<>54<>61<>6B<<65<>20<>6F<>6E<>65<>20<>64<>6F<>77<>6E<>2C<> >XXX>XXX>ZT>>ZT>>ZT>>ZT>>XXXXXT>>ZT<>ZT>>ZT>>ZT>>XXXXXT>>ZT>>ZT>>ZT>>ZT>>ZT<> <>ZT>>ZT>>ZT>>ZT>>ZTXXXXX>ZT>ZT>>ZT>>ZT>>ZTXXXXX>ZT>>ZT>>ZT>>ZT>>ZT<ZT<>ZT<>ZT<>ZT<>ZXX>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZXX>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<> >ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>> <>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT ZT<>20<>70<>61<>73<>73<>20<>69<>74<>20<>61<>72<>6F<>75<>6E<>64<>2C<>0D<>0A<> ><-1<ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>> <>°0>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT ZT<>20<>62<>6F<>74<>74<>74<>6C<>65<>28<>73<>29<>20<>6F<>66<>20<>62<>65<>65<> >ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>> <>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT ZT<>72<>20<>6F<>6E<>20<>74<>68<>65<>20<>77<>61<>6C<>6C<>2E<>0D<>0A<<0D<>0A<> >XXX>XXX>ZT>>ZT>>ZT>>ZTXXXT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>ZT>>XXX>ZT>>ZT>ZT>>ZT>> <>ZT<>ZT<>ZT<>ZT<>XXXXZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZXXXXT<>ZT<>ZT<ZT>>ZT<>ZT<>ZTZT<>ZT<>ZT<>ZT<>ZT<>ZXXXXX<>ZT<>ZT<ZT>>ZT<> <>ZT<>ZT<>ZT<>ZT<>ZTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX>ZT<>ZT>ZT ZT<>ZT>>ZT<>ZT<>ZT<>ZTXXXXXXXXXXXXXXXXXXXXXXXXXXXXX>ZT<>ZT<>ZT<>ZT>ZT<> <>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT<>ZT>ZT<>ZT Abbildung 23: Schlechte "99 Bottles of Beer" Version in ZT, die zeigt, dass ZT Quelltext lächeln kann Dieses schlechte "99 Bottles of Beer" ZT Program zeigt, dass, obwohl die Sprache ZT designed wurde, Wiederverwendbarkeit von Quelltext zu verhindern, es - mit Hilfe hässlicher Techniken - immer noch möglich ist, wiederverwertbaren Quelltext zu schreiben. Aber der Quelltext wird dadurch unnötig aufgeblasen und verliert seine Eleganz. Randnotiz: Im August 2010, acht Jahre nach Veröffentlichung von ZT, schickte mir überraschend Yoshiki Kumagai eine hervorragende Version des "99 Bottles of Beer" Beispiel- programms in ZT: ZT<>...........>...>...>...>...>pF>>...>...>p1>>...>p1<>...>pE<>...>...> <>ZT.........>-1.>+1.>ZT.>ZT.>ZT<>ZT.>ZT.>ZT<>ZT.>-1<>ZT.>+1<>ZT.>-1.ZT>...>6C<>66<.20<>62<>2E<.0D<<0A<>6E<>65<>20<>70<>20<>20<>72<< ><63<>ZT<>*0.>ZT<>ZT>...>>ZT<>ZT>...>>ZT<>ZT<>ZT<>ZT<>ZT<>ZT>...>20<>62<>65<73>>65>ZT<54<>20<>61<>61<>69<>61<< <>ZT*>ZT.>J4>ZT<>ZT*>ZT<>ZT<>ZT*>ZT<>ZT*>ZT<>ZT<>ZT<>ZT<>ZT<>ZT>ZT>ZT<>6F<>...>20><65<>p1><20<>...>47>>61<>64<>6E<>73<>74<< .>+1>>ZT>JA<>ZT.>ZT<ZT>ZT.>ZT<ZT<>ZT<>ZT<>ZT>6D<>ZT>>65<>p1<<...>74<>6F<<....72<>ZT><6F<>6F<>p1<>6B<>6F<>64<>73<< <>ZT<>ZT>>ZT<>ZT>ZT<>ZT>ZT>>ZT<>ZT<>ZT<>ZT<>ZT>64<>65<>20>>2C><...>65<>74<<...>Fin...>6E<>20<>77<>65<>77<>20<< .>+1<>ZT>>ZT<>ZT<ZT<>ZT>ZT*>ZT*>ZT.>ZT>>J3<>ZT<>ZT<>ZT<>ZT>6F>>20>>6D<>20<>...>6F<>20<0A<....>0D<>0A<....>74<>61<>20<>6E<< .>ZT<>ZT<>ZT<>ZT>>J5.>ZT<>ZT>ZT>....>ZT>....ZT<>ZT<>ZT>20>>62<>75>>6F<>....20<>72<4E<ZT<>64<>pF<>68<>6C<>6F<> .>ZT<>ZT>>ZT<>ZT>>ZT....<>ZT>ZT<>ZT>ZT<>ZT>ZT<>ZT>74>>6F>>79<>20<>73><....6D<...>6F<>2C<>ZT<<65<>6C<< .>ZT<>ZT<>ZT>>ZT>>ZT<>ZT*>ZT.>J3<>ZT<>ZT>ZT>68>>72<>65<>20>>6F<<...>72<>.......75<>20<<...>pF>>20<> .>ZT<>ZT>>ZT>>ZT<>ZT>ZT>>ZT.....ZT>ZT>>ZT>61<<6E<<...>20>.6F<<...<6E<2E<>0D<< ....>...>...<>ZT>ZT<...>ZT*>ZT>>ZT*>ZT>>ZT><74>.pE<<....ZT><2C<.20<. .. by Mebius. ..>...><00<<00....>.......>...>... Figure 24: Herrliche "99 Bottles of Beer" version in ZT - herzlichen Dank an Yoshiki Kumagai aka Mebius Ziel ---- Yeah! Cool! Sie haben es den ganzen Weg durch diese Dokumentation geschafft - und das in Rekordzeit. Die romantische Welt von ZT liegt nun wie ein offenes Buch vor Ihnen. Zögern Sie nicht, mir Ihre ZT Meisterwerke zu schicken: mail(at)philipp-winterberg.de, subject: "ZT Killer Application" Der ZT Interpreter ist open source und darf unter GNU GPL vertrieben werden. Falls Sie einen weiteren ZT Interpreter/Compiler schreiben, schicken Sie mir doch eine Kopie. Danke. Anhang A -------- Nach ersten Reaktionen wird deutlich, dass ein FAQ (frequently asked questions) nicht schaden kann. Deshalb: F: "Leitet '//' Kommentare ein?" A: Nein. Das ist bei einigen Beispielen missverständlich, weil ich '//' aus Gewohnheit einfach geschrieben habe. Entschuldigung. Dass Kommentare nicht als solche gekennzeichnet werden müssen, wird deutlich, wenn man sich die Programmverarbeitung durch den ZT Interpreter verdeutlicht: Der Interpreter startet links oben und folgt dann Romeos und Juliets Richtungsangaben. Er läuft also von Person zu Person und wo er nicht hinkommt, kann man Kommentare unterbringen (Denn merke: Was der Interpreter nicht weiß, macht den Interpreter nicht heiß). F: "Was ist 'JUMP ZT' für Romeo?" A: 'JUMP ZT' bei Romeo bewirkt das Gleiche wie 'JUMP 01': HF geben die Richtung an, XY die Sprungweite. Bei '01' wird ein normaler Schritt gemacht, bei 'ZT' wird der JUMP Befehl komplett ignoriert, was aber im Ergebnis auch in einem normalen Schritt mündet. F: "Überhaupt JUMP: Angenommen Folgendes 111122223333 111122223333 4444..<.5555 4444>...5555 666677778888 666677778888 Sprich, Juliet will hüpfen. Wenn memory[index] <> 0, dann gehts nach 3, sonst nach 8 oder nach _feld-rechts-unten?" A: Ein Juliet-JUMP erfolgt - wie der normale Programmfluss - immer diagonal zum nächsten Romeo (also NICHT diagonal zum nächsten Pärchen). Im Beispiel sähe das so aus: 111122223333 111122RA3333 4444JJ<.5555 4444>.RB5555 666677778888 666677778888 Juliet (JJ) hüpft, wenn memory[index] <> 0, zu Romeo (RA) im 2er-Block (hmmm, geht sie fremd?), sonst zu ihrem eigenen Romeo (RB). F: "Endlich gleichzeitig programmieren und ASCII-Art? Wenn, ja *wenn* ZT doch nur reines ASCII wäre ... Eine Sache mißfiel mir nämlich: | Es gibt 16 (hex 0..F) Speicherplätze, die entweder über einen | Index Pointer angesprochen werden, oder direkt aus dem | Datenkörper: "°[0..F]". Musste es denn ausgerechnet ein ° sein? Das Zeichen ist doch nichtmal in ASCII enthalten (und auf meiner finnischen Tastatur nichtmal drauf :)). Gibt es Hoffnung, dass das ° in der nächsten Version von ZT durch ein ASCII-Zeichen ersetzt wird?" A: Guter Punkt. Specs und Interpreter wurden erweitert: statt "°" darf auch "^", "*" oder sogar "?" verwendet werden. Die sind alle ASCII und hoffentlich auch auf einer finnischen Tastatur vorhanden. Anhang B -------- + + + | Juliet | Romeo | | | | +-----+------------------+------------------+ TALK | Datenkörper oder | Datenkörper oder | | memory[index]als | memory[index]als | | ASCII ausgeben | Zahl ausgeben | +-----+------------------+------------------+ JUMP | Bedingter Sprung | Normaler Sprung | | memory[index]=0? | in Richtung HF | +-----+------------------+------------------+ SET | ZT Programm | Wert setzen: | | beenden | memory[index] | +-----+------------------+------------------+ MATH | Wert des Index | Wert ändern: | | Pointers ändern | memory[index] | +-----+------------------+------------------+ Diese Dokumentation wird, falls nötig, überarbeitet: [ 2010-08-24 - Abbildung 24 hinzugefügt: Besseres "99 Bottles of Beer" Beispielprogramm ] [ 2004-11-10 - URL in der Dokumentation aktualisiert ] [ 2002-07-29 - Neues Feature: statt "°" darf auch "^", "*" oder "?" verwendet werden ] [ 2002-07-07 - Fehler in der Dokumentation von Juliets MATH Aktion behoben + FAQ ] [ 2002-07-05 - Erste Veröffentlichung] ZT programming language, "Zer0 Tolerance" Copyright © 2002-2010 Philipp Winterberg, http://www.philipp-winterberg.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA [eof]