Scheme entstand interessanterweise, weil Steele und Sussman verstehen wollten, wie Objektorientierung (genauer Actor-basierte Programmierung) funktioniert (
http://labs.oracle.com/projects/plrg/JA ... public.pdf, Folie 29).
Es es also einfach um die interlektuelle Erbauung geht, schlägt fast nichts Scheme. Clojure ist da auch zu unaufgeräumt, IMHO. Nett ist IMHO noch Forth (oder Factor als moderner funktionaler Nachfolger), weil es eine wirklich andere Sprache ist. C++ ist einfach nur umständlich, aber bringt im vergleich zu Python kaum weiteren Erkenntnisse. Doch zu verstehen, dass Kontrollstrukturen wie bedingte Anweisungen und Schleifen auch nur Funktionsaufrufe sind, das hat damals bei mir Klick gemacht und so einem anderen (ich bilde mir ja gerne ein, höherem) Verständnis von Programmiersprachen geführt.
Als Teaser: Angenommen, (x p q) beschreibt den Aufruf der Funktion x mit den Argumenten p und q und (λ (x) ...) beschreibt eine anonyme Funktion mit dem formalen Parameter x, der im durch ... abgekürzten Rumpf der Funktion benutzt werden kann, wie funktioniert dann die übliche if-Bedingung (if cond then else)? Ich fodere mal, dass das einfach nur einen andere Syntax für (cond (λ () then) (λ () else) ist. cond soll für einen Ausdruck stehen, der zu einem Wert t oder f wird, was Funktionen sein müssen, da ich ja definiert habe, dass da hinter der Klammer immer eine Funktion steht. Ich muss then und else zu anonymen Funktionen machen, weil if in der Regel immer so funktioniert, dass nur einer der beiden Zweige ausgewertet wird, als kein normaler Funktionsaufruf ist, bei dem (außer in Sprachen wie Haskell) zum Aufruf zuvor immer alle Argumente berechnet werden. Also t == (λ (t e) (t)) und f == (λ (t e) (e)). Eine spezielle Syntax für "if" ist also in einer Sprache mit anonymen Funktionen (und Makros) entbehrlich...
Stefan