C++11 vs. Common Lisp



  • Jetzt, da C++11 raus ist, kann man ja fragen: Durch die Lambdafunktionen hat man nun auch einige funktionale Konzepte in C++. Was für Features hat Common Lisp noch, die nicht so einfach in C++11 zu übersetzen sind?



  • Ich glaube so ein Vergleich ist ziemlich sinnlos. Common Lisp hat ein ganze anderes Design und eine ganze andere Philosophie als C++. In C++ ist der Quelltext schon mal keine Liste die man einfach manipulieren kann.

    Ansonsten: C++11 hat keine echten Closures. Außerdem fehlen Restarts im Exception-System.



  • rüdiger schrieb:

    C++11 hat keine echten Closures.

    Was ist denn daran unecht?



  • Beschaeftige dich mit Lisp und vergleiche selbst. Wahlweise kannst du auch die Forumssuche benutzen oder aber google. Bei http://en.wikipedia.org/wiki/C%2B%2B0x wird es unter Core language usability enhancements aufgefuehrt. Man koennte auch syntaktischer Zucker sagen.



  • So nebenbei: Ich bin nicht der, der die originale Frage gestellt hat. Ich kenne mich mit C++0x auch gut aus.

    @knivil: Falls Du mich meintest, dann verstehe ich nicht, wie mir das meine Frage beantworten soll. Was versteht ihr denn unter "echten" Closures? Und warum sollen die bei C++0x nicht "echt" sein? Bitte mal ein paar Details hier....



  • C++ hat keine Closures. Punkt! Sondern nur anonyme Funktionen, wahrscheinlich hier mit dem Attribut "unecht" gemeint.



  • Common Lisp gewinnt eindeutig.



  • Wenn man Closures hat, können lokale Variablen nicht mehr generell auf dem Stack angelegt werden. Beispiel in Common Lisp:

    (defun make-adder (n)
      (lambda (m) (+ n m))) ; <- anonyme Funktion
    
    (let ((increase (make-adder 1)))
      (funcall increase 42)) ; => 43
    

    Zu dem Zeitpunkt, an dem die anonyme Funktion aufgerufen und damit auf die Variable n zugegriffen wird, wurde make-adder schon längst verlassen und ihr Stackframe abgebaut, n kann also nicht dort liegen. In dem einfachen Beispiel könnte man n einfach in das Funktionsobjekt kopieren, entsprechend in C++11 einem capture by value, aber man kann sich vorstellen, dass das im Allgemeinen nicht ausreicht. In funktionalen Programmiersprachen müssen die Laufzeitdatenstrukturen also grundsätzlich anders organisiert werden, beispielsweise kann man Activation Records auf dem Heap statt auf dem Stack ablegen. Den Stress spart man sich in C++ verständlicherweise, es soll ja auch C++ bleiben und nicht zu einer funktionalen Programmiersprache mutieren.
    Ich denke, das ist es, was mit "echten" und "unechten" Closures gemeint ist. Man hat nicht das volle Programm zur Verfügung, sondern kann Closures nur unter gewissen einschränkenden Voraussetzungen nachbilden.


Anmelden zum Antworten