Pregunta

Mi profesor nos dijo que podíamos elegir un lenguaje de programación para nuestra próxima asignación de programación. Tenía la intención de probar un lenguaje funcional, así que me di cuenta de que lo intentaría. El problema es que comprendo la sintaxis y los conceptos básicos, pero tengo problemas para hacer que todo haga clic en " clic " en mi cabeza. ¿Alguien tiene algún consejo? ¿O tal vez estoy eligiendo el lenguaje incorrecto para comenzar con la programación funcional?

¿Fue útil?

Solución

Es un poco como andar en bicicleta, solo se necesita práctica. Intenta resolver algunos problemas con él, tal vez ProjectEuler y, finalmente, hará clic.

Alguien mencionó el libro " The Little Schemer " y esta es una lectura bastante buena. Aunque se dirige a Scheme, valdrá la pena resolver los problemas reales.

¡Buena suerte!

Otros consejos

Bueno, para mí, encontré el mismo problema que usted al principio cuando comencé a hacer OCAML, pero el truco es que debe comenzar a pensar en lo que quiere del código y < em> no cómo hacerlo !!!

Por ejemplo, para calcular el cuadrado de los elementos de la lista, olvídate de la longitud de la lista y de estos trucos, solo piensa matemáticamente así:

  • si la lista está vacía - > Ya he terminado

  • si no, la lista debe tener una cabecera y una cola - > calcula el cuadrado de la cabeza y luego pide a su función que haga lo mismo con la cola.

Solo piense en el caso general y en el de base, y que está emitiendo datos y no lo está modificando (a menos que desee modificarlo;)).

¡Buena suerte!

Puedes consultar The Little Schemer .

¿Qué tal esto? http://www.defmacro.org/ramblings/lisp.html

Es una introducción muy simple, paso a paso, para pensar de forma ágil desde el punto de vista de un programador imperativo habitual (Java, C #, etc.).

Para fines educativos, recomendaría el esquema PLT. Es un entorno portátil y potente con muy buenos ejemplos y una documentación aún mejor. Le ayudará a descubrir los pensamientos detrás de la programación funcional paso a paso y de una manera muy limpia. Elegir una pequeña aplicación para implementar te ayudará a aprender el nuevo idioma.

http://www.plt-scheme.org/

Además, " Estructura e interpretación de programas informáticos " de H. Abelssn, G. Sussman y J. Sussman es un muy buen libro con respecto a Scheme (y programación).

Saludos

mueble

Echa un vistazo a 99 problemas de Lispy

Algunas reflexiones sobre Lisps, que no son específicas de Clojure (no soy un experto en Lisp, así que espero que sean en su mayoría correctas y útiles):

Codificación en AST

Sé poco sobre teoría del compilador o intérprete, pero cada vez que codifico en Lisp, me sorprende que se sienta como si estuviera construyendo un AST directamente.

Eso es parte de lo que " código = datos " los medios, la codificación en Lisp es muy similar a rellenar estructuras de datos (listas anidadas) con nodos AST. Increíble, y es fácil de leer también (con el editor de texto correcto).

Un lenguaje de programación programable

Por lo tanto, los fragmentos de código son solo listas anidadas, y las operaciones de lista son parte del lenguaje. Por lo tanto, puede escribir muy fácilmente el código Lisp que genera el código Lisp (consulte las macros de Lisp). Esto convierte a Lisp en un lenguaje de programación programable (¡en sí mismo!).

Esto hace que la construcción de un DSL o un intérprete en Lisp es muy fácil (vea también evaluación meta-circular ).

Nunca reinicies nada

Y en la mayoría de los sistemas Lisp, el código (incluida la documentación) se puede inspeccionar e intercambiar en caliente en el tiempo de ejecución.

OOP avanzado

Luego, la mayoría de los sistemas Lisp tienen algún tipo de sistema de objetos derivado de CLOS, que es un sistema de objetos avanzado (comparado con muchas implementaciones OOP) y configurable (consulte El Arte del Protocolo de Metaobjeto ).

Todas estas características se inventaron hace mucho tiempo, pero no estoy seguro de que estén disponibles en muchos otros lenguajes de programación (aunque la mayoría se están poniendo al día, por ejemplo, con cierres), por lo que debes "redescubrir". y acostúmbrese a ellos practicando (vea los libros en otras respuestas).

Solo recuerda: ¡son todos los datos!

Escriba algunas funciones clásicas simples en las que Lisp es bueno, como

  • revertir una lista

  • indica si un átomo está en algún lugar de una expresión-s

  • escriba IGUAL para saber si 2 expresiones-s son iguales

  • escriba FRINGE para obtener la lista de átomos al borde de una expresión-s

  • escriba SUBST, luego escriba SUBLIS

  • Diferenciación simbólica

  • Simplificación algebraica

  • escriba una EVAL simple y / o APLICAR

Comprenda que Lisp es bueno para este tipo de programas funcionales sin efectos secundarios.

También es útil para programas de efectos secundarios con estado (no funcionales), pero son más parecidos a " programas " que " funciones " ;.

Lo que es mejor para una aplicación determinada depende de la aplicación. En general, no debe contener ni menos ni más información de estado que la necesaria.

¡Fácil!

  

M-x & nbsp; lisp-mode

Bien, bien, puede que no tengas Emacs para un cerebro. Con toda seriedad, lo que debe hacer es ser realmente bueno en la recursión. Esto puede ser una gran distorsión del cerebro al intentar extender el concepto de recursión más allá de los ejemplos canónicos, pero en última instancia, resultará en un código más fluido y fluido.

Además, muchas personas se atoran con el paréntesis, y realmente no sé por qué: la sintaxis es muy simple y consistente, y se puede dominar en minutos. Para mí, vine a Scheme después de haber aprendido C ++ y Java, y siempre pensé que la diferencia entre las funciones " " y " operadores " fue una falsa dicotomía, y fue refrescante ver que se eliminó esa distinción.

En lo que respecta a la programación funcional, siempre que pueda comprender el hecho de que una función es un valor de primera clase y se puede transferir tanto dentro como fuera de otras funciones, debería estar bien. La utilidad de esto se aclarará con el tiempo, pero es suficiente para que pueda escribir funciones de toma de funciones y funciones de retorno de funciones.

Finalmente, no estoy seguro de qué soporte tiene Clojure para las macros, pero se consideran una parte esencial de lisp. Sin embargo, no me preocuparía aprenderlos hasta que esté muy familiarizado con los elementos anteriores, aunque las macros son increíblemente útiles y versátiles, también se usan con menos frecuencia que las otras técnicas que mencioné.

Comenzaría con un lenguaje que puede ser interpretado. Encontré que Moscow ML es bastante fácil. Es una implementación ligera de Standard ML.

Mi práctica personal es encontrar un pequeño proyecto (algo que pueda demorar entre 3 y 5 noches de piratería) y ponerlo en práctica. ¿Qué tal una herramienta de filtro de blog? Tal vez solo una implementación de Towers of Hanoi o Linked List (que normalmente son proyectos de 1 noche).

La forma en que normalmente funciona es que la implemento de manera deficiente la primera vez, desecho lo que tenía y finalmente hace clic unas pocas horas.

Una GRAN ayuda es tomar un curso en algo como ... um ... ¡LISP! :) La tarea te obligará a enfrentar muchos de los conceptos y me hizo clic mucho antes de que terminara el semestre.

¡Buena suerte!

Buena suerte. Me llevó hasta aproximadamente la mitad de los " Programming Languages ??" curso en la universidad antes de que Scheme " haga clic en " ;. Sin embargo, una vez que eso sucedió, todo tenía sentido, y me enamoré de la programación funcional.

Escriba un intérprete de Lisp en Lisp.

Si no tienes alrady, lee sobre lo que hace que lisp sea un idioma único. Si no hace esto primero, intentará hacer lo mismo que podría hacer en otros lenguajes de programación.

Luego intente implementar algo pequeño (intente hacerlo útil para usted o es posible que no tenga la motivación).

Lisp en una caja es una excelente manera de mojarse los pies.

Para mí, lo importante es asegurarse de que haces todo de una manera 'lisp-y'. No te sientas tentado a pensar 'En Java usaría un bucle for aquí, ¿cómo hago para los bucles en Lisp?' pero para ver suficientes ejemplos y tutoriales (como alguien señaló, SICP es perfecto para esto) que puedes comenzar a detectar cuando el código parece 'Lisp-y' y reconocer paradigmas de lenguaje comunes.

Ciertamente, conozco la sensación de mirar un código que acabo de escribir e intuitivamente, sabiendo que es correctamente idiomático para ese lenguaje y plataforma / marco. Creo que es cuando hace clic.

Editar : y felicitaciones por elegir un lenguaje funcional, los estudiantes más pequeños lo habrían hecho en Java :)

¿Quién dijo que va a hacer clic? Siempre estoy confundido

Pero si piensas en cuánta abstracción es posible ocultar, detrás de macros lisp. Entonces tu cerebro explotará.

:)

Eché un vistazo a Programación Clojure. Es un gran libro para los que no muerden.

Además de lo que otros SOs ya han sugerido, aquí están mis 2 centavos:

  1. Empiece a aprender el idioma y pruebe algunos problemas simples de números / pasatiempos en el idioma
  2. IMPORTANTE: Publique la solución / el código en StackOverflow, y pida la opinión de la gente si esa es realmente la manera LISPy de hacerlo.

¡Mucha suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top