Hablemos de LISP

The hosts trace Lisp's origins through IPL and McCarthy's FLPL, explaining how the "eval" primitive unified code and data. They clarify confusion about dates (1958-1960), why Lisp wasn't the first functional language, and how it influenced modern languages like Clojure and Scheme.
Chapters
¿Otra vez un lenguaje funcional?
Y yo creyendo que con Haskell ya habías aprendido a apreciarlos.
No es solo que sea funcional, es que es la raíz de todo el mal. El primero. La semilla.
Pues en verdad no.
¿Cómo que no? Entonces, ¿cuál fue el primero? ¿Prolog?
No, chit. Prolog es de la década de 1970, mientras que Lisp surgió en 1959.
Eso también requiere ciertos matices.
Vaya, pro. Estás puntilloso con este tema, Si abrís buenos libros, vuestro libro. ¿Qué libro, pro?
El que ya deberíais tener de historia de los lenguajes de programación, años 1940-1959. En su capítulo 16 hablan del lenguaje IPL creado por Herbert Simon y Allen Newell.
Antes de continuar, si nos dais un buen me gusta y os suscribís al canal, nos ayudaréis mucho a crecer y a seguir haciendo este contenido que tanto disfrutamos. Y además Si os queréis hacer miembros del canal, ya sea como historiador o cronista, recibiréis contenido exclusivo, como por ejemplo un vídeo al mes especial. Muchas gracias a quien se anime y por supuesto también a los miembros recién llegados. Y ahora sí, dale, pro.
En principio, Principia Mathematica.
¡Qué buen juego de palabras! El Principia Mathematica es el compendio donde unos matemáticos quisieron recopilar todo lo que se conocía sobre las matemáticas con sus comprobaciones sin Si no recuerdo mal.
Exacto. Alfred North Whitehead y Bertrand Russell escribieron en 3 volúmenes todos los fundamentos matemáticos con sus numerosas demostraciones.
¿Y por qué este libro es importante?
Más que el libro, el concepto. Herbert Simon estaba convencido de poder realizar todas esas demostraciones a través de un computador.
Eso no es nada del otro mundo.
¡Chip! Hablamos de la década de 1940, que por no existir no había ni Fortran aún.
Simon tuvo una infancia difícil. En donde vivía se hacían concursos de recoger bayas y principalmente fresas, pero no entendía cómo él no podía encontrar muchas mientras otros tenían las cestas llenas.
¿Se le daba mal buscar?
No, Chip, era daltónico. Intenta buscar fresas entre los arbustos viendo todo verde, ni un ápice de rojo.
Ah, vale, así sí tiene sentido.
Pues esa carencia le hizo preguntarse ¿Cómo logran los seres humanos, a pesar de sus limitadas capacidades de procesamiento, tomar decisiones razonables?
Pues teniendo en cuenta que no todos toman decisiones razonables, asumimos que ciertamente puede deberse a esas limitaciones.
Tú sí que estás limitado, Chip. Simon se refiere a tomar decisiones para resolver problemas sin necesidad de resolver todo por fuerza bruta navegando por todas las opciones.
¿Y cómo sabes que nuestro cerebro no revisa todas las opciones y se queda con la que mejor resultado le dio.
Admito que eso tiene sentido.
En eso se basa la inteligencia artificial, y tanto Simon como Newell son considerados los padres de esta doctrina.
Un momento, pro, que hasta yo sé que el padre de la inteligencia artificial es John McCarthy.
Me temo que no. John McCarthy acuñó el término, pero Simon asentó las bases. De hecho, la primera reunión donde McCarthy reunió a todos los interesados en este campo Fue donde asistieron Simon y Newell a mostrar a todos su lenguaje IPL.
Entonces, ¿a partir de esa reunión fue que McCarthy tomó conciencia de que debía hacer un lenguaje de programación?
¡Exacto! El lenguaje IPL mostró que, mediante listas, se podían procesar datos y resolver problemas matemáticos de forma simple. Por eso el uso de la programación funcional.
Pero como dijimos en el capítulo de Haskell, no todo tuvo origen desde un principio. Es más, muchos de los lenguajes de dos décadas después aún no tenían muchos de los elementos que sí tuvo Haskell. Por lo que... ¿Es Lisp realmente funcional?
¿Estamos discutiendo si Lisp es funcional? Yo estoy seguro de que sí.
Como dijimos en el capítulo de Haskell, sí. Es funcional, pero con matices.
Podemos decir entonces que se encuentra en un estado anterior, algo así como si fuese un lenguaje declarativo.
¡Completamente! Lisp, en sus inicios, no tenía inmutabilidad y no gestionaba los efectos secundarios, por lo que no era tan funcional como Haskell.
De hecho, tampoco se le considera la raíz de los lenguajes funcionales.
¿No? ¿Cuál es el lenguaje raíz entonces?
Eswing.
Ese lenguaje no es ni conocido.
Porque ni siquiera es un lenguaje.
Vaya, cuando te pones críptico no hay quien te entienda, pro. A ver, ¿qué es ISWIM?
Pues es una familia de lenguajes.
¿Una familia de lenguajes? ¿Son más de uno?
No, Chip. Así es como se llama a una directriz o conjunto de patrones de qué debe tener un lenguaje para ser considerado de un cierto tipo.
Exacto. Si tenéis el libro de historia de los lenguajes de programación de la década de 1960, en su capítulo 18 comenta la familia de lenguajes ISWIN donde Peter Landin define las bases que servirían para definir y crear lenguajes funcionales.
Vaya, parece que Landin fue quien acuñó el término de azúcar sintáctico también.
¿Dónde estás leyendo?
Sección 18.2.
Sí, la definición era algo como un cambio en el lenguaje a nivel sintáctico pero que no afecta a la semántica del lenguaje. Cambia la forma pero no el significado.
Vamos, que no sirve para nada.
Hay lenguajes como Ruby o Elixir donde el azúcar sintáctico sirve para evitar la burocracia.
¿Burocracia?
Sí, escribir código que no tiene un uso práctico y se repite una y otra vez.
Una especie de simplificación.
Vale, vayamos al tema en cuestión, porque parece ser que ISWIN vino después, así que... ¿Cómo surge Lisp?
Habíamos dicho que la idea surgió de la primera conferencia de inteligencia artificial.
Exacto. Vamos al capítulo 6 del libro de la década de 1960.
¿Le vamos a dar muchas vueltas al libro?
Esta será seguramente la última, Chip. En este capítulo se menciona lo que preguntaste.
Exacto. McCarthy comenzó a usar IPL como un lenguaje algebraico de procesamiento de listas, pero... ¿Ese pero?
Indica que hizo como muchos otros hicieron, ¿no? No hacía algo de la forma que él quería y se creó su propio lenguaje.
¡Exacto!
¡Muy bien, Chip!
El problema fue la portabilidad. El lenguaje IPL fue creado para una arquitectura concreta y no era la arquitectura de IBM 704 usada por McCarthy. Aprovechando su posición de consultor en IBM junto a Marvin Minsky—
¿Marvin Minsky? A él lo vimos en el capítulo de Logo.
McCarthy y Minsky eran consultores. Yo creía que eran profesores e investigadores de Dartmouth.
Eran profesores, investigadores y consultores en Dartmouth, pero IBM y otras empresas estadounidenses hacen acuerdos para trabajar conjuntamente y entonces hay profesores que terminan en las instalaciones de ciertas empresas aprovechando estas sinergias.
Según la Wikipedia, Livs Es de 1959, así que supongo que se utilizaría como base algún lenguaje de IBM como FORTRAN.
Fue una de las propuestas de IBM hacia McCarthy, pero no consideró que FORTRAN fuese un lenguaje apropiado.
¿Por qué motivo?
Porque carece de elementos dentro del lenguaje que le permitan trabajar con listas.
Pero se pueden suplir con una biblioteca.
¡Chip! La idea es que sea fácil escribir el código.
Para McCarthy implementar un lenguaje con estas capacidades era la diferencia entre emplear esos otros lenguajes como si fuesen computadores binarios y ese nuevo lenguaje de listas que se aparecía como si fuese un computador decimal. Pero por algún lado había que comenzar. Creando FLPL.
No comenzó entonces por un lenguaje desde cero porque esa F me da la sensación de que será Fortran, ¿no?
Exacto. FLPL son las siglas de Fortran Lisp Processing Language, o lenguaje de procesamiento de listas Fortran.
Entonces no crearon una biblioteca, sino que modificaron un poco Fortran. En el capítulo de BASIC recuerdo lo mala idea que les parecía a Kemeny y Kurtz esto mismo.
¡Cierto! Dijeron que usar Fortran pero modificarlo hasta no ser Fortran podría ser muy confuso para los usuarios. Los que conocen Fortran verían algo diferente y los que no... Podrían creer que aprenden erróneamente Fortran.
Por eso mismo lo llamaron FLPL. Aunque fue un proyecto con un recorrido bastante corto, ya que no disponía ni de recursividad ni de recolector de basura, pero de sus implementaciones se extrajo una idea que modificó la forma de usar los lenguajes imperativos.
¿Los lenguajes imperativos? ¿Qué fue?
La expresión condicional if.
¿No existía esa implementación en Fortran en la década de 1950?
¡No! Fue agregada a partir de 1958 gracias a la implementación que hicieron McCarthy y National Rochester en FLPL.
Vale, pero has dicho 1958 y Wikipedia dice que Lisp surgió en 1959.
En otros sitios dice que Lisp surgió en 1960.
La Wikipedia mezcla muchas cosas y a veces de forma incorrecta. Hay que diferenciar. Concepto e implementación. McCarthy estuvo trabajando hasta 1959 en el concepto de Lisp y publicó el documento con su presentación correspondiente en el mismo año.
Entonces Lisp es de 1959.
No has prestado atención. Dijo el concepto, no había nada implementado.
Pues como con ESWIM.
Es diferente, ESWIM es una familia de lenguaje. Y Lisp es la definición de concepto de un lenguaje de programación.
Vale, entonces hasta 1959 solo se obtuvo el concepto.
Exacto. Fue en 1960 y a partir de ahí que comenzó a existir una primera implementación.
Pues sí que se dieron prisa.
Supongo que comenzaron a implementarla antes.
En 1958 comenzaron a implementar y hay que decir que Lisp no era como hoy lo conocemos.
Tampoco lo es Fortran. ¿Un Fortran sin if?
¿Cómo era el concepto inicial de Lisp?
La idea inicial era un lenguaje intermedio de expresiones M, es decir, expresiones encapsuladas entre corchetes.
¿Los corchetes eran los paréntesis cuadrados?
¿Así llamas a los corchetes?
Hay nombres peores.
Estas expresiones escritas en la notación prefija donde el primer elemento es el operador y los siguientes elementos son los argumentos Era la representación intermedia.
¿Representación intermedia? ¿Se traducía de la forma de paréntesis a corchetes?
No, en verdad, en principio esta notación M de expresiones M cambió para usar paréntesis en algún momento formando la notación S con expresiones S, pero seguía siendo la notación intermedia.
¿Pero intermedia a qué?
Entre el código escrito por el programador y el código máquina.
¿Quieres decir que había una sintaxis a más alto nivel que la anotación S de paréntesis?
¡Exacto! A ver, McCarthy y su equipo se centró en desarrollar el concepto del lenguaje, validar que todo fuese correcto y posible, y por tanto dejaron la anotación de alto nivel para más adelante.
Para más adelante quiere decir que nunca se hizo.
Al utilizar hoy en día Lisp, programamos en una anotación intermedia pensada para la máquina.
¡Exacto! La notación M y posteriormente la notación S eran piezas pensadas para ser procesadas de forma automática por la máquina. El lenguaje de alto nivel pensado que se traduciría a esta notación S era un lenguaje muy parecido al GOAL.
Pudieron terminar con un lenguaje muy parecido a lo que hoy en día sería C. ¿Por qué usar la notación S?
Hubo un comando muy popular en Lisp llamado eval.
A día de hoy está en casi todos los lenguajes de programación.
Ese comando se pensó para cuando se escribe código en Lisp y se escribe eval, el programador a la hora de transcribir ese código a la máquina debe procesarlo manualmente.
¿Manualmente? ¿McCarthy pensó que era la mejor opción?
McCarthy pensó que era la única forma de procesar eval, pero parece que Rochester no estuvo atento a las notas de McCarthy y lo implementó demostrando a McCarthy que estaba equivocado.
¡Tasca!
No creo que fuese tan irrespetuoso.
Da igual, seguro que le tuvo que doler.
Entonces, ¿eval motivó a que se siguiese usando la notación S?
Pasa algo curioso. Cuando se escribe una expresión S, en verdad se está escribiendo un dato. Si uno de los argumentos es otra expresión y vamos recorriendo el árbol formado desde la primera de las expresiones, nos damos cuenta de que eval es tan solo lo que ya hace Lisp.
Va realizando reducciones del código hasta quedarse con un resultado.
Exacto. Suena poético, ¿no?
No.
Algo sí.
Pues se dieron cuenta de que si agregaban algo por encima no podrían mantener esa unión entre datos y expresiones, así que finalmente se quedó así.
Vale, pero de todas formas abramos sección que hay que dejar las cosas claras. ¿Es Lisp aún relevante?
Mucho más de lo que piensas, Chip.
¿Cómo? ¿Has usado Emacs?
No, ni pienso usarlo.
Yo sí, es muy recomendable, incluso en su forma visual.
Pues Emacs tiene sus extensiones escritas con sintaxis de Lisp, y seguro que te habrás topado con Scheme.
En la universidad, Chip.
Ay, haciéndome recordar traumas.
Tanto Scheme como Clojure están considerados dialectos.
¿Dialectos? ¿Como pequeños cambios con respecto al original?
En verdad, pequeños cambios con respecto al estándar. El lenguaje que implementa el estándar al 100% es Common Lisp.
No te olvides de Racket, pro. Ese lenguaje es bastante popular hoy en día y se trabaja también con la misma sintaxis que se usa con Lisp.
Conclusiones.
Se me ha hecho corto.
No ha sido muy extenso, pero como se suele decir, lo bueno si breve, dos veces bueno.
Nos quedamos con la idea de que Lisp es un lenguaje inacabado cuyo creador se llevó varias sorpresas a lo largo de su desarrollo.
¿Dos sorpresas?
Sí, por eso de que EVAL se pudo hacer y porque parece que la notación S parecía ser la preferencia por los adeptos del lenguaje.
Son algunas de las conclusiones, sí, pero lo más importante es que Lisp trajo muchos avances que se implementaron no solo en Lisp y que quedaron.
¿Te refieres al condicional?
Y al recolector de basura.
De eso no habíamos hablado.
Está en el libro de la década de 1960, capítulo 6, Sección quinta.
Pues vamos con las preguntas y comienzo yo. ¿De verdad alguien usa Lisp?
Chip, eso está claro que sí, pero profundicemos más. Para los que lo habéis usado, ¿cuál es vuestro dialecto favorito?
¿Sabíais que una de las influencias de Lisp es Clojure? Déjanos tu comentario.
No quedan más lenguajes funcionales, ¿no? Llevamos una racha... El siguiente debería ser algo exótico pero interesante.
¿Algo como CIG?
¿O explicamos algún algoritmo curioso?
Yo me refería a algo como Nim o Chapel, lenguajes con buen gusto.
Y curiosamente con sintaxis de Python.
¿No hay otra mejor?
Discutible.
¿Y si hacemos un monográfico?
Sí, como con BASIC, que Pro nos puso a hacer de Kemeny y Kurtz.
¡Qué buena idea! Dais el perfil para poder actuar como Charles Moore y Elizabeth Raiser, los creadores y propulsores de Forth.
¿Otro lenguaje que nadie conoce?
Continuará.
More from Manuel

Historia de los Lenguajes de Programación: años 1960-1969 #basic #apl #simula #lisp #logo

¿Compilador o intérprete? La historia de una rivalidad que comenzó en los años 40








