¿Cómo se analiza?
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
El árbol de análisis probablemente se parece a
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
hmm ... serialicemos este árbol en una lista, notación de prefijo
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Este formato de árbol de análisis es bastante fácil de manipular, pero tengo un problema. Odio los separadores. Me gustan los terminadores. Al mismo tiempo, me gusta rociar en espacios en blanco.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... el espacio en blanco adicional hace que ciertas cosas sean más difíciles de analizar ... Tal vez podría simplemente hacer una regla de que el árbol se representa como (raíz, hoja, hoja, hoja).
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Ahora mi serialización de un árbol de análisis es lisp (renombrar la función para aplicar, y esto probablemente se ejecute). Si quiero programas que escriban programas, es agradable manipular solo los árboles de análisis.
Esto no es del todo cómo surgieron las expresiones s, pero se identificó temprano, y es una característica que usan los programadores de lisp. Nuestros programas se analizan previamente en cierto sentido, y escribir programas para manipularlos es bastante fácil debido al formato. Es por eso que la falta de sintaxis a veces se considera una fortaleza.
Pero como dijo David, use un editor consciente de s-expression. Es más probable que pierda la pista de una llave de cierre en una expresión s que una llave de cierre en xml ( </foo>
solo se cierra <foo>
, pero el par derecho cierra CUALQUIER expresión de s). En raqueta, el uso de corchetes para algunas expresiones, junto con un buen estilo de sangría, corrige la mayoría de los problemas.
La versión lisp:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
No está mal.