% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[utf8]{inputenc} \usepackage{multicol} % \usepackage{babel} \usepackage{xspace} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} %\newcommand{\code}[1]{\texttt{#1}} %\newcommand{\ret}{\textsf{$<$ret$>$}\xspace} %\newcommand{\ret}{$\hookleftarrow$\xspace} \renewcommand{\reftextbefore}{auf der vorherigen Seite} \renewcommand{\reftextfacebefore}{auf der gegenüberliegenden Seite} \renewcommand{\reftextafter}{auf der nächsten Seite} \renewcommand{\reftextfaceafter}{auf der gegenüberliegenden Seite} \renewcommand{\figurename}{Abbildung} \begin{document} \title{Ein ANS–Plädoyer für FORGET} %\ifx\shorttitle\undefined\else %\shorttitle{Ein ANS--Plädoyer für FORGET} %\fi \author{Fred Behringer} \maketitle \begin{multicols}{2} In Turbo--Forth (16 Bit) gibt es für solche Nebenrechnungen im Interpreter--Modus, die Kontroll--Strukturen (Schleifen) beanspruchen, das Wort \begin{verbatim} :: ... Worte wie im Parameterfeld einer Colon-Definition ... ; \end{verbatim} Hier ein Anwendungsbeispiel: \begin{alltt} decimal \ret\ ok :: 20 20 1 do i + loop . ; \ret\ 210 ok \end{alltt} In diesem Beispiel werden die Zahlen von 1 bis 20 aufaddiert und das Ergebnis, nämlich 210, wird auf dem Bildschirm ausgegeben. Das Beispiel soll nur der Demonstration dienen. Man überlegt sich ja leicht, wie die Ergebniszahl 210 zustande kommt: Man schreibe sich die Zahlenfolge einmal vorwärts und einmal rückwärts untereinander hin. Die übereinanderstehenden Zahlen ergeben jedes Mal 21. Und das 20 mal. Verlangt ist die Summe der Reihe nur ein einziges Mal, gleichgültig, ob vorwärts oder rückwärts aufaddiert. Also muss noch durch 2 geteilt werden. Ergebnis: 210. In ZF ist \texttt{::} nicht vorgesehen. Man kann aber die Definition von \texttt{::} aus Turbo--Forth auch für ZF verwenden. Sie lautet: \begin{verbatim} : :: hide here >r [ ' : @ ] literal , !csp ] r@ execute r> dp ! ; \end{verbatim} Das Ganze geht auf F83 zurück und Turbo--Forth wie auch ZF sind F83--Derivate. MinForth von Andreas Kochenburger (zumindest in der Version 1.5) weigert sich, diese Definition von \texttt{::} zu akzeptieren. Wie soll es auch? Von \texttt{dp} ist in ganz ANS--Forth keine Rede, von \texttt{!csp} ebenso wenig. \texttt{hide} ist eine schöne Sache, aber in den ANS--Empfehlungen gibt es kein \texttt{hide}. Nun gibt es aber doch das interessante Wort \texttt{forget} --- in Turbo--Forth und in ZF, aber auch in MinForth. Und wie man hört, könnte \texttt{forget} im nächsten ANS--Standard wieder aufgenommen werden. Selbstverständlich könnte ich das gesamte Parameterfeld voller cfa--Werte in eine voll ausgebildete Colon--Definition mit Namen packen und nach Aufruf von \ret\ und Abarbeiten der im Parameterfeld von liegenden cfa--Werte dann \texttt{forget} anwenden. Das würde zwar von Seiten des Anwenders etwas mehr Disziplin verlangen als das mechanisch anwendbare \texttt{::} aus Turbo--Forth, wäre aber weniger gekünstelt: Man hat ja plastisch vor Augen, was geschieht. Oder anders ausgedrückt: Man müsste sich überlegen, wie das, was man vorhat, zustande kommt, um die vorgeschlagene Konstruktion immer richtig hinschreiben zu können. Und es erscheinen, von \texttt{forget} oder \texttt{marker} mal abgesehen, nur Worte aus dem ANS--Core--Word--Set, also auch für jeden Nicht--System--Implementierer mehr als einleuchtend: \begin{alltt} : ... ; forget \ret\ ok \end{alltt} Das funktioniert in jedem System, das \texttt{forget} in einer Form enthält, die seinem Namen gerecht wird. kann beliebig gewählt werden. MinForth ist 32 Bit breit, in C geschrieben und unterprogramm--gefädelt. Spielt alles keine Rolle! Ich schreibe das obige Beispiel noch einmal hin, diesmal mit der vorgeschlagenen Syntax: \begin{alltt} decimal \ret\ ok : :: 20 20 1 do i + loop . ; :: forget :: \ret\ 210 ok \end{alltt} Natürlich kann man das auch mit Systemen machen, die den noch aktuellen ANS--Empfehlungen entsprechen, z.~B.\ Gforth 0.6.2, wenn man statt zu \texttt{forget} seine Zuflucht zu \texttt{marker} nimmt: \begin{alltt} decimal \ret\ ok marker ;; \ret\ ok : :: 20 20 1 do i + loop . ; :: ;; \ret\ 210 ok \end{alltt} Vielleicht lässt sich die folgende Version leichter merken, da sie mit \texttt{: :: ... ;; ;} einen etwas symmetrischeren Eindruck hinterlässt: \begin{alltt} decimal \ret\ ok marker ;; \ret\ ok : :: 20 20 1 do i + loop . ;; ; :: \ret\ 210 ok \end{alltt} Und auch bei dem Beispiel mit \texttt{forget} kann man das eliminierende Wort, in diesem Fall \texttt{forget}, in die Colon--Definition mit hineinziehen: \begin{alltt} decimal \ret\ ok : :: 20 20 1 do i + loop . forget ; :: :: \ret\ 210 ok \end{alltt} Leichter wird es dadurch allerdings kaum: Das erste \texttt{::} nach dem \texttt{;} ruft hier die Colon--Definition \texttt{::} auf, der \emph{Inhalt} der Colon--Definition wird abgearbeitet und dabei tritt als letztes Wort \texttt{forget} in Aktion, das das zweite, also das noch im Eingabestrom verbliebene \texttt{::} hinter \texttt{;} abarbeitet --- womit alles wieder so ist wie bei Eintritt in die Colon--Definition über \texttt{:} . Nachwort: In Forth kann man auch als Anwender (mit den Mitteln der Sprache) ins System eingreifen. Im ANS--94--Dokument heißt es hierzu: One of the features of Forth that has endeared it to its users is that the same tools that are used to implement the system are available to the application programmer --- a result of this approach is the compactness and efficiency that characterizes most Forth implementations. Nun, mir war dieses Feature keine große Hilfe. Die für das Wort \texttt{::} aus Turbo--Forth eingesetzten Tools konnten allein mit den Mitteln der Sprache gar nicht ganz allgemein nach ANS--Forth übertragen werden. Sie unterscheiden sich, wenn man Forth als konkret anwendbares System und nicht abstrakt als Sprache betrachtet, zu stark von System zu System. \emph{Back to the roots} lautet das Zauberwort. Nicht (mit unzugänglichen Forth--Worten) am System herumfeilen, sondern an den Überlegungen (zu dem, was eigentlich gemacht werden soll). Dem Standardisierungs--Bestreben tut das keinen Abbruch: Wenn ich an System--Worten wie \texttt{::} herumdoktere, bin ich, obwohl ich das aus einem Anwender--Programm heraus machen kann, bestimmt kein reiner \emph{Application--Programmer} mehr. \end{multicols} % \end{document}