Wie können Lisp (Clojure) und Tcl im Hinblick auf Abstraktion und Metaprogrammierungsfähigkeiten verglichen werden?

8

Beide scheinen gut für die Erstellung erweiterbarer APIs und Codegenerierung zu sein.

Was sind die Hauptunterschiede zwischen ihnen?

Was sehen Sie als ihre Stärken, Schwächen, ...

    
StackedCrooked 27.04.2011, 18:58
quelle

2 Antworten

13

Disclaimer: Ich bin vertrauter mit Clojure als Tcl und entschuldige mich bei Tclers, wenn ich etwas falsch darstelle. Aber hier sind einige Punkte, die mir allgemein bekannt sind:

  • Beide sind extrem flexibel - Sie können Meta-Programmierung verwenden, um so ziemlich jeden beliebigen Code zur Laufzeit zu generieren und auszuführen.
  • Clojure ist eine JVM-Sprache , während Tcl relativ eigenständig ist.
    • Die Vorteile der JVM bestehen darin, interoperablen Code für Bibliotheken in anderen JVM-Sprachen wie Java und Scala zu generieren und als DSL zu fungieren. Außerdem erhalten Sie Zugriff auf die große Auswahl an Java-Bibliotheken.
    • Nachteil der JVM ist eine relativ hohe Anlaufzeit. Daher bevorzugen Sie wahrscheinlich Clojure für länger laufende Serveranwendungen als Befehlszeilentools, die schnell ausgeführt werden müssen.
  • Clojure-Metaprogrammierung wird in nativen Code kompiliert (über JIT in der JVM). Wird von Ihrer Anwendung abhängen, aber ich erwarte, dass dies in den meisten Fällen schneller als Tcl ablaufen wird
  • Beide Sprachen sind dynamisch (eine gute Sache für Metaprogrammierung im Durchschnitt!) und unterstützen funktionale Programmierung
  • Clojure enthält einige interessante Abstraktionen, die für die Metaprogrammierung sehr nützlich sind - insbesondere die beträchtliche sprachliche Unterstützung für Sequenzen
  • Ich persönlich finde die Ähnlichkeit der Lisp-Syntax für die Metaprogrammierung als großen Vorteil - es ist viel einfacher, Code zu generieren, wenn es nur ein syntaktisches Konstrukt (den s-Ausdruck) gibt. .

Im Durchschnitt sind beide Sprachen ideal für die Metaprogrammierung, aber wenn ich zwischen den beiden wählen würde:

  • Ich würde Clojure wählen, wenn ich eine serverseitige Anwendung erstellen würde oder wenn ich einen besonderen Bedarf an JVM-Interoperabilität hätte
  • Ich würde Tcl wählen, wenn ich eine DSL für die Verwaltung von Skripten / Tools in der Befehlszeile
  • wollte
mikera 27.04.2011, 20:01
quelle
7

Ich denke, Mikeras Antwort ist ausgezeichnet.

Ich würde nur hinzufügen, dass in clojure metaprogramming tendiert, auf Makros zu konzentrieren, eine große einheitliche Metaprogrammierungslösung ohne Peer, hat tcl mehrere kleine scharfe Werkzeuge für die Metaprogrammierung, darunter den "unbekannten" Befehl, der dazu verwendet werden kann alle möglichen raffinierten Tricks. Interessant ist auch, dass obwohl clojure nur eine kleine Anzahl von Schlüsselwörtern oder "speziellen Formen" hat, tcl tatsächlich keine hat, was es zu seinem eigenen dsl macht, und das Verhalten jedes Befehls zu ändern (oder zu erweitern).

Eine Sache, der ich aus Mikers Antwort nicht zustimmen kann, ist der Teil über die Syntax von clojure, der der Metaprogrammierung zugänglicher ist. Eine der unangenehmen Überraschungen für mich, wenn ich zu clojure komme, ist eigentlich, wie viel syntaktische Variation es in clojure gibt, mit den verschiedenen Verwendungen von () [] {} "^ {} # ': Schlüssel ... und weiter und weiter. Ich grabe völlig die Rechtfertigung dieser Art von syntaktischem Zucker, aber ich finde tatsächlich tcl-Syntax leichter zu behandeln für "ham-handed" Metaprogrammierung und Code-Generierung. Und tcls "alles ist eine Schnur" Natur fügt der Einfachheit hinzu.

Was multi-processing Fähigkeiten, unveränderliche Datenstrukturen, rein funktionale Natur und viele andere Fälle von clojure unterscheidet, gibt es tatsächlich nichts Vergleichbares in tcl.

Ich konnte der Schlussfolgerung von mikera nicht mehr zustimmen.

    
user271608 27.04.2011 23:14
quelle

Tags und Links