Après quelques mois d'apprentissage de Lisp, de CL et d'un peu de Clojure, je ne vois toujours pas de raison impérieuse d'écrire quoi que ce soit à la place de C #.
J'aimerais vraiment avoir des raisons impérieuses ou que quelqu'un indique qu'il me manque quelque chose de vraiment important .
Les points forts de Lisp (d'après mes recherches):
- Notation compacte et expressive - Plus que C #, oui ... mais il semble que je puisse aussi exprimer ces idées en C #.
- Prise en charge implicite de la programmation fonctionnelle - C # avec méthodes d'extension LINQ:
- mapcar = .Select (lambda)
- mapcan = .Sélectionner (lambda) .Agréger ((a, b) => a.Union (b))
- voiture / premier = .First ()
- cdr / rest = .Skip (1) .... etc.
- Support des fonctions lambda et d'ordre supérieur - C # a ceci, et la syntaxe est sans doute plus simple:
- "(lambda (x) (corps))" par rapport à "x => (corps)"
- "# (" avec "%", "% 1", "% 2" est sympa dans Clojure
- Envoi de méthode séparé des objets - C # a cela par le biais de méthodes d'extension
- Multimethod dispatch - C # ne l’a pas nativement, mais je pourrais le mettre en oeuvre sous forme d’appel de fonction dans quelques heures
- Le code, c'est des données (et des macros) - Peut-être que je n'ai pas "obtenu" de macros, mais je n'ai vu aucun exemple où l'idée d'une macro ne puisse pas être mise en œuvre en tant que fonction; ça ne change pas le "langage", mais je ne suis pas sûr que ce soit une force
- DSLs - Ne peut le faire que par la composition de fonctions ... mais cela fonctionne
- Programmation "exploratoire" non typée - pour les structures / classes, les propriétés automatiques et "objet" de C # fonctionnent assez bien et vous pouvez facilement passer à une frappe plus puissante au fur et à mesure
- Fonctionne sur du matériel autre que Windows - Ouais, alors? En dehors du collège, je ne connais qu'une seule personne qui ne gère pas Windows à la maison, ou du moins une machine virtuelle de Windows sur * nix / Mac. (Là encore, c'est peut-être plus important que je ne le pensais et je viens de subir un lavage de cerveau ...)
- Le REPL pour la conception de bas en haut - Ok, j'avoue que c'est vraiment très sympa, et que ça me manque en C #.
Choses qui me manquent dans Lisp (en raison d'un mélange de C #, .NET, Visual Studio, Resharper):
- Espaces de noms. Même avec des méthodes statiques, j'aime les lier à une "classe" pour classer leur contexte (Clojure semble avoir cela, CL ne semble pas.)
- Excellent support de compilation et de conception
- le système de types me permet de déterminer "l'exactitude" des infrastructures de données que je transmets
- tout ce qui est mal orthographié est souligné en temps réel; Je n'ai pas besoin d'attendre le runtime pour savoir
- les améliorations de code (telles que l’utilisation d’une approche de PF au lieu d’une approche impérative) sont automatiquement suggérées
- Outils de développement d'interface graphique: WinForms et WPF (je sais que Clojure a accès aux bibliothèques d'interface graphique Java, mais elles me sont totalement étrangères.)
- Outils de débogage de l’interface graphique: points d'arrêt, étape par étape, étape par étape, inspecteurs de valeur (texte, xml, personnalisé), surveillances, débogage par thread, points d'arrêt conditionnels, fenêtre de pile d'appels avec possibilité de passer au code à n'importe quel niveau dans la pile
- (Pour être juste, mon passage chez Emacs + Slime a semblé fournir une partie de cela, mais je suis partisan de l'approche basée sur l'interface graphique VS)
J'aime beaucoup le battage médiatique qui entoure Lisp et je lui ai donné une chance.
Mais y a-t-il quelque chose que je puisse faire dans Lisp que je ne puisse pas faire aussi bien en C #? C'est peut-être un peu plus bavard en C #, mais j'ai aussi une saisie semi-automatique.
Qu'est-ce que je rate? Pourquoi devrais-je utiliser Clojure / CL?
AND
ou si vous utilisez OR
une fonction. Cela pourrait être fait (étant donné LAMBDA
que c'est aussi une macro) mais je ne vois pas de moyen évident de le faire qui ne soit pas totalement nul.