simbolica psicologia expresion ejemplos arquitectura list lisp s-expression

psicologia - Lisp: lista vs expresión-S



expresion simbolica ejemplos (5)

Ambos están escritos de manera similar: (bla bla bla), pueden estar anidados. con una diferencia - las listas tienen prefijo con apóstrofe.

En evaluación:

  • La expresión S devuelve algún resultado (puede ser un átomo o una lista o nula o lo que sea)
  • Listas de retorno Listas

Si lo necesitamos, podemos convertir listas a s-exp y viceversa.

  • (eval ''(blah blah blah)) => list se trata como un s-exp y se devuelve un resultado.
  • (quote (blah blah blah)) => sexp se convierte a la lista y la lista se devuelve sin evaluar

IAS:

  • Si una Lista se trata como datos, se denomina Lista, si se trata como código, se llama s-exp.

Estoy estudiando a Lisp ahora. Encontré 2 términos "lista" y "S-expresión". Simplemente no puedo distinguir entre ellos. ¿Son solo sinónimos en Lisp?


Primero debe comprender la característica principal de Lisp: el programa se puede manipular como datos. A diferencia de otros lenguajes (como C o Java), donde escribes un programa usando una sintaxis especial ( { , } , class , define , etc.), en Lisp escribes código como listas (anidadas) (por cierto, esto permite expresar sintáctica abstracta). árboles directamente). Una vez más: escribes programas que se parecen a las estructuras de datos del lenguaje.

Cuando habla de ello como datos , lo llama "lista" , pero cuando habla de código de programa , debería usar mejor el término "s-expresión" . Por lo tanto, técnicamente son similares, pero se utilizan en diferentes contextos. El único lugar real donde se mezclan estos términos es la meta-programación (normalmente con macros).

También tenga en cuenta que s-expresión también puede consistir en el único átomo (como números, cadenas, etc.).


Una definición simple para una expresión S es

(define S-expression? (λ (object) (or (atom? object) (list? object)))) ;; Where atom? is: (define atom? (λ (object) (and (not (pair? object)) (not (null? object))))) ;; And list? is: (define list? (λ (object) (let loop ((l1 object) (l2 object)) (if (pair? l1) (let ((l1 (cdr l1))) (cond ((eq? l1 l2) #f) ((pair? l1) (loop (cdr l1) (cdr l2))) (else (null? l1)))) (null? l1)))))


Las expresiones S son una notación para los datos.

Históricamente, una s-expresión (abreviatura de expresión simbólica ) se describe como:

  • símbolos como FOO y BAR
  • células de contras con expresiones s como su primer y segundo elemento: ( expresión-1 . expresión-2 )
  • el símbolo de terminación de lista NIL
  • y una convención para escribir listas: ( A ( B NIL ) ) se escribe más simple como la lista (AB)

Tenga en cuenta también que históricamente el texto del programa fue escrito de manera diferente. Un ejemplo para la función ASSOC .

assoc[x;y] = eq[caar[y];x] -> cadar[y]; T -> assoc[x;cdr[y]]

Históricamente, también existió una asignación de estas expresiones-m (abreviatura de expresiones meta ) a expresiones-s. Hoy en día, la mayoría del código del programa Lisp se escribe usando expresiones-s.

Esto se describe aquí: McCarthy, Funciones recursivas de expresiones simbólicas

En un lenguaje de programación Lisp como Common Lisp, en la actualidad , las expresiones s tienen más sintaxis y pueden codificar más tipos de datos:

  • Símbolos: symbol123 , |This is a symbol with spaces|
  • Números: 123 , 1.0 , 1/3 , ...
  • Cadenas: "This is a string"
  • Caracteres: #/a , #/space
  • Vectores: #(abc)
  • Conses y listas: ( a . b ) , (abc)
  • Comentarios ; this is a comment ; this is a comment , #| this is a comment |# #| this is a comment |#

y más.

Liza

Una lista es una estructura de datos . Consiste en celdas de contras y un marcador de final de lista. Las listas tienen una notación en Lisp como listas en s-expresiones. Podría usar algunas otras notaciones para las listas, pero en Lisp, uno se ha decidido por la sintaxis de la expresión s para escribirlas.

Nota al margen: programas y formularios.

En un lenguaje de programación como Common Lisp, las expresiones del lenguaje de programación no son texto, ¡sino datos! Esto es diferente de muchos otros lenguajes de programación. Las expresiones en el lenguaje de programación Common Lisp se denominan Lisp forms .

Por ejemplo, una llamada de función es datos de Lisp, donde la llamada es una lista con un símbolo de función como su primer elemento y los siguientes elementos son sus argumentos.

Podemos escribir eso como (sin 3.0) . Pero en realidad son datos. Datos que también podemos construir.

La función para evaluar los formularios de Lisp se llama EVAL y toma los datos de Lisp, no el texto del programa o las cadenas del texto del programa. Por lo tanto, puede construir programas utilizando funciones Lisp que devuelven datos Lisp: (EVAL (LIST ''SIN 3.0)) evalúa a 0.14112 .

Dado que los formularios de Lisp tienen una representación de datos, generalmente se escriben utilizando la representación de datos externos de Lisp, ¿cuál es qué? - s-expresiones!

Es s-expresiones. Las formas Lisp como datos Lisp se escriben externamente como expresión-s.


Primero, no todas las expresiones S representan listas; una expresión como foobar , que representa un átomo desnudo, también se considera una expresión-S. Como es la sintaxis de "celda de contras", (car . cons) , se utiliza cuando la parte de "contras" no es otra lista (o nula). La expresión de lista más familiar, como (abcd) , es simplemente azúcar sintáctica para una cadena de células de contras anidadas; ese ejemplo se expande a (a . (b . (c . (d . nil)))) .

Segundo, el término "expresión-S" se refiere a la sintaxis - (items like this (possibly nested)) . Dicha expresión S es la representación en el código fuente de Lisp de una lista, pero técnicamente no es una lista en sí misma. Esta distinción es la misma que entre una secuencia de dígitos decimales y su valor numérico, o entre una secuencia de caracteres entre comillas y la cadena resultante.

Esa es quizás una distinción demasiado técnica; los programadores se refieren rutinariamente a las representaciones literales de los valores como si fueran los mismos valores. Pero con Lisp y las listas, las cosas se complican un poco porque todo en un programa Lisp es técnicamente una lista.

Por ejemplo, considera esta expresión:

(+ 1 2)

Lo anterior es una expresión en S directa que representa una lista plana, que consta de los átomos + , 1 y 2 .

Sin embargo, dentro de un programa Lisp, esta lista se interpretará como una llamada a la función + con 1 y 2 como argumentos. (Tenga en cuenta que es la lista , no la expresión S , que se interpreta así; al evaluador se le entregan las listas que han sido analizadas previamente por el lector, no el texto del código fuente).

Por lo tanto, si bien la expresión S anterior representa una lista, rara vez se denominaría "lista" en el contexto de un programa Lisp. A menos que se discutan las macros, o el funcionamiento interno del lector, o se involucre en una discusión metasintáctica debido a algún otro contexto de generación de código o análisis, un programador Lisp típico trataría lo anterior como una expresión numérica.

Por otro lado, cualquiera de las siguientes expresiones S probablemente se denominaría "listas", ya que evaluarlas como código Lisp produciría la lista representada por la expresión S literal anterior como un valor de tiempo de ejecución:

''(+ 1 2) (quote (+ 1 2)) (list ''+ 1 2)

Por supuesto, la equivalencia de código y datos es una de las cosas interesantes de Lisp, por lo que la distinción es fluida. Pero lo que quiero decir es que, si bien todas las anteriores son expresiones en S y listas, solo algunas se denominarán "listas" en el lenguaje informal de Lisp.