% 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 <name> -- )
   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 <name> -- )
   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 <name> -- )
   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}
