El lenguaje LE-LISP opera con objetos llamados expresiones simbólicas o más brevemente S-expresiones, que se pueden clasificar como sigue:
Son identificadores que nombran variables, funciones o etiquetas. LE-LISP representa un símbolo como un puntero a un descriptor localizado en una zona especial de memoria. Cada descriptor tiene las siguientes propiedades intrínsecas:
No es aconsejable que el usuario manipule directamente las propiedades intrínsecas de los símbolos.
LE-LISP utiliza enteros de 16 bits, mientras que los números en coma flotante se representan utilizando 31, 32 48 o 64 bits, dependiendo de la implementación concreta. También incorpora bibliotecas para la manipulación de números de precisión arbitraria.
Se representan externamente encerrando entre comillas los caracteres que los componen. Si la cadena contiene en sí misma el carácter de las comillas, éste se consigue insertando dos comillas consecutivas en la posición adecuada de la cadena.
El tipo de una cadena de caracteres es string por defecto, aunque puede cambiarse a voluntad mediante el uso de la función typestring.
LE-LISP utiliza para representar las listas el formalismo estándar del CAR y del CDR. Brevemente, diremos que el primer elemento de una lista constituye su CAR, mientras que el resto de la lista constituye el CDR. La función cons se utiliza para construir listas, de modo que (cons car cdr) construye la lista que tiene como CAR a car y como CDR a cdr.
Las listas se representan encerrando sus elementos entre paréntesis, separando
los distintos componentes, que pueden ser de tipos diferentes,
mediante espacios. La
notación especial del par punteado, como por ejemplo (1 . "pepe"),
se utiliza cuando el CDR es un átomo.
La lista vacía está identificada con el átomo NIL. Entre otras consecuencias, esto implica que NIL se puede considerar al mismo tiempo como:
En relación al tercer caso, diremos que cualquier objeto LE-LISP distinto
de NIL se considera, desde el punto de vista de su valor lógico,
como verdadero. Si no se pone una quote
delante de una lista, se entiende que su primer
elemento es una función que toma como argumentos los siguientes elementos de
la lista.
Se corresponde con el tipo de los arrays unidimensionales que poseen la mayoría de los lenguajes de programación. Un vector es una colección de objetos LE-LISP a los cuales se puede acceder por medio de un índice, su posición en el vector, teniendo en cuenta que el primer elemento ocupa la posición 0. El tipo por defecto de un vector es vector, pero puede ser cambiado a voluntad de modo similar a como acurría en el caso de las cadenas de caracteres, pero utilizando en este caso la función vector.
Los vectores se representan de la forma ,
donde los
representan S-expresiones. El acceso a los elementos de un
vector es muy rápido, aunque en las implementaciones de LE-LISP el número
de elementos de un vector está limitado a 32767. Los vectores se almacenan en
una zona especial de la memoria que se compacta
dinamicamente mediante un algoritmo de garbage collection
que es lineal en tiempo.
Como el valor de un vector es el vector en sí mismo, no hay necesiad de utilizar la quote como en las listas. Aunque los vectores son unidimensionales, como un vector es a su vez una S-expresión, sí están permitidos los vectores de vectores.