Nach einigen Monaten des Lernens und Spielens mit Lisp, sowohl CL als auch ein bisschen Clojure, sehe ich immer noch keinen zwingenden Grund, etwas statt C # darin zu schreiben.
Ich hätte gerne überzeugende Gründe oder möchte, dass jemand darauf hinweist, dass mir etwas wirklich Großes fehlt .
Die Stärken von Lisp (nach meiner Recherche):
- Kompakte, ausdrucksstarke Notation - Mehr als C #, ja ... aber ich scheine in der Lage zu sein, diese Ideen auch in C # auszudrücken.
- Implizite Unterstützung für funktionale Programmierung - C # mit LINQ-Erweiterungsmethoden:
- mapcar = .Select (Lambda)
- mapcan = .Select (Lambda) .Aggregate ((a, b) => a.Union (b))
- car / first = .First ()
- cdr / rest = .Skip (1) .... etc.
- Unterstützung für Lambda-Funktionen und Funktionen höherer Ordnung - C # hat dies und die Syntax ist wohl einfacher:
- (Lambda (x) (Körper)) gegen x => (Körper)
- "# (" mit "%", "% 1", "% 2" ist in Clojure nett
- Methodenversand von den Objekten getrennt - C # verfügt über Erweiterungsmethoden
- Multimethod Dispatch - C # hat dies nicht von Haus aus, aber ich könnte es in ein paar Stunden als Funktionsaufruf implementieren
- Code ist Daten (und Makros) - Vielleicht habe ich keine Makros "bekommen", aber ich habe kein einziges Beispiel gesehen, in dem die Idee eines Makros nicht als Funktion implementiert werden konnte. es ändert nichts an der "Sprache", aber ich bin mir nicht sicher, ob das eine Stärke ist
- DSLs - Kann es nur durch Funktionszusammenstellung tun ... aber es funktioniert
- Nicht typisierte "explorative" Programmierung - für Strukturen / Klassen funktionieren C # - Eigenschaf - ten und "Objekt" recht gut, und Sie können im Laufe der Zeit leicht zu einer stärkeren Typisierung eskalieren
- Läuft auf Nicht-Windows-Hardware. Außerhalb des Studiums kannte ich nur eine Person, die Windows nicht zu Hause ausführt, oder zumindest eine VM von Windows unter * nix / Mac. (Andererseits ist das vielleicht wichtiger als ich dachte und ich wurde gerade einer Gehirnwäsche unterzogen ...)
- Die REPL für Bottom-Up-Design - Ok, ich gebe zu, das ist wirklich sehr schön und ich vermisse es in C #.
Was mir in Lisp fehlt (aufgrund einer Mischung aus C #, .NET, Visual Studio und Resharper):
- Namespaces. Selbst mit statischen Methoden binde ich sie gerne an eine "Klasse", um ihren Kontext zu kategorisieren (Clojure scheint dies zu haben, CL scheint dies nicht zu tun).
- Hervorragende Unterstützung für Kompilierung und Design
- Das Typensystem ermöglicht es mir, die "Korrektheit" der Datenstrukturen zu bestimmen, die ich herumgebe
- Alles, was falsch geschrieben wurde, ist in Echtzeit unterstrichen. Ich muss nicht bis zur Laufzeit warten, um zu wissen
- Code-Verbesserungen (z. B. die Verwendung eines FP-Ansatzes anstelle eines Imperativ-Ansatzes) werden automatisch empfohlen
- GUI-Entwicklungstools: WinForms und WPF (Ich weiß, dass Clojure Zugriff auf die Java-GUI-Bibliotheken hat, aber sie sind mir völlig fremd.)
- GUI-Debugging-Tools: Haltepunkte, Step-In, Step-Over, Werteinspektoren (Text, XML, benutzerdefiniert), Überwachungen, Debug-by-Thread, bedingte Haltepunkte, Call-Stack-Fenster mit der Möglichkeit, auf jeder Ebene zum Code zu springen im Stapel
- (Um fair zu sein, mein Aufenthalt bei Emacs + Slime schien einiges davon zu liefern, aber ich bin ein Teil des VS GUI-gesteuerten Ansatzes.)
Ich mag den Hype um Lisp sehr und habe ihm eine Chance gegeben.
Aber kann ich in Lisp etwas tun, was ich in C # nicht so gut kann? Es mag in C # etwas ausführlicher sein, aber ich habe auch Autocomplete.
Was vermisse ich? Warum sollte ich Clojure / CL verwenden?
AND
oder OR
als Funktion. Es könnte getan werden (vorausgesetzt LAMBDA
, das ist auch ein Makro), aber ich sehe keinen offensichtlichen Weg, um es zu tun, der nicht völlig zum Kotzen wäre.