2010-04-28 38 views
7

¿Cuál es el conjunto mínimo de primitivas requeridas de modo que un idioma es Turing completo y una variante de lisp?Lisp realmente mínimo

Parece que el coche, el cdr y algunos controles de flujo y algo para REPL es suficiente. Sería bueno si hay tal lista.

Suponga que sólo hay 3 tipos de datos, números enteros, los símbolos y las listas. (Como en picolisp)

+0

Tenga en cuenta que los enteros son innecesarios, puede implementarlos a partir de funciones puras. – celtschk

Respuesta

5

Hay una buena discusión de esto en el Lisp FAQ. Depende de tu elección de primitivos. El "LISP 1.5 Programmer's Manual" original de McCarthy lo hizo con cinco funciones: CAR, CDR, CONS, EQ y ATOM.

+2

Al leer dichas preguntas frecuentes, parece que utilizó esas cinco funciones junto con los formularios especiales CONS, LAMBDA y QUOTE. – Zak

12

El lambda calculus es Turing completo. Tiene un primitivo, el lambda. Traducir eso a una sintaxis lisp es bastante trivial.

+0

En realidad tiene * tres * primitivas: expresiones lambda, llamadas a funciones y referencias de variables. –

1

La mejor manera de saber esto con certeza es si lo implementa. Utilicé 3 veranos para crear Zozotez que es un LISP McCarty-ish ejecutándose en Brainfuck.

Traté de averiguar lo que necesitaba y en un foro encontrarás un hilo que dice You only need lambda. Por lo tanto, puedes hacer un LISP completo en cálculo lambda si lo deseas. Lo encontré interesante, pero difícilmente es el camino a seguir si quieres algo que finalmente tenga efectos secundarios y funcione en el mundo real.

Para una completa LISP Turing Solía ​​Paul Grahams explanation of McCarthy's paper y todo lo que realmente necesita es:

  • símbolo de la evaluación
  • forma especial cotización
  • forma especial si (o cond)
  • forma lambda especial (similar a la cita)
  • función eq
  • función átomo
  • contras de función
  • coche de la función
  • función CDR
  • función de despacho (básicamente se aplica, pero en realidad no expone al sistema por lo que maneja una lista donde primer elemento es una función)

Eso es 10. Además de esto, tener una aplicación que se puede probar y no sólo en un tablero de dibujo:

  • función de lectura
  • función escribe

Eso es 12.En mi Zozotez implementé set y flambda (macro anónimas, como lambda) también. Podría alimentarlo en una biblioteca que implemente cualquier ceceo dinámico enlazado (Elisp, picoLisp) con la excepción de E/S de archivos (porque el BF subyacente no lo admite más que stdin/stdout).

Recomiendo a cualquiera que implemente un intérprete LISP1, tanto en LISP como en (not LISP), para comprender completamente cómo se implementa un lenguaje. LISP tiene una sintaxis muy simple, por lo que es un buen punto de partida. Para todos los demás lenguajes de programación, la forma de implementar un intérprete es muy similar. P.ej. en el SICP videos los asistentes hacen un intérprete para un lenguaje lógico, pero la estructura y la forma de implementarlo es muy similar a un intérprete de lisp aunque este lenguaje es completamente diferente de Lisp.