Lisp

Die Programmiersprache Lisp habe ich bei der Beschäftigung mit Maxima kennengelernt. Ich hatte bereits Erfahrungen in den verschiedensten Programmiersprachen wie Fortran, Pascal, C, C++. In diesen Sprachen habe ich auch größere Projekte im Zusammenhang mit physikalischen Aufgabenstellungen während des Studiums und meiner Promotion programmiert.

Ich war zunächst überrascht, dass sich mir die Programmiersprache Lisp, aufbauend auf meinen bisherigen Programmiererfahrungen, nicht erschließen wollte. Ich hatte dann das Glück, auf die sehr gute Einführung Common Lisp: A Gentle Introduction to Symbolic Computation" von David S. Touretzky zu stoßen. Dieses Buch ist ein Kurs für Anfänger, die das Programmieren erst lernen wollen. Das Buch zeigte mir, dass man zunächst vieles was man aus anderen Programmiersprachen kennt, abwerfen sollte, um einen Zugang zu den besonderen Konzepten von Lisp zu finden.

Mit Lisp habe ich das Programmieren neu entdeckt. Lisp hat die Konzepte und Techniken, die ich bisher in anderen Programmiersprachen vermisste. Es ist faszinierend wie elegant und einfach die Weiterentwicklung einer Software wie Maxima möglich ist, die mehr als eine 40jährige Geschichte hat und aus etwa 530.000 Zeilen Lisp Code besteht.

Meine Entdeckung der Möglichkeiten von Lisp ist noch nicht abgeschlossen. Das Buch On Lisp von Paul Graham ist eine ausgezeichnete Weiterführung, um anspruchsvolle Möglichkeiten und Techniken von Lisp kennenzulernen. Eine vollständige Lisp Dokumentation findet man z. B. hier Common Lisp HyperSpec.

Beispiel einer Lisp Funktion für die Addition von zwei Zahlen im Computeralgebrasystem Maxima:

(defun addk (x y)
  (cond ((eql x 0) y)
        ((eql y 0) x)
        ((and (numberp x) (numberp y))
         (+ x y))
        ((or (bigfloatp x) (bigfloatp y))
         ($bfloat (list '(mplus) x y)))
        (t
         (prog (g a b)
           (cond ((numberp x)
                  (cond ((floatp x)
                         (return (+ x (rat2float y))))
                        (t
                         (setq x (list '(rat) x 1)))))
                 ((numberp y)
                  (cond ((floatp y)
                         (return (+ y (rat2float x))))
                        (t
                         (setq y (list '(rat) y 1))))))
           (setq g (gcd (caddr x) (caddr y)))
           (setq a (truncate (caddr x) g)
                 b (truncate (caddr y) g))
           (return (timeskl (list '(rat) 1 g)
                            (list '(rat)
                                  (+ (* (cadr x) b)
                                     (* (cadr y) a))
                                  (* a b))))))))