Después de unos meses de aprender y jugar con Lisp, tanto CL como un poco de Clojure, todavía no veo una razón convincente para escribir nada en lugar de C #.
Realmente me gustaría algunas razones convincentes, o para que alguien señale que me estoy perdiendo algo realmente grande .
Los puntos fuertes de Lisp (según mi investigación):
- Notación compacta y expresiva: más que C #, sí ... pero parece que también puedo expresar esas ideas en C #.
- Soporte implícito para programación funcional - C # con métodos de extensión LINQ:
- mapcar = .Seleccionar (lambda)
- mapcan = .Select (lambda) .Agregre ((a, b) => a.Union (b))
- coche / primero = .Primero ()
- cdr / rest = .Skip (1) .... etc.
- Compatibilidad con funciones Lambda y de orden superior: C # tiene esto y la sintaxis es posiblemente más simple:
- "(lambda (x) (cuerpo))" versus "x => (cuerpo)"
- "# (" con "%", "% 1", "% 2" es bueno en Clojure
- Despacho de método separado de los objetos: C # tiene esto a través de métodos de extensión
- Despacho multimetodo: C # no tiene esto de forma nativa, pero podría implementarlo como una llamada de función en unas pocas horas
- El código es datos (y macros): tal vez no he "obtenido" macros, pero no he visto un solo ejemplo en el que la idea de una macro no se pueda implementar como una función; no cambia el "idioma", pero no estoy seguro de que sea una fortaleza
- DSL: solo puede hacerlo a través de la composición de funciones ... pero funciona
- Programación "exploratoria" sin tipo: para estructuras / clases, las autopropertías de C # y el "objeto" funcionan bastante bien, y puede escalar fácilmente a una escritura más fuerte a medida que avanza
- Se ejecuta en hardware que no es de Windows. Fuera de la universidad, solo he conocido a una persona que no ejecuta Windows en casa, o al menos una VM de Windows en * nix / Mac. (Por otra parte, tal vez esto es más importante de lo que pensaba y me acaban de lavar el cerebro ...)
- El REPL para el diseño de abajo hacia arriba: Ok, admito que esto es realmente muy agradable, y lo extraño en C #.
Cosas que me faltan en Lisp (debido a una combinación de C #, .NET, Visual Studio, Resharper):
- Espacios de nombres. Incluso con métodos estáticos, me gusta vincularlos a una "clase" para clasificar su contexto (Clojure parece tener esto, CL no parece tener).
- Gran compilación y soporte en tiempo de diseño
- el sistema de tipos me permite determinar la "corrección" de las estructuras de datos que paso
- todo lo que está mal escrito está subrayado en tiempo real; No tengo que esperar hasta el tiempo de ejecución para saber
- las mejoras de código (como el uso de un enfoque FP en lugar de uno imperativo) se sugieren automáticamente
- Herramientas de desarrollo de GUI: WinForms y WPF (sé que Clojure tiene acceso a las bibliotecas de GUI de Java, pero son completamente ajenas a mí).
- Herramientas de depuración de la interfaz gráfica de usuario: puntos de interrupción, paso, paso, inspectores de valor (texto, xml, personalizado), relojes, depuración por subproceso, puntos de interrupción condicionales, ventana de pila de llamadas con la capacidad de saltar al código en cualquier nivel en la pila
- (Para ser justos, mi período con Emacs + Slime parecía proporcionar algo de esto, pero soy parcial con el enfoque de VS GUI)
Realmente me gusta el bombo que rodea a Lisp y le di una oportunidad.
Pero, ¿hay algo que pueda hacer en Lisp que no pueda hacer tan bien en C #? Puede ser un poco más detallado en C #, pero también tengo autocompletar.
¿Qué me estoy perdiendo? ¿Por qué debería usar Clojure / CL?
AND
o OR
como una función. Podría hacerse (dado LAMBDA
, que también es una macro), pero no veo una forma obvia de hacerlo que no apestara totalmente.