ColCül-Hilfe

- Reservierte Zeichen
- Eingabe von Zahlen
- Befehle für Ein- und Ausgabe
- Einstellige Rechenfunktionen
- Zweistellige Rechenfunktionen
- Weitere Rechenfunktionen
- Logikfunktionen
- Weitere Logikfunktionen
- Schleifen
- Verzweigungen
- Prozeduren und Funktionen
- Verschiedenes
- Deque-Verwaltung
- Gestaltung
- Zeichenketten
- Beispielprogramme
- Kontakt


ColCül ist sowohl eine Programmiersprache, um einfache Berechnungen auszuführen, als auch ein literarisches Projekt. Die Sprache ist so gestaltet, dass die in ColCül geschriebenen Programme nicht nur lauffähig sind, sondern auch als visuelle Poesie, sogenannte "Sourcecode-Poetry", angesehen werden können. Somit ist das kryptische Aussehen der Sprache und das Verschleiern von Zahlen durch kleine und große "o" (s.u.) nicht Selbstzweck, sondern soll vielmehr den Quelltext nicht sofort als Computerprogramm erkennen lassen. Die Tatsache, dass Leerzeichen oder Zeilenenden bzw. Zeilenumbrüche in Colcül keine Rolle spielen, erhöht die Gestaltungsmöglichkeiten für den Autoren.


Reservierte Zeichen

Die Sprache ColCül verwendet folgende Zeichen:

()[]{}<>

Diese Zeichen dürfen somit nicht in selbstgewählten Namen für Variablen, Prozeduren/Funktionen, Kommentaren oder Zeichenketten verwendet werden. Kleine und große "o" werden vor Ausführung des Programms in 1 und 10 umgewandelt. Punkt und Bindestrich sind ebenfalls nicht erlaubt, da sie in der Sprache JavaScript, in die die ColCül-Programme umgewandelt werden, eine eigene Bedeutung haben (Objekteigenschaft und Minus).


Eingabe von Zahlen

Zahlen können im Quelltext sowohl in herkömmlicher Form als auch als Folge von kleinen und großen "o" angegeben werden. Dabei steht jedes kleine "o" für den Wert 1 und jedes große "O" für den Wert 10. Die Werte werden dann addiert:

Beispiele: oooo = 4
OOooo = 23
, aber auch:
oOooO = 23
ooo.oooOo = 3,14
-ooooo = -5


Befehle für Ein- und Ausgabe

Variable mit Inhalt belegen: a = 12;
Der Inhalt kann eine Zahl, ein logischer Ausdruck, eine andere Variable oder die Rückgabe einer Funktion sein.
((a(oOo
Ein einzeiliges Eingabefeld erzeugen:
Der Inhalt wird über die abschließende ok-Taste an die Variable a übergeben.
(((a
Ausgabe auf dem Bildschirm ohne Zeilenumbruch: ((((a
Ausgabe auf dem Bildschirm mit Zeilenumbruch: (((((a
Ausgabe auf dem Bildschirm rechtsbündig in einem Bereich mit vorgegebener Breite (in der Einheit "pt" bzw. Punkt): ((((((a(OOO

Einzeilige Eingabefelder, die mit dem Befehl "(((" ezeugt wurden, werden stets am Anfang vor der Ausführung des eigentlichen Programms verarbeitet.

An die drei Ausgabebefehle können die Zeichenfolgen "(o" (bzw. "(1") und "(oo" angehängt werden:

Ausgabe der Zeichenkette "Text", ohne dass sie in Anführungszeichen gesetzt werden muss: ((((Text(o
Formatierte Ausgabe des Unicodezeichens mit der Nummer 40 ("("):
An Stelle der Zahl kann auch eine mit einer Zahl belegte Variable oder eine Berechnung verwendet werden.
((((((OOOO(OOO(oo


Einstellige Rechenfunktionen

negativ(a) = -a {{,a
kehrwert(a) = 1/a {{{,a
Erzeugt eine zufällige ganze Zahl von 1 bis a {{{{,a
sinus(a)
a ist ein Winkel in Grad
{{{{{,a
arkussinus(a)
a ist eine Zahl von -1 bis 1
{{{{{{,a


Zweistellige Rechenfunktionen

plus(a, b) = a + b }},a}b
mal(a, b) = a * b }}},a}b
hoch(a, b) = ab }}}},a}b
div(a, b) = a div b
Erzeugt den ganzzahligen Anteil von a/b
}}}}},a}b
logarithmus(a, b) = logab }}}}}},a}b


Weitere Rechenfunktionen

Weitere Rechenfunktionen, die nicht in der Sprache Colcül enthalten sind, können durch vorhandene Funktionen nachgebildet werden:

Subtraktion a - b:
plus(a, negativ(b))
}},a}{{,b
Division a/b:
mal(a, kehrwert(b))
}}},a}{{{,b
Wurzel a√b:
hoch(b, kehrwert(a))
}}}},b}{{{,a
Modulo a mod b:
plus(a, negativ(mal(b, div(a, b))))
a mod b = a - b * (a div b)
}},a}{{,}}},b}}}}}},a}b
Abrunden ⌊a⌋:
div(a, 1)
}}}}},a}o
Runden: ⌊a + 0,5⌋ }}}}},}},a}0.ooooo}o
Kosinus cos(a):
sinus(plus(90, negativ(a)))
cos(α) = sin(90° - α)
{{{{{,}},OOOOOOOOO}{{,a
Tangens tan(a):
mal(sinus(a), kehrwert(sinus(plus(90, negativ(a)))))
tan(α) = sin(α) / cos(α)
}}},{{{{{,a}{{{,{{{{{,}},OOOOOOOOO}{{,a
Arkuskosinus arccos(a):
plus(90, negativ(arkussinus(a)))
arccos(a) = 90° - arcsin(a)
}},OOOOOOOOO}{{,{{{{{{,a
Arkustangens arctan(a): arkussinus(mal(a, kehrwert(hoch(plus(1, hoch(a, 2)), mal(1, kehrwert(2))))))
arctan(a) = arcsin(a / √(1 + a2)
{{{{{{,}}},a}{{{,}}}},}},o}}}}},a}oo}}}},o}{{{,oo


Logikfunktionen

nicht(a) [[,a
und(a, b) [[[,a[b
gleich(a, b) [[[[,a[b
groesser(a, b) [[[[[,a[b


Weitere Logikfunktionen

a oder b:
nicht(und(nicht(a), nicht(b))
[[,[[[,[[,a[[[,b
a <= b:
nicht(groesser(a, b)
[[,[[[[[,a[b
a < b:
und(nicht(groesser(a, b)), nicht(gleich(a, b)))
[[[,[[,[[[[[,a[b[[[,[[[[,a[b
a >= b:
nicht(und(nicht(groesser(a, b)), nicht(gleich(a, b))))
[[,[[[,[[,[[[[[,a[b[[[,[[[[,a[b


Schleifen

while (Logikausdruck) do
{ .... }
))Logikausdruck .... ,

Eine Zählschleife lässt sich somit folgendermaßen nachbilden:

for (i = a to b step c) do
{ .... }
((i(a
))[[,[[[[[,i[b .... ((i(}},i}c,


Verzweigungen

if (Logikausdruck) then
{ .... }
)))Logikausdruck .... ,

Verzweigungen haben in ColCül keinen "else"-Zweig, sodass ein eventuell benötigter "else"-Zweig durch eine weitere "if"-Verzweigung ersetzt werden muss.


Prozeduren und Funktionen

Eine Prozedur, die etwas ausführt:
procedure name (p1, p2, ...)
{ .... }
))))name)p1)p2... .... ,
Eine Funktion die einen Wert (abgelegt in der lokalen Variablen r) zurück gibt:
function name (p1, p2, ...)
{ var r; .... return r;}
)))))name)p1)p2...)r .... ,
Eine Prozedur aufrufen:
))))))name)p1)p2...

Prozeduren und Funktionen können keine oder auch beliebig viele Parameter enthalten. Bei der Definition von Funktionen muss direkt nach der Parameterliste die Variable benannt werden, die in der Funktion den Wert für die Rückgabe übergeben bekommt. Beim Aufruf einer Funktion wird diese Rückgabevariable nicht angesprochen (s.u.). Bevor eine Funktion zum ersten mal aufgerufen wird, muss sie vorher deklariert worden sein.

Falls in Funktionen zusätzlich zu den Parametern weitere lokale Variablen (z.B. bei Rekursionen) benötigt werden, müssen sie mit in die Parameterliste aufgenommen werden, da in ColCül Variablen nicht ausdrücklich deklariert werden.


Verschiedenes

Die Ausgabe einer Funktion abrufen:
]]name]p1]p2...
Quelltext kommentieren: ]]]]Kommentar
Eine Dualzahl im Quelltext verwenden:
Dabei kann die Dualzahl sowohl in herkömmlicher Weise mit Einsen und Nullen geschrieben werden als auch mit großen und kleinen "o", Wobei das große "O" für 1 und das kleine "o" für 0 steht.
]]]]]Dualzahl


Deque-Verwaltung

Eine Deque ist ein Speicher, vergleichbar dem Stack bzw. Stapelspeicher, die jedoch von beiden Seiten belegt und abgefragt werden kann.

Einen Wert a rechts auf die Deque ablegen (PUSH):
<<a
Einen Wert rechts von der Deque nehmen und in der Variablen a ablegen (POP): <<<a
Einen Wert a links auf die Deque ablegen (PUT):
<<<<a
Einen Wert links von der Deque nehmen und in der Variablen a ablegen (GET): <<<<<a
Eine Schleife über die gesamte Deque von links nach rechts, wobei der jeweilige Wert zu Beginn jedes Schleifendurchgangs in der lokalen Variablen s abgelegt ist (und nicht von der Deque genommen wird): <<<<<<s< .... ,

Die Schleife über die Deque bricht ab, wenn das aktuelle Ende der Deque erreicht wird, so dass das Programm <<o <<<<<<s< <<o, eine Endlosschleife erzeugt.


Gestaltung

Hintergrundfarbe festlegen, wobei zahl ein Wert von 0 bis 4095 ist (s.u.):
>>zahl
Schriftfarbe festlegen, wobei zahl wiederum ein Wert von 0 bis 4095 ist (s.u.): >>>zahl
Schriftgröße festlegen, wobei zahl die Einheit "pt" bzw. Punkt hat: >>>>zahl
Schriftart festlegen:
zahl = 1: serif (z.B. Times New Roman oder Times)
zahl = 2: sans-serif (z.B. Helvetica oder Arial)
zahl = 3: monospace (z.B. Courier New oder Courier)
Falls die zahl 11, 12 oder 13 ist, wird die entsprechende Schriftart fett dargestellt.
>>>>>zahl
Zeilenhöhe festlegen, wobei zahl die Einheit "pt" bzw. Punkt hat: >>>>>>zahl

Farben für Hintergrund und Schrift werden am einfachsten als 12-stellige Dualzahl eingegeben, wobei die ersten vier Ziffern (von 0000 bis 1111) für den Rot-Anteil, die nächsten vier Ziffern für den Grün-Anteil und die letzten vier Ziffern für den Blau-Anteil stehen.


Zeichenketten

Die Sprache Colcül ist eigentlich nicht darauf angelegt, mit Zeichenketten (Strings) zu arbeiten. Dennoch ist es mit Einschränkungen möglich, Zeichenketten ein- und auszugeben. Dabei ist jedoch darauf zu achten, dass die Zeichenketten keine runden und eckigen Klammern enthalten und dass Leerzeichen und kleine und große "o" ersetzt werden, und zwar durch "_", "°" und "^". Diese drei Zeichen können also mit Colcül ebenfalls nicht ausgegeben werden. Das "Hallo Welt"-Programm sähe also in Colcül folgendermaßen aus:

(((('Hall°_Welt!'


Beispielprogramme

Das folgende (kommentierte) Programm gibt die ersten 11 Zeilen des Pascal´schen Dreiecks aus:

]]]] Schriftgröße auf 10 Punkt setzen:

>>>>O

]]]] Eine 1 formatiert ausgeben, 180 = 15 * 12:

((((((o(}}},Oooooo}Ooo

]]]] Zeilenumbruch:

(((((''

]]]] Zwei Einsen rechts auf die Deque legen:

<<o<<o

]]]] i auf 1 setzen:

((i(o

]]]] Eine Zählschleife von 1 bis 10 öffnen:

))[[,[[[[[,i[O

]]]] Am Zeilenanfang einrücken, 15 * 10 - i * 15:

((((((''(}},}}},Oooooo}O}{{,}}},i}Oooooo

]]]] Eine Schleife über die Deque:

<<<<<<a<((((((a(OOO,

(((((''<<o

]]]] Den Wert links von der Deque nehmen und auf a legen:

<<<<<a

((j(o
))[[,[[[[[,j[i
<<<<<b

]]]] Die Summe von a und b rechts auf die Deque legen:

<<}},a}b

((a(b

]]]] j um 1 erhöhen und die innere Schleife beenden:

((j(}},j}o,

<<1
((i(}},i}o,

Kopieren Sie das Programm zum Testen in das linke Programmfenster.

Wenn Sie in Ihrem Browser mit rechts auf das Ausgabefenster klicken, können Sie sich den zugehörigen JavaScript-Quelltext anschauen (der möglicherweise etwas einfacher zu lesen ist).

Auch das zweite Programm berechnet Binomialkoeffizienten: Nach Eingabe von zwei (natürlichen) Zahlen wird die rekursive Funktion bb aufgerufen, die sich wiederum selbst zwei mal aufruft, bis die Abbruchbedingungen erreicht wurden (bbbb ist gleich bbb oder 0 bzw. bbbb ist kleiner 0 bzw. größer bbb). Beachten Sie, dass Rekursionen bei Eingabe größerer Zahlen sehr schnell zum Programmabsturz führen.

(((aa(((aaa
)))))bb)bbb)bbbb)bbbbb
)))[[,[[[,[[,[[[[,bbbb[bbb[[[,[[[[,0[bbbb
((bbbbb(1,
)))[[,[[[,[[,[[[[[,bbbb[bbb[[[,[[[[[,0[bbbb
((bbbbb(0,
)))[[[,[[[[[,bbb[bbbb[[[[[[,bbbb[0
((bbbbb(
}},]]bb]}},bbb}{{,o]}},bbbb}{{,o
}]]bb]}},bbb}{{,o]bbbb,,
((((]]bb]aa]aaa

Das nächste Programm "zeichnet" eine Mandelbrotmenge. Dazu werden vier Schleifen verschachtelt. Die beiden äußeren Schleifen sind für die Höhe (-1 < mm <= 1) und die Breite (-0,5 < mmm <= 1,75 = 21 / 12) zuständig. In der 3. Schleife mit der Variablen "mmmm", die jeweils 2 mal durchlaufen wird, werden zwei übereinander liegende Punkte daraufhin untersucht, ob sie zur Mandelbrotmenge gehören. Diese Schleife ist notwendig, da die Punkte der Menge mit "halben" Unicode-Zeichen (s.u.) gezeichnet werden. Die vierte Schleife untersucht den jeweiligen Punkt auf Zugehörigkeit zur Mandelbrotmenge und wird maximal 30 mal durchlaufen.

Abschließend werden je 2 übereinanderliegende Punkte mit den vier Unicode-Zeichen für ein erzwungenes Leerzeichen (erzeugt durch '_'), für ein halbes Rechteck unten, für ein halbes Rechteck oben und für ein volles Rechteck gezeichnet.

((mm(o
>>>>>ooo
>>>>oooo
))[[[[[,mm[-o((mmm(-0.ooooo
))[[,[[[[[,mmm[}}},OOo}{{{,Ooo
((mmmm(o))[[,[[[[[,mmmm[oo
((aa(0((aaa(0((nn(0((nnn(0
))[[[,[[,[[[[[,nn[oo[[[,[[[[[,nnn[OOO
((aaaa(}},}},}}}},aa}oo}{{,}}}},aaa}oo}{{,mmm
((aaa(}},}}},oo}}}},aa}aaa}{{,mm((aa(aaaa
((nn(}}}},}},}}}},aa}oo}}}}},aaa}oo}{{{,oo
((nnn(}},nnn}o,)))[[[[,mmmm[o((nnnn(nn,
((mm(}},mm}}}},}}}},-o}mmmm}{{{,}}},Ooooo}oo
((mmmm(}},mmmm}o,
)))[[[,[[[[[,nnnn[oo[[[[[[,nn[oo(((('_',
)))[[[,[[[[[,nnnn[oo[[[,[[[[[,nn[oo (((('▄',
)))[[[,[[,[[[[[,nnnn[oo[[[[[[,nn[oo (((('▀',
)))[[[,[[,[[[[[,nnnn[oo[[[,[[[[[,nn[oo (((('█',
((mmm(}},mmm}}}},o}{{{,}}},Ooooo}oo,
((mm(}},mm}{{,}}},o}{{{,Ooooo
((((('',

Während das letzte Beispiel eher die Möglichkeiten (und Grenzen) von ColCül aufzeigen sollte, betont das nächste Beispiel eher den gestalterischen bzw. visuellen Aspekt dieser Sprache. Dabei wird die Kreiszahl Pi mit der von Ramanujan stammenden Annäherung √√(2143 / 22) auf 8 Stellen nach dem Komma genau berechnet.

((
(((
}}}},
}}}},
}}},}},}}}},    oo } Oo
}}},}}}},       O } oo
}{{,            ooooo
}{{{,           OOoo
}{{{,           oo
}{{{,           oo



Kontakt

Senden Sie gefundene Bugs, aber auch Anregungen und Kritik an:
Manfred Arens (arens@muart.de).