Pregunta

He leído un montón que LISP puede redefinir la sintaxis sobre la marcha, presumiblemente con macros.Tengo curiosidad ¿en qué medida este hecho ir?Se puede redefinir la estructura de la lengua, tanto que en el límite se convierte en un compilador para otro idioma?Por ejemplo, podría cambiar la naturaleza funcional de LISP en un objeto más orientado a la sintaxis y la semántica, tal vez decir que tiene una sintaxis más cerca de algo parecido a Ruby?

Especialmente, es posible deshacerse de los paréntesis infierno con macros?He aprendido lo suficiente (Emacs)LISP para personalizar Emacs con mi propia micro-características, pero soy muy curioso cómo ahora las macros pueden ir en la personalización de la lengua.

¿Fue útil?

Solución

Esa es una muy buena pregunta.

Creo que es matizada, pero sin duda responde:

Las Macros no está atrapado en s-expresiones.Ver el BUCLE macro para una lengua muy compleja por escrito el uso de palabras clave (símbolos).Así, mientras que usted puede comenzar y terminar el bucle con paréntesis, dentro de ella tiene su propia sintaxis.

Ejemplo:

(loop for x from 0 below 100
      when (even x)
      collect x)

Dicho esto, la mayoría simple de macros sólo el uso de expresiones-s.Y había de ser "atrapado" uso de ellos.

Pero de expresiones-s, como Sergio ha contestado, empezar a sentirse bien.La sintaxis de la forma y de iniciar la codificación en el árbol de sintaxis.

Como para que el lector macros, sí, usted podría escribir algo como esto:

#R{
      ruby.code.goes.here
  }

Pero tendría que escribir su propia Ruby analizador de sintaxis.

También puede imitar algunos de los Ruby construcciones, como los bloques, con macros que compilar el existente Lisp construcciones.

#B(some lisp (code goes here))

podría traducirse en

(lambda () (some lisp (code goes here)))

Ver esta página para saber cómo hacerlo.

Otros consejos

Sí, puede volver a definir la sintaxis de modo que Lisp se convierte en un compilador.Esto se hace mediante "Lector de Macros", que son diferentes de las normales del Compilador "Macros" que probablemente estás pensando.

Common Lisp tiene el mecanismo integrado para definir una nueva sintaxis para el lector y el lector de macros para procesar la sintaxis.Este procesamiento se realiza en la lectura del tiempo (que viene antes de compilar o eval tiempo).Para aprender más acerca de la definición de lector de macros en Common Lisp, ver el Common Lisp Hyperspec -- usted querrá leer Ch.2, "Sintaxis" y Ch.23, "Lector".(Creo Esquema tiene el mismo plantel, pero yo no estoy tan familiarizado con ella, consulte la Esquema de las fuentes de para el Arco lenguaje de programación).

Como un ejemplo simple, supongamos que queremos Lisp para utilizar llaves en lugar de paréntesis.Esto requiere algo como la siguiente lector definiciones:

;; { and } become list delimiters, along with ( and ).
(set-syntax-from-char #\{ #\( )
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do.
  (declare (ignore inchar))
  (read-delimited-list #\} stream t))
(set-macro-character #\{ #'lcurly-brace-reader)

(set-macro-character #\} (get-macro-character #\) ))
(set-syntax-from-char #\} #\) )

;; un-lisp -- make parens meaningless
(set-syntax-from-char #\) #\] ) ; ( and ) become normal braces
(set-syntax-from-char #\( #\[ )

Estás diciendo Lisp que el { es como una ( y que el } es como una ).A continuación, puede crear una función (lcurly-brace-reader) que el lector va a llamar cuando se ve a un {y utilizar set-macro-character para asignar esa función a la {.Entonces se dice Lisp que ( y ) son como [ y ] (es decir, no significativo de la sintaxis).

Otras cosas que usted puede hacer incluyen, por ejemplo, la creación de una nueva sintaxis de la cadena de o utilizando [ y ] para incluir en la revisión de la notación y el proceso en S-expresiones.

También se puede ir mucho más allá de esto, la redefinición de la totalidad de la sintaxis con su propia macro caracteres que va a desencadenar acciones en el lector, de modo que el cielo es realmente el límite.Esta es sólo una de las razones por las que Paul Graham y otros sigo diciendo que Lisp es un buen lenguaje para escribir un compilador.

Yo no soy un Lisp experto, diablos ni siquiera soy Lisp programador, pero después de un poco de experimentación con el lenguaje llegué a la conclusión de que después de un tiempo el paréntesis de comenzar a volverse "invisibles" y se empiezan a ver el código como usted quiere que sea.Usted comienza a prestar más atención a la sintáctica de las construcciones de crear a través de s-exprs y macros, y menos a la forma léxica del texto de las listas y el paréntesis.

Esto es especialmente cierto si usted toma ventaja de un buen editor que ayuda con la sangría y el coloreado de la sintaxis (pruebe a establecer el paréntesis de un color muy similar al del fondo).

Usted podría no ser capaz de reemplazar el lenguaje completamente y obtener 'Ruby' sintaxis, pero no la necesita.Gracias a la lengua de la flexibilidad que usted podría terminar teniendo un dialecto que se siente como usted está siguiendo el 'Ruby estilo de programación" si ustedes quieren, lo que sea que signifique para usted.

Sé que esto es sólo una observación empírica, pero creo que tuve uno de esos Lisp iluminación momentos cuando me di cuenta de esto.

Una y otra vez, los recién llegados a Lisp quiere "deshacerse de todos los paréntesis." Dura un par de semanas.Ningún proyecto para construir un serio propósito general de la sintaxis de la programación en la parte superior de la costumbre S-analizador de la expresión nunca llegamos a ninguna parte, porque los programadores invariablemente terminan prefiriendo lo que actualmente perciben como "paréntesis el infierno." Se tarda un poco en acostumbrarse, pero no mucho!Una vez que usted consiga utilizado a él, y realmente se puede apreciar la plasticidad de la sintaxis por defecto, volver a idiomas donde sólo hay una manera de expresar su particular construcción de programación es realmente rejilla.

Dicho esto, Lisp es un excelente sustrato para la construcción de Lenguajes Específicos de Dominio.Tan bueno como, si no mejor que, XML.

Buena suerte!

La mejor explicación de Lisp macros que he visto es en

https://www.youtube.com/watch?v=4NO83wZVT0A

a partir de los 55 minutos.Este es un video de una charla dada por Pedro Seibel, el autor de "la Práctica Común de Lisp", que es la mejor Lisp libro de texto que hay.

La motivación para Lisp macros es generalmente difícil de explicar, porque realmente entrar en su cuenta en situaciones que son demasiado largos para presentar en un sencillo tutorial.Pedro viene con un gran ejemplo;se puede comprender totalmente, y se hace un buen, uso adecuado de Lisp macros.

Le preguntó:"podría cambiar la naturaleza funcional de LISP en un objeto más orientado a la sintaxis y la semántica".La respuesta es sí.De hecho, Lisp originalmente no tenía ninguna programación orientada a objetos en absoluto, no es de extrañar, ya que Lisp ha sido de alrededor desde años antes de la programación orientada a objetos!Pero cuando se enteró por primera vez de la programación orientada a objetos en 1978, hemos sido capaces de añadir a Lisp fácilmente, usando, entre otras cosas, las macros.Finalmente, el Common Lisp Object System (CLOS) fue desarrollado, un muy poderoso de programación orientado a objetos del sistema que se adapta con elegancia en Lisp.Todo esto puede ser cargado como una extensión -- nada es incorporado!Todo se hace con macros.

Lisp tiene una completamente diferente característica, llamada "lector de macros", que puede ser utilizado para ampliar la superficie de la sintaxis del lenguaje.El uso de lector de macros, se puede hacer entrelazados que han C o Ruby-como la sintaxis.Ellos transforman el texto en Lisp, internamente.Estos no son utilizados ampliamente por la mayoría de Lisp real programadores, principalmente porque es difícil ampliar el entorno de desarrollo interactivo para entender la nueva sintaxis.Por ejemplo, Emacs sangría de comandos sería confundido por una nueva sintaxis.Si usted es enérgico, aunque, Emacs es extensible también, y usted puede enseñar acerca de su nuevo léxico en la sintaxis.

Regular las macros funcionan en las listas de objetos.Más comúnmente, estos objetos son otras listas (por lo tanto la formación de los árboles) y los símbolos, pero pueden ser otros objetos, tales como cuerdas, tablas hash, objetos definidos por el usuario, etc.Estas estructuras se denominan s-exps.

Así, cuando se carga un archivo de origen, su compilador de Lisp va a analizar el texto y producir s-exps.Macros de operar en estas.Esto funciona muy bien y es una manera maravillosa para extender el lenguaje dentro del espíritu de la s-exps.

Además, el mencionado proceso de análisis puede ser extendido a través de "lector de macros", que permiten personalizar la forma en que su compilador convierte texto en s-exps.Sugiero, sin embargo, que el abrazo de Lisp de la sintaxis en lugar de transformarla en algo más.

Suena un poco confuso cuando usted menciona Lisp del "carácter funcional" de Rubí y orientado a objeto "sintaxis".No estoy seguro de lo orientado a objeto "sintaxis" se supone que es, pero Lisp es un multi-paradigma de la lengua y es compatible con la programación orientada a objetos extremadamente bien.

Por CIERTO, cuando digo Lisp, me refiero a Common Lisp.

Le sugiero que ponga tus prejuicios de distancia y dar Lisp honesto ir.

Entre paréntesis el infierno?No veo mas paréntesis en:

(function toto)

que en:

function(toto);

Y en

(if tata (toto)
  (titi)
  (tutu))

no más que en:

if (tata)
  toto();
else
{
  titi();
  tutu();
}

Yo veo menos que los soportes y ';' sin embargo.

Lo que están pidiendo es un poco como preguntar cómo convertirse en un experto chocolatero de modo que usted puede quitar todo lo que infernal marrón cosas de su favorito de pastel de chocolate.

Sí, usted puede cambiar fundamentalmente la sintaxis, e incluso escapar "el paréntesis el infierno".Para que usted necesita para definir un nuevo lector de sintaxis.Mira en el lector de macros.

Yo sospecho sin embargo que, para alcanzar el nivel de Lisp experiencia para programa de macros que se necesita para sumergirse en el idioma, a tal grado, que ya no tendrá en cuenta parenthese "infierno".I. e.por el momento de saber cómo evitarlos, se han llegado a aceptar como una buena cosa.

Si desea lisp para parecerse a Ruby uso de Ruby.

Es posible utilizar Ruby (y Python) en un muy lisp como la forma en que es uno de los principales motivos por los que han ganado aceptación tan rápidamente.

vea este ejemplo de cómo el lector de macros se puede extender la lisp lector con tareas complejas como XML plantillas:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

este el usuario de la biblioteca compila las partes estáticas de los XML en codificación UTF-8, literal matrices de bytes en tiempo de compilación que están listos para escribir la secuencia había en el flujo de la red.y son utilizables en la normal de lisp macros, que son ortogonales...la colocación de la coma carácter influye en la cual las piezas son constantes y que deben ser evaluados en tiempo de ejecución.

más detalles están disponibles en: http://common-lisp.net/project/cl-quasi-quote/

otro de los proyectos de Common Lisp sintaxis de las extensiones: http://common-lisp.net/project/cl-syntax-sugar/

@sparkes

A veces LISP es la clara elección de idioma, es decir, Emacs extensiones.Estoy seguro de que podría usar Ruby para extender Emacs, si yo quería, pero Emacs fue diseñado para ser ampliado con LISP, por lo que parece que tiene sentido usarlo en esa situación.

Es una pregunta complicada.Desde lisp ya está estructuralmente tan cerca de un árbol de análisis de la diferencia entre un gran número de macros y la implementación de su propio mini-lenguaje en un parser generator no es muy clara.Pero, a excepción de la apertura y el cierre de paréntesis, usted podría terminar con algo que no se parece en nada lisp.

Uno de los usos de las macros que soplaba a mi mente fue el tiempo de compilación de la verificación de las solicitudes SQL contra la base de datos.

Una vez que te das cuenta de que tienes toda la lengua en la mano en tiempo de compilación, abre nuevas perspectivas interesantes.Lo que también significa que usted puede disparar en el pie en formas nuevas e interesantes (como la representación de compilación no es reproducible, que puede muy fácilmente convertirse en una depuración de pesadilla).

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