(Vorab Entschuldigung an alle, die ich schon auf meinem G+-Account damit belästigt habe, aber ich habe zu spät an "hoste selbst, schmeiß nicht alles in die sozialen Netze" gedacht. Außerdem ist das hier jetzt übersetzt und inhaltlich etwas erweitert.)
Ich bin im Netz über dieses schöne Video gestolpert:
APL demonstration 1975
Gefällt mir außerordentlich gut:
- APL ist vom Konzept her ungewöhnlich und interessant (und sieht nochmal kryptischer aus als Perl)
- Endlich sehe ich mal ein echtes Hardware-Terminal in Aktion (für sowas wurde ed(1) erfunden). Beeindruckend auch die Denkzeiten nach jeder Eingabe. Fühlt sich an wie mein SSH, wenn die Leitung dicht ist.
- Ein Screencast (Typecast?) aus den 70ern. WTF. Das war, bevor ich geboren wurde. Ist auch fürchterlich praktisch, einfach das Papier zu verschieben und zusätzlich mit nem Bleistift drauf rumzumalen. Macht das mal mit euren xterm :-) (Aus meinen COBOL-Zeiten bin ich ja sowieso noch etwas der Papierliebhaber beim Programmieren. Ausdruck auf Endlospapier, Post-Its als Seitenmarkierer und dazu Textmarker. Auf zum Debuggen.)
Als ich mir das angeguckt habe und das APL-Prinzip so halb verstanden hatte, wollte ich gleich erstmal eine Fakultäts-Funktion bauen. Hatte mir das ungefähr so gedacht:
∇R←FACT N
R←×/⍳N∇
(× = Multiplikation, / = Anwenden auf alle Listenelemente, ⍳N = erzeuge eine Liste von 1 bis N)
Irgendwie habe ich unter Ubuntu nur das Paket
aplus-fsf
gefunden (kein GNU APL?). Zum Eingeben der ganzen Spezialzeichen wird dort auf
aplus-fsf-el
verwiesen – das ist aber leider nur ein leeres Dummy-Paket, weil XEmacs vor einiger Zeit aus Debian/Ubuntu rausgeflogen ist. Mift.
Irgendwelche Workarounds wie "die Spezialzeichen lassen sich auch als ASCII umschreiben" (COBOL kann sowas) habe ich in der Doku nicht finden können…
Aber nicht verzagen, es gibt
TryAPL, da kann man das online ausprobieren.
Leider ist dort die Syntax irgendwie anders als in dem Video, ich habe es aber schließlich doch geschafft, meine Fakultät nicht-rekursiv zu basteln (rekursiv gibt es ein Beispiel auf dem Reiter "Primer" im Tooltipp des ∇-Operators).
fact←{×/⍳⍵}
fact 2
0
fact 4
0
Moment mal, da stimmt was nicht. Der wird doch nicht…
⍳3
0 1 2
Och nee, der indiziert 0-basiert. Also muss man das erste Element wegwerfen und hinten noch eins dranhängen:
fact←{×/(1↓(⍳(⍵+1)))}
fact 2
2
fact 4
24
fact 6
720
Da, geht. Sieht aber eklig aus.
Aber moment, der Typ im Video hatte doch Systemvariablen erwähnt. Also mal auf 1-basierten Index umstellen:
⎕IO←1
⍳3
1 2 3
Bingo! Jetzt geht das dann auch in hübsch:
fact←{×/⍳⍵}
fact 2
2
fact 4
24
fact 6
720
Und wer noch etwas den Kopf rauchen lassen will, guckt sich einen
Sudoku-Löser und das
Game of Life – diesmal nur als uncoole Screencasts auf einer Terminalemulation.