Wednesday, July 27, 2005

Parser-Generator

Am Samstag habe ich mir überlegt habe wie ein Fragebogen aufgebaut sein soll und mir dazu eine CF-Grammatik aufgeschrieben, dabei kam mir die Idee einen Parser dafür zu schreiben. Ich habe zuerst die Grammatik in Lisp notiert, wollte dann anfangen die Funktionen zu schreiben, bis mir auffiel das ich ja auch die Grammatik selber parsen und einen Parser-Generator schreiben kann. Jetzt ist das Ding fertig und scheint zu funktionieren, ich habe es noch nicht mit der Fragebogen-Grammatik getestet.

Die Fragebogen-Grammatik:

   ((fragebogen  (+ gruppe))
    (gruppe      ueberschrift (+ element))
    (element     (+ (/ text area checkboxen radios)) frage)
    (checkboxen  (+ checkbox antwort))
    (radios      (+ radio antwort))
    (ueberschrift "<h2>" (+ zeichen) "</h2>")
    (text "<input type=\"text\" name=\"" (+ zeichen) "\">")
    (area "<textarea name=\"" (+ zeichen) "\"></textarea>")
    (frage (+ zeichen) "?")
    (radio "<input type=\"radio\" name=\"" (+ zeichen) "\" value=\"" (+ zeichen) "\">")
    (checkbox "<input type=\"checkbox\" name=\"" (+ zeichen) "\" value=\"" (+ zeichen) "\">")
    (antwort (+ zeichen))
    (zeichen (/ "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
                "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
                "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m"
                "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
                "Ä" "Ö" "Ü"
                "ä" "ö" "ü"
                "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
                "ß" "-"
                "\n" "\t")))

Das Herzstück des Parser-Generators:

(defmacro parse-production (production)
  (let ((results
         (loop for thing in production
            collect
            (if (listp thing)
                (cond ((eql '/ (car thing))
                       `(parse/ ,(cdr thing)))
                      ((eql '+ (car thing))
                       `(parse+ ,(cdr thing)))
                      ((eql '* (car thing))
                       `(parse* ,(cdr thing)))
                      (t
                       `(parse-production ,thing)))
                (cond ((stringp thing)
                       `(literal stream ,thing))
                      ((atom thing)
                       `(,thing stream)))))))
    (if (= (list-length production) 1)
        (car results)
        `(progn ,@results))))

Code: grammatik.lisp

php-mode.el

Jetzt mit rudimentärer Unterstützung zum anzeigen der Signatur. klingt blöd. C-. um die Parameter/Arglist eine Funktion zu zeigen.

php-mode.el

Tuesday, July 26, 2005

Social Problems of a Lisper

IncreduLISP versucht LISP (Common Lisp) zu verbessern, und fängt an mit einer neuen Syntax. Klar Klammern sind mist, nicht ohne Grund steht LISP für Lots of Irritating Superflous Parentheses und wenn wir schon mal dabei sind, die meisten Funktionen sind viel zu lang, also def statt defun (und was ist mit defclass, defstruct? Egal unwichtige Details), dazu noch ein ~ mit einem magischen, intuitivem N das die nächsten N Chunks einliest.

Aber weil die neue Syntax für Listen etwas schwer zu lesen sein kann (a:b,c ist (a b c) aber a:b:c,d ist nicht (a (b c)) sondern (a (b) c). Korrektur: Zu ((a)) gibt es kein mögliche Übersetzung ((a)) == a:: was wahrscheinlich angenehmer für Leute ist die von Rechts nach Links lesen) Sind Klammern trotzdem noch erlaubt. Das ganze ist nur eine alternative Syntax.

Aber das ganze ist auch egal, denn er weiß selber nicht was er will:

A major goal of this language is to have an incredibly terse syntax. It should be well-nigh unreadable: that is the point.

I would not advise using it that much in real programming.

Meiner meinung nach ist dieser sehr “smarte” Mensch einfach nur ein Troll, bleibt nur noch zu sagen:

Don't feed the troll

Saturday, July 23, 2005

Pornographisch Programmieren

J. McCarthy Zitate aus „LISP - Anwendungsgebiete, Grundbegriffe, Geschichte“ von H. Stoyan

zu NIL und NULL:

Außer der Ermutigung pornographischer Programmierung hat die Zuordnung einer speziellen Bedeutung zur Adresse 0 in allen darauffolgenden Implementationen Schwierigkeiten gemacht

Zu S. Russels Entscheidung EVAL zu implementieren:

Steve Russel sagte, ‚Gib mal her, warum sollte ich nicht dieses EVAL programmieren … ? ’, doch ich antwortete ihm, ‚Ho ho, du verwechselst Theorie und Praxis, denn dieses EVAL ist zum Lesen gedacht und nicht fürs Rechnen …’

Ich verstehe das mit pornographischer Programmierung zwar nicht, aber dennoch sind beide Zitate Amüsant. Zu EVAL sei noch gesagt das es damals nur eine Definition auf Papier und keinen Compiler gab (u.a. weil Compilerbau noch kaum erforscht war)

Friday, July 22, 2005

Bücherregal

Bücher die ich momentan lese:

Structure and Interpretation of Computer Programs; Abelson, SussmanLanguage; BloomfieldCompilerbau Teil 1;Aho, Sethi, Ullmann

Useless Trivia: Bücherrücken werden in englischsprachigen Ländern immer von oben nach Unten beschriftet, in Deutschland so wie es einem gefällt.

Friday, July 15, 2005

Schöne Ferien

Die letzten Tage waren etwas stressig, aber jetzt ist's schön. Mein dritter Antrag ist genehmigt worden, ganz ohne Sprachkurse versteht sich. Damit konnte ich diese Woche auch die Prüfungen in Finnougristik machen, die ich auch erfreulicherweise (trotz Civ 3 spielen) bestanden habe. Nach einer M2/3 Prüfung, die ich für September plane, ist dann auch das Thema Vordiplom abgehakt.