Coding-Schatzkästlein
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Zusammenfassung | ||||
|---|---|---|---|---|
| Name: |
Library GfA2JS
| |||
| Aufgabe: |
Stellt Funktionen der Programmiersprache GfA-Basic unter JavaScript zur Verfügung.
| |||
| Benötigt: |
JavaScript 1.1 (ungesichert), teilweise 1.2 (gesichert)
| |||
| Beispiel: |
fields.lst (GfA- | |||
| Download: |
libgfa2.js
| |||
Nach nunmehr mehr als 20 Jahren GfA-
Zwar stößt eine solche Umsetzung natürlich an die Grenzen, die
JavaScript als Nicht-
Alle GfA-Deflist 6), da kleine Variablennamen eher üblich sind und die
Funktionen auch nicht mit eventuell existierenden JavaScript-typeof Anwendung findet, zum anderen das
$-$ ist in JavaScript 1.0 ein unerlaubtes Zeichen), benötigt
die Bibliothek JavaScript 1.1 und sollte deswegen nur als externe Datei von der
HTML-<script type=).
Bislang umgesetzte Befehle (optionale Parameter in []):
Folgende Befehle haben keine identische Syntax:
Folgender Befehl hat eine erweiterte Funktionalität:
Der zusätzliche Parameter true (z.B. in STRING$(size,num,true))
existiert in GfA-true übergeben werden muß, war
die - aus meiner Sicht - typischere Verwendung des Befehls (so wird bei
STRING$() meistens eine Zeichenkette übergeben - also muß die Zahl
gesondert ausgewiesen werden, bei SUCC() ist es umgekehrt).
Bei SPACE$ sorgt ein zusätzlicher Parameter true dafür,
daß kein normales Leerzeichen, sondern ein festes HTML- ) ausgegeben wird (mehrere normale Leerzeichen werden in HTML
ja zu einem zusammengefaßt) . Bei SPC() werden hingegen immer
feste HTML-
Die Funktion PRINT(data,channel) entspricht einem PRINT #channel,data;,
wobei der channel optional ist und die Nummer eines Frames bezeichnet,
in den die Daten ausgegeben werden sollen. PRINTLN(data,channel)
arbeitet genauso, gibt aber zum Schluß einen Zeilenabschluß aus (entspricht
also dem PRINT ohne abschließendes Semikolon).
Der Aufruf TIMER() entspricht dem GfA-TIMER und gibt
die Systemzeit ebenfalls in 1/200stel-Sekunden aus (nur liegt der Startpunkt
des Systems auf dem 1.1.1970).
Die Benutzung von ALERT() ist zwar von der Syntax her ähnlich, aber die
mangelnde Flexibilität der JavaScript-
Achtung: Wenn GfA- und JavaScript-INSTR("ABC","A") ergibt 1),
während JavaScript ab 0 zählt ("ABC".indexOf("A") ergibt 0)!
Entsprechend wird auch bei nicht gefundener Zeichenkette der Rückgabewert
verringert (INSTR("ABC","D") ergibt 0,
"ABC".indexOf("D") ergibt -1).
Die Begrenzung der Zahlenbereiche, Integerbereich auf 8 Byte inkl. Vorzeichen,
also einem Zahlenbereich von -2147483648 ($80000000) bis
2147483647 ($7FFFFFFF) sowie Realbereich auf 13 Stellen,
habe ich nicht nachgebildet. Die Integerfunktionen arbeiten hier mit genauso
großen Zahlen wie die Funktionen der Realzahlen, bis zur zulässigen Größe
die die jeweilige JavaScript-HEX$(2147483648)
ist also gültig und ergibt 80000000 (genau wie HEX$(-2147483648),
was aus Kompatibilitätsgründen beibehalten wurde). Die optionale
Beschränkung der Ausgabegröße (0-32 bei BIN$(), 0-8 bei
HEX$(), bzw. 0-11 bei OCT$()) wurde jedoch nicht
vergrößert. Größere Zahlen werden sowohl direkt, als auch über die
GfA-1.234567890123E+14 wird umgewandelt
in 123456789012300).
Sollen Befehle verwendet werden, die eine höhere JavaScript-isBefehlsname abfragen
(z.B. hat isCHR$ den Wert true, wenn die Ausführung
möglich ist und false, wenn nicht).
Aber auch wenn JavaScript und GfA-
Nicht-umgehbare Unterschiede
GfA-Code JavaScript-Code
Kommentare
REM oder ' oder ! oder // oder /*
// oder /* (...) */
Namensraum
Variablen-Test.var - nicht alle GfA-
Variablen-TestVar oder Test_var)
Variable/Feldvariable
Variablentypdefinitionen $#%&|
Keine Definition - nur $ wird als Namensbestandteil akzeptiert, ist aber ohne Wirkung
LOCAL
var
CLR Variable
Variable=null
DIM Feld(100)
Feld=new Array() (keine Dimensionierung notwendig)
Variable=DIM?(Feld())
Variable=Feld.length
Variable=Feld(0)
Variable=Feld[0]
OPTION BASE 1
Keine Entsprechung in JavaScript
Der Index beginnt immer bei 0 (OPTION BASE 0)
DATA / RESTORE
Keine Entsprechung in JavaScript
Zahlensysteme
$, & oder &H (Prefix für Hexadezimalzahlen)
Keine Entsprechung in JavaScript: GfA &H0A entspricht parseInt("0A",16)
% oder &X (Prefix für Binärzahlen)
Keine Entsprechung in JavaScript: GfA &X1001 entspricht parseInt("1001",2)
&O (Prefix für Oktalzahlen)
0: GfA &O10 entspricht 010 oder parseInt("10",8)
0010 entspricht 10 (führende Nullen werden ignoriert)
0010 interpretiert JS als 8 (führende 0 ist ja Prefix für Oktalzahlen) - GfA 0010 entspricht somit 10 oder parseInt("0010",10)
Die Befehle der GFA2JS- parseGfA() in Dezimalzahlen um (parseGfA("$0A") entspricht parseInt("0A",16)). Nicht-MUL($A,%1001) MUL("$A","%1001")!
Arithmetik
INC Variable
Variable++
DEC Variable
Variable--
Variable=num1^num2
Variable=Math.pow(num1,num2)
Funktionen/Prozeduren
FUNCTION Name(Parameter)
(...)
RETURN Ergebnis
ENDFUNC
function Name(Parameter) {
(...)
return Ergebnis
}
PROCEDURE Name(Parameter)
(...)
RETURN
function Name(Parameter) {
(...)
}
Funktionsaufruf: @Funktion
Funktionsaufruf: Funktion() (Klammern auch bei Funktionen ohne Parameter)
Funktionsergebnis ignorieren: VOID @Funktion
Funktionsergebnis ignorieren: void (Funktion()) oder void Funktion()
Verzweigungen
SELECT Variable
CASE Konstante1 [TO Konstante2, ...]
[CONT]
DEFAULT
ENDSELECT
switch(Variable) { // (erst ab JavaScript 1.2)
case Konstante:
[break]
default:
}
IF Bedingung
(...)
ELSE IF Bedingung
(...)
ELSE
(...)
ENDIF
if(Bedingung) {
(...) }
else if(Bedingung) {
(...) }
else {
(...)
}
GOTO
Keine Entsprechung in JavaScript
Schleifen
FOR Variable=Startwert TO Endwert
(...)
NEXT Variable
for(Variable=Startwert;Variable<=Endwert;Variable++) {
(...)
}
FOR Variable=Startwert TO Endwert STEP 3
(...)
NEXT Variable
for(Variable=Startwert;Variable<=Endwert;Variable+=3) {
(...)
}
FOR Variable=Startwert DOWNTO Endwert
(...)
NEXT Variable
for(Variable=Startwert;Variable>=Endwert;Variable--) {
(...)
}
Achtung: Bei GfA-FOR ... NEXT (und nur in diesem Schleifen-
WHILE Bedingung
(...)
WEND
while(Bedingung) {
(...)
}
REPEAT
(...)
UNTIL Bedingung
do { // (erst ab JavaScript 1.2)
(...)
} while(Bedingung)
while(true) {
(...)
if(Bedingung) { break }
}
DO
(...)
EXIT IF Bedingung
(...)
LOOP
while(true) {
(...)
if(Bedingung) { break }
(...)
}
Vergleichsoperatoren
= <>
== !=
=< => ><
<= >= !=
==
Keine Entsprechung in JavaScript
Verknüpfungsoperatoren
AND OR NOT
&& || !
XOR IMP EQV
Keine Entsprechung in JavaScript
Interruptsteuerung
AFTER x GOSUB Procedure (x in 1/200 Sekunden)
Variable=window.setTimeout("Function()",x) (x in 1/1000 Sekunden)
AFTER STOP
window.clearTimeout(Variable)
AFTER CONT
Keine Entsprechung
EVERY x GOSUB Procedure (x in 1/200 Sekunden)
Variable=window.setInterval("Function()",x) (x in 1/1000 Sekunden)
EVERY STOP
window.clearInterval(Variable)
EVERY CONT
Keine Entsprechung
Auch müssen in GfA-
Beispiel-
(aus der Datenfeldverwaltung Fields) | |
|---|---|
| GfA-Code | JavaScript-Code |
FUNCTION getfield$(field$,nr%,div$)
|
function getfield$(field$,nr,div$) { |
LOCAL entry$,q%,v%,w%,nr.old%
|
var entry$,q,v,w,nrOld |
IF div$=""
|
if(div$=="") { |
div$="|"
|
div$="|" |
ENDIF
|
} |
field$=field$+div$
|
field$=field$+div$ |
nr.old%=nr%
|
nrOld=nr |
w%=0
|
w=0 |
REPEAT
|
do { |
v%=SUCC(w%)
|
v=SUCC(w) |
w%=INSTR(field$,div$,v%)
|
w=INSTR(field$,div$,v) |
IF w%=0
|
if(w==0) { |
entry$=MID$(field$,v%, MAX(SUB(LEN(field$),PRED(v%)),0))
|
entry$=MID$(field$,v, MAX(SUB(LEN(field$),PRED(v)),0)) |
ELSE
|
} else { |
DEC nr%
|
nr-- |
IF nr%<=0
|
if(nr<=0) { |
entry$=MID$(field$,v%, MAX(SUB(w%,v%),0))
|
entry$=MID$(field$,v, MAX(SUB(w,v),0)) |
ENDIF
|
} |
ENDIF
|
} |
EXIT IF w%=0
|
if(w==0) { break; } |
UNTIL nr%<=0
|
} while(nr>0) |
RETURN entry$
|
return entry$ |
ENDFUNC
|
} |
|
Die komplette konvertierte Fields- | |
REPEAT (...) UNTIL nach do { (...) } while beachten!
Auch sollte ggf. auf do { (...) } while verzichtet werden, da dieses
Schleifenkonstrukt erst ab JavaScript 1.2 existiert.|
Updates: | |
|---|---|
|
10.01.2004: |
Korrektur: Bei irgendeiner Copy'n'Paste-RANDOM() total verhunzt worden.
|
|
20.12.2003: |
Neue Funktionen: CFLOAT(), CINT(), COMBIN(), FACT() und VARIAT(). Update: MAX() und MIN() verarbeiten jetzt beliebig viele Zahlenwerte.
|
|
17.12.2003: |
Neue Funktionen: BIN$(), HEX$() und OCT$(). Update: Arbeitet eine GfA-CHR$() werden ungültige ASCII-CHR$(-65) entspricht nun CHR$(256-65)).
|
|
12.12.2003: |
Update: Es werden jetzt nicht nur Dezimalzahlen, sondern alle Zahlensysteme (GfA-STR$() jetzt auch die optionalen Parameter.
|
|
03.12.2003: |
Neue Funktionen: FRAC() und VAL().
|
|
01.11.2003: |
Korrektur: INSTR() bei leerer Suche, sowie LEFT$(), RIGHT$() und MID$() bei alten JS- |