% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[T1]{fontenc} \usepackage[latin1]{inputenc} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} \renewcommand{\reftextbefore}{auf der vorherigen Seite} \renewcommand{\reftextfacebefore}{auf der vorherigen Seite} \renewcommand{\reftextafter}{auf der nächsten Seite} \renewcommand{\reftextfaceafter}{auf der nächsten Seite} \renewcommand{\figurename}{Listing} \begin{document} \title{Hexzahlen vorübergehend als \$1AFF eingeben oder als HX 1AFF ?} \ifx\shorttitle\undefined\else \shorttitle{Hexzahlen: \$ vs.\ \texttt{HX}} \fi \author{Albert Nijhof, HCC-Forth-gebruikersgroup, Niederlande} \maketitle Die mit freundlicher Genehmigung der HCC--Forth--gebruikersgroep hier wiedergegebene Übersetzung aus dem Holländischen wurde von Fred Behringer angefertigt. Das Original erschien in der Vijgeblaadje--Ausgabe 64 der niederländischen Forth--Gruppe im Oktober 2007 als Reaktion auf eine \texttt{comp.lang.forth}--Diskussion. Vorwort des Übersetzers: Übersetzen ist nicht immer leicht. Manchmal muss man den Mut haben zu erfinden. Im Englischen scheint es üblich zu sein, beispielsweise das \verb'66', das im Intel--Real--Mode aus dem 16--Bit--Assembler--Befehl \verb'AX' per \verb'66 AX' den 32--Bit--Befehl \verb'EAX' macht, als \emph{prefix} zu bezeichnen. Aber auch das \verb'$', das in manchen Systemen die Forth--Eingabe \verb'$4711' als Hexadezimalzahl kennzeichnet, wird als \emph{prefix} bezeichnet. Im Deutschen ist das \emph{in} in \emph{in Berlin} eine Präposition, aber kein \emph{Präfix}. Das \emph{in} in \emph{informieren} ist ein Präfix (DUDEN: vorn an den Wortstamm angefügtes Bildungselement), aber keine Präposition. Albert, der Autor des vorliegenden Artikels, verwendet für \verb'$' im obigen Beispiel im niederländischen Original die Bezeichnung \emph{voorteken}, zu Deutsch \emph{Vorzeichen}. \emph{Vorzeichen} ist mir im Deutschen zu sehr mit Plus und Minus verknüpft. In Beispielen wie dem obigen \verb'66' (in \verb'66 AX') verwendet Albert die Bezeichnung \emph{voorzetsel}, zu Deutsch \emph{Präposition} oder \emph{Verhältniswort}. Das kann ich genau so wenig vertreten. Zur ganz genauen Verdeutlichung spricht Albert auch von \emph{losse voorzetsel} (dort, wo sie (als Forthwort) wirklich \emph{lose} vorangesetzt werden). Ich überlasse es den Sprachgewaltigen in der Forth--Gesellschaft, eine geignete Bezeichnung zu finden, und verwende einfach das an die deutsche Rechtschreibung angepasste und im Übrigen ins Auge springende Wort \emph{Vorsetzel} oder \emph{loses Vorsetzel} (je nach Situation) als Bezeichnung. Und nun überlässt der Übersetzer das Wort dem Autor: \begin{multicols}{2} In der comp.lang.forth bemühen sich die Forthler um einen Vorschlag, \emph{Vorsetzel} in das offizielle Forth--Standardisierungsdokument aufgenommen zu bekommen. Vorsetzel sind zum Beispiel das \verb'$' und das \verb'#' in \verb'$100' und \verb'#100'. Ein vorn fest an eine Zahl angefügtes Vorsetzel bestimmt, welchen Wert das basisbestimmende Wort \verb'BASE' beim Verarbeiten dieser Zahl verwenden soll. \verb'$' bedeutet hexadezimal und \verb'#' könnte dezimal bedeuten. Man ist sich über die endgültige Wahl der Zeichen noch nicht ganz einig. Die Basis wird durch \verb'$' oder \verb'#' nur zeitweilig verändert. Nach \verb'$100' ist sie wieder dieselbe wie vorher. Im Kielwasser dieses Themas finden sich auch jene Vorsetzel, die den ASCII--Code oder den Kontrollcode liefern, wenn sie (als Vorsetzel) vor ein (beliebiges) Zeichen gesetzt werden. \begin{figure*}[t] \begin{quote} \begin{listing}{1} : FFBASE ( base -- ) CREATE , IMMEDIATE DOES> BASE @ >R @ BASE ! BL WORD COUNT ['] EVALUATE CATCH R> BASE ! THROW ; DECIMAL 16 FFBASE HX 10 FFBASE DM 2 FFBASE BN \ usw. : STATE-SMART ( x -- ? ) STATE @ IF POSTPONE LITERAL THEN ; : CH CHAR STATE-SMART ; IMMEDIATE : CTRL CHAR HX 1F AND STATE-SMART ; IMMEDIATE \end{listing} \end{quote} \caption{\label{allwords}Zusammenfassung aller vorgestellten Worte} \end{figure*} \vspace*{-0.5ex} \section{ASCII} Ich fange mit dem Letzteren an, mit dem Einlesen von ASCII--Code. Zu diesem Behufe stehen (in ANS--Forth) die Worte CHAR und [CHAR] bereit, die aber zwei Nachteile haben: \begin{enumerate} \item Sie sind für ihre Funktion zu lang. Vor allem [CHAR] vernebelt die Sicht auf das Zeichen, um das es geht, und ermüdet beim Eintippen. \item Der Programmierer muss ständig überlegen, ob er CHAR oder [CHAR] einzusetzen hat. \end{enumerate} Der zweite Nachteil zeigt große Ähnlichkeit mit dem d--oder--dt--Problem bei den niederländischen Zeitwörtern. Das ist eine künstliche Rechtschreibhürde, die einzig und allein dazu dient festzustellen, ob der Schreiber seine Sprache beherrscht oder nicht. Wollte man das --dt abschaffen und einführen, dass \emph{hij word} (er wird) und \emph{jij vind} (du findest) ohne t dahinter korrektes Holländisch ist, dannn würde das bedeuten, dass eine Tradition verloren ginge, die auf viele Zeitgenossen nur irritierend wirkt. (Übers.: Vielleicht könnte man im Deutschen zur Erläuterung den Ausdruck \emph{er verwandt} (zum Schreiben einen Kugelschreiber) und den Ausdruck \emph{er verwand} (seinen Schmerz über den erlittenen Verlust) einander gegenüberstellen.) ASCII--Code einlesen können Sie mit dem losen Vorsetzel \verb'CH', welches leicht definiert werden kann und die oben genannten Nachteile nicht hat: \vspace*{-0.8ex} \section{Das Vorsetzel \texttt{CH}} Wenn Sie gegen State--Smart--Worte allergisch sind, lesen Sie lieber nicht weiter \verb';-)' \vspace*{-0.2ex} \begin{verbatim} : STATE-SMART ( x -- ? ) STATE @ IF POSTPONE LITERAL THEN ; \end{verbatim} \vspace*{-0.5ex} \begin{verbatim} : CH CHAR STATE-SMART ; IMMEDIATE \end{verbatim} \vspace*{-0.5ex} \verb'CH A' bewirkt auf jeden Fall dasselbe wie \verb'CHAR A' außerhalb von Definitionen, und wie \verb'[CHAR] A' innerhalb von Definitionen. Der Name \verb'CH' ist kurz genug. \verb'C' alleine wäre dagegen meiner Meinung nach zu kurz und daher verwirrend. Das Vorsetzel CH (plus Leerzeichen) steht \emph{immer} vor dem Zeichen, für das man den ASCII--Code haben will. In dem seltenen Fall, dass das Zeichen nicht unmittelbar folgt, sondern erst später eingelesen wird, muss CHAR verwendet werden (ganz so wie in der Definition von \verb'CH' selbst). In den Augen eines Programmierers ist das natürlich logisch, da es dann ja nicht mehr um ein Vorsetzel geht, sondern um eine ganz andere Funktion. [CHAR] wird nun nicht mehr benötigt und für denjenigen, der das gern haben möchte, gibt es auch\vspace*{0.5ex} \begin{verbatim} : CTRL CHAR 31 AND STATE-SMART ; IMMEDIATE \end{verbatim} \begin{figure*}[b] \begin{quote} \begin{listing}{1} : FFBASE ( base -- ) CREATE , IMMEDIATE DOES> BASE @ >R @ BASE ! BL WORD DUP FIND STATE @ ( 0<> ) OVER = SWAP 0= OR IF DROP COUNT ['] EVALUATE \ compile, or number? ELSE NIP \ execute THEN CATCH R> BASE ! THROW ; DECIMAL 16 FFBASE HX 10 FFBASE DM 2 FFBASE BN \ usw. \end{listing} \end{quote} \caption{\label{fullffbase}Eine Fassung von \texttt{FFBASE}, die auch bei Worten verwendet werden kann, die den Eingabestrom lesen.} \end{figure*} \section{Standard} \verb'CH' hat nichts im Standard zu suchen, da man es in jedem Forth ganz schnell fabrizieren kann. Wenn Sie dafür einen anderen Namen haben wollen, geben Sie ihm einen anderen Namen. Die Arbeitsweise ist flexibel und entspricht der üblichen Forthmanier. Bei den an das nachfolgende Forth--Wort festangefügten Vorsetzeln liegt die Sache anders. Die können nämlich nicht so einfach je nach Bedarf definiert werden. Stehen sie einem nicht zur Verfügung und will man sie sich machen, dann muss man am Forth--Kern herumbasteln. Stehen sie im verwendeten Forth zur Verfügung, aber will man sie erweitern oder andere Zeichen verwenden, dann gilt dasselbe: Das heißt dann Patchen, soweit man überhaupt herausbekommen kann, wo. Daher also der Versuch, sie in den Standard aufgenommen zu bekommen. Das einfache Hinzudefinieren geht ja nicht. Sie haben es natürlich bereits erwartet (ich habe darüber schon gesprochen): Auch für die \verb'BASE'--Vorsetzel gibt es eine einfache Alternative mit lose vorangesetzten Vorsetzeln. Das funktioniert in jedem normalen Forth und ist in der Namensgebung flexibel. Mal schnell ein anderes BASE \begin{verbatim} : FFBASE ( base -- ) CREATE , IMMEDIATE DOES> BASE @ >R @ BASE ! BL WORD COUNT ['] EVALUATE CATCH R> BASE ! THROW ; \end{verbatim} \verb'FF' ist in Holland ein SMS--Kürzel für \emph{mal eben}: \verb'W8 FF' = \emph{Wacht even} (ausgesprochen: \emph{wacht effe}) = \emph{warte mal eben}, \emph{wart mal 'nen Moment}. Mit \verb'FFBASE' kann man ganz leicht für jeden gewünschten Wert von BASE Vorsetzel definieren. Das \verb'EVALUATE' steht in einem \verb'CATCH', um nach einem Fehler während \verb'EVALUATE' das globale \verb'BASE' wiederherstellen zu können. Falls das für nicht so wichtig gehalten wird, geht es einfacher auch so: \begin{verbatim} DOES> BASE @ >R @ BASE ! BL WORD COUNT EVALUATE R> BASE ! ; \end{verbatim} Die Vorsetzel \verb'HX' \verb'DM' ... \begin{verbatim} DECIMAL 16 FFBASE HX 10 FFBASE DM ... \end{verbatim} \verb'HX 100' bedeutet 256, unabhängig davon, welchen Wert \verb'BASE' (gerade) hat. Mit \verb'DM' wird eine Dezimalzahl eingeführt. HEX DM 27 . [rtn] 1B ok Genau wie bei \verb'CH' funktioniert das auch innerhalb von Definitionen. \begin{verbatim} DECIMAL : .ASC ( -- ) HX 80 BL DO I HX F AND 0= IF CR THEN I EMIT I . LOOP ; \end{verbatim} \verb'HX 80' und \verb'HX F' werden als 128 und 15 compiliert, \verb'HX' selbst findet sich natürlich in der compilierten Definition nicht mehr wieder. Wie weit gehen wir (sie in \texttt{comp.lang.forth}) mit den fest angefügten Vorsetzeln? Die allererste Reaktion auf den diesbezüglichen Vorschlag las sich im Stile von: Da muss dann aber auch bestimmt ein Vorsetzel für Oktalzahlen her, da das beim Schreiben eines Assemblers mitunter recht bequem ist. Tja, über binär haben wir auch noch nicht gesprochen und jüngst war ich mit einem Programm beschäftigt, in welchem Siebenerzahlen gut gebraucht werden konnten, und Sechsunddreißigerzahlen... Müssen wir jedes Forthsystem mit Standardabsprachen über fest angefügte Vorsetzel für alle möglichen Basiszahlen überfrachten? Mit \verb'FFBASE' ist das kein Problem. Da machen Sie es einfach so, wie Sie es gerade benötigen. \section{Gratisdreingabe bei \texttt{FFBASE}--Vorsetzeln} Ganz nebenbei lassen sich die \verb'FFBASE'--Vorsetzeln auch für Forth--Worte verwenden, die Zahlen ausgeben (nur interaktiv): \begin{verbatim} DECIMAL 10 HX . [rtn] A ok -1 HX U. [rtn] FFFF ok \end{verbatim} Folglich also auch für das oben definierte \verb'.ASC' \begin{verbatim} HX .ASC [rtn] 20 !21 "22 #23 $24 %25 &26 '27 (28 ... DM .ASC [rtn] 32 !33 "34 #35 $36 %37 &38 '39 (40 ... \end{verbatim} Willkommene Extraerscheinung. Sagen wir uns also auch gleich los von den ach so bequemen Worten wie \verb'.HEX' \verb'H.' \verb'.BIN' usw. Bemerkung: \verb'HX' und \verb'DM' akzeptieren keine Worte, die den Eingabestrom lesen. \section{Die Lesbarkeit} \verb'HX 100' liest sich besser als \verb'$100', davon bin ich überzeugt. Aber ich sehe auch ein, dass jemand, der jahrelang \verb'$100' verwendet hat, mit \verb'HX 100' niemals einverstanden sein wird. Gerade so, wie die Tradition das oben genannte Problem mit dem --dt (in der holländischen Sprache) am Leben erhält. Es wird immer Menschen geben, die sagen, dass das Einführen der Schreibweise \emph{hij word} nicht möglich ist, "weil es \emph{hij wordt} heißen muss". Es kommt halt, so denke ich, darauf an, was man gewohnt ist. Wie hat Kemal Atatürk es 1928 nur geschafft, dass ein ganzes Volk von der arabischen zur lateinischen Schrift überging? Listing \vref{allwords} zeigt noch einmal alle hier eingeführten Forth--Worte zusammen. Und zu guter Letzt zeigt Listing \vref{fullffbase} noch \verb'FFBASE' in einer Fassung, die auch bei Worten verwendet werden kann, welche den Eingabestrom lesen. \end{multicols} %\end{document}