Ceceo común

ceceo común
Semántica multi- paradigma : orientado a objetos , funcional , imperativo , metalenguaje
clase de idioma lenguaje de programación , lenguaje de programación procedimental , lenguaje de programación orientado a objetos , lenguaje de programación funcional y lenguaje de programación multiparadigma
tipo de ejecución compilado
Apareció en 1984 , estandarizado por ANSI en 1994
Autor Comité X3J13
Desarrollador X3J13 _
sistema de tipos fuerte , dinámico , con declaraciones de tipo opcionales
Implementaciones principales Allegro Common Lisp , ABCL , CLISP , Clozure CL , CMUCL , Corman Common Lisp , ECL , LispWorks , Scieneer CL , SBCL
sido influenciado Lisp , Máquina Lisp Lisp , MacLisp , InterLisp , Esquema
influenciado Clojure , Factor , Dylan , EuLisp , ISLisp , SKILL , Stella , SubL
Sitio web common-lisp.net
 Archivos multimedia en Wikimedia Commons

Common Lisp (abreviado como CL ) es un dialecto del lenguaje de programación Lisp estandarizado por ANSI [1] . Fue desarrollado con el objetivo de unir los dispares dialectos de Lisp en la época de principios de la década de 1980; Varias implementaciones de Common Lisp están disponibles, tanto comerciales como gratuitas .

El estándar fija el lenguaje como multi- paradigma : se admite una combinación de programación procedimental , funcional y orientada a objetos . En particular, la programación orientada a objetos es proporcionada por el sistema CLOS del lenguaje ; y el sistema de macros Lisp permite introducir nuevas construcciones sintácticas en el lenguaje, utilizar las técnicas de metaprogramación y programación genérica .

Historia

El trabajo en el dialecto comenzó en 1981 por sugerencia del gerente de DARPA , Bob Engelmore.

El desarrollo se coordinó por correo electrónico y la estructura original del lenguaje se modificó sustancialmente a medida que avanza. Guy Lewis Steele presentó la primera descripción general del desarrollo del estándar en el Simposio ACM sobre Lisp y programación funcional en 1982, y el primer documento sobre el lenguaje se publicó en 1984 ("The Common Lisp Language, First Edition"). La segunda edición, lanzada en 1990, incluyó muchos cambios realizados por ANSI al lenguaje durante el proceso de estandarización. La versión final de la norma se publicó en 1994.

A partir de 2018, no se han publicado actualizaciones del estándar, y las implementaciones y bibliotecas (muchas disponibles a través de Quicklisp ) proporcionan varias extensiones y mejoras a Common Lisp (como compatibilidad con Unicode, simultaneidad, E/S basadas en CLOS ).

Sintaxis

Common Lisp usa expresiones S para denotar tanto el código como los datos . Las llamadas a funciones y macros son listas , donde el primer elemento, o el encabezado de la lista, es el nombre de la función, y el resto, la "cola" de la lista, son los argumentos .

( + 2 2 ) ; suma 2 y 2, devolviendo el resultado 4. ( - 8 3 ) ; resta tres de ocho, devolviendo el resultado 5. ( al revés "¡Hola, mundo!" ) ; invierte la cadena, devolviendo ""!rome ,yuvtswardZ"" ;; definiciones de variables y funciones: ( defvar *x* ) ; Define la variable *x* sin asignar ninguna ; valores. Dos asteriscos que forman parte del nombre - aceptado ; estándar para nombrar variables globales. ( setf *x* 42.1 ) ; asigna el valor de coma flotante 42.1 a la variable *x*. ( defun square ( x ) ; Definiendo un cuadrado de función que toma un argumento ( * x x )) ; y devolviendo su plaza. ( cuadrado *x* ) ; llama a la función cuadrada, pasándole el valor de *x* ; y devuelve su cuadrado (1772.41). ( sea (( a 3 )( b 4 )) ( + a b )) ; La forma especial let crea variables locales, les asigna valores ; (en este caso, a la variable a se le asigna el valor 3, y b - 4), ; luego calcula y devuelve el resultado de la función ; (en este caso 7). Las variables son locales, por lo tanto ; intentar evaluar un valor (+ ab) fuera del cuerpo let dará como resultado un error.

Tipos de datos

Tipos escalares

Los tipos numéricos incluyen enteros , fracciones , números de punto flotante y números complejos [2] . Common Lisp hace posible el uso de números grandes para representar cualquier cantidad con mayor precisión.

Los caracteres en Common Lisp no están limitados a ASCII , la mayoría de las implementaciones modernas soportan Unicode .

El concepto de símbolo, que prácticamente no se usa de esta forma en otros lenguajes, es uno de los claves, es un objeto único de datos, que incluye: nombre, valor, función, lista de propiedades y paquete (namespace). Los símbolos en Lisp a menudo se usan de la misma manera que los identificadores en otros idiomas: para almacenar el valor de una variable. Sin embargo, tienen muchos otros usos. Por lo general, cuando se asigna un valor a un símbolo, se le devuelve inmediatamente. Algunos símbolos se asignan un valor a sí mismos, por ejemplo, los valores booleanos se representan como dos símbolos autodefinidos Ty NIL.

Hay varias funciones para redondear tipos escalares de diferentes maneras. La función roundredondea el argumento al entero más cercano, y si el número está "en el medio", entonces al número par más cercano. La función truncateredondea los números hacia cero. Las funciones floory ceilingredondean al número inferior y superior más cercano, respectivamente. Todas las funciones devuelven la parte fraccionaria como resultado secundario.

Estructuras de datos

Las secuencias en Common Lisp son listas, vectores, vectores de bits y cadenas. Hay muchas operaciones que pueden funcionar con cualquier tipo de secuencia.

Como casi todos los demás dialectos de Lisp, las listas en Common Lisp se componen de pares punteados ( conses ). cons es una estructura de datos con dos ranuras: cary cdr. La lista es una cadena conectada de pares punteados (o puede estar vacía). carcada par se refiere a un elemento de una lista (posiblemente otra lista). cdrcada par está referenciado por el siguiente par, excepto por el último par de la lista, cuyo cdrvalor es nil. Los pares de puntos también se pueden usar fácilmente para implementar árboles y otras estructuras de datos complejas; aunque generalmente se recomienda usar estructuras o instancias de clase en su lugar. También es posible crear una estructura de datos circular con pares punteados.

Common Lisp admite matrices multidimensionales y puede cambiar dinámicamente el tamaño de las matrices ajustables según sea necesario. Las matrices multidimensionales se pueden utilizar para cálculos de matrices. Un vector es un arreglo unidimensional. Las matrices pueden contener cualquier tipo como elemento (incluso mezclar diferentes tipos en la misma matriz) o pueden especializarse para contener solo un tipo específico. Por lo general, solo se admiten algunos tipos. Muchas implementaciones pueden optimizar funciones de matriz cuando la matriz está especializada en tipos. Hay dos matrices estándar especializadas en tipos: una cadena, que es un vector de caracteres ( char), y un vector de bits .

Una tabla hash almacena un mapeo entre objetos. Cualquier objeto se puede utilizar como clave o valor. Las tablas hash cambian de tamaño automáticamente según sea necesario.

Los paquetes  son colecciones de símbolos que se utilizan principalmente para separar partes de un programa en espacios de nombres . Un paquete puede exportar algunos símbolos marcándolos como parte de la interfaz pública. Los paquetes pueden usar otros paquetes.

Las estructuras , similares a las estructuras en C y los registros en Pascal , representan estructuras de datos complejas arbitrarias con cualquier número y tipo de campos (llamados ranuras ). Las estructuras permiten herencia simple.

Las clases , parte del  sistema de objetos CLOS , son similares a las estructuras, pero proporcionan herencia múltiple y un comportamiento más dinámico. Las clases se agregaron tarde a Common Lisp y, de alguna manera, se superponen conceptualmente a las estructuras. Los objetos creados a partir de clases se denominan instancias. Un caso especial son las funciones genéricas que son tanto funciones como instancias.

Funciones

Common Lisp admite funciones de primera clase . Por ejemplo, puede escribir funciones que toman otras funciones como argumentos o funciones de retorno.

La biblioteca Common Lisp depende en gran medida de tales funciones. Por ejemplo, la función sorttoma una función de comparación y, opcionalmente, una función clave para clasificar las estructuras de datos según la clave.

;; Ordena la lista usando las funciones > y <. ( ordenar ( lista 5 2 6 3 1 4 ) #' > ) ; devuelve (6 5 4 3 2 1) ( ordenar ( listar 5 2 6 3 1 4 ) #' < ) ; devuelve (1 2 3 4 5 6) ;; Ordena la lista por los primeros elementos de las sublistas. ( ordenar ( listar ' ( 9A ) ' ( 3B ) ' ( 4C ) ) # ' < :clave # ' primero ) ; devuelve ((3 B) (4 C) (9 A)) Definiciones de funciones

La macro defundefine una función. defunacepta un nombre de función, nombres de parámetros y un cuerpo de función:

( cuadrado defun ( x ) ( * x x ))

Las definiciones de funciones pueden incluir directivas de compilación , conocidas como eng.  declaraciones , que dan pistas al compilador sobre optimizaciones o tipos de argumentos. También se pueden agregar cadenas de documentación ( docstrings ) , que Lisp puede usar para proporcionar documentación:

( defun square ( x ) "Calcula el cuadrado de la x de un solo flotador." ( declare ( de un solo flotador x ) ( optimice ( velocidad 3 ) ( debug 0 ) ( seguridad 1 ))) ( la de un solo flotador ( * x x )))

Las funciones anónimas se definen con lambda, por ejemplo, (lambda (x) (* x x)) la función de elevar al cuadrado. El estilo de programación Lisp implica el uso frecuente de funciones de orden superior, a las que es conveniente pasar funciones anónimas como argumentos.

Las funciones locales se pueden declarar con flety labels.

( plano (( cuadrado ( x ) ( * x x ))) ( cuadrado 3 ))

Hay varios otros operadores relacionados con la definición y manipulación de funciones. Por ejemplo, las funciones se pueden compilar con compileun operador. (Algunos sistemas Lisp ejecutan funciones usando el intérprete predeterminado a menos que se especifique compilar; otros compilan cada función).

Implementaciones

Common Lisp se diferencia de lenguajes como C# , Java , Perl , Python en que está definido por su propio estándar y no existe una implementación única o canónica del mismo. Cualquiera puede leer el estándar y crear su propia implementación. Common Lisp reconoce automáticamente estos tipos como iguales. [3]

Tabla comparativa de las principales implementaciones [4] [5]
Nombre Plataformas compatibles Compilacion Capacidades Licencia
CLIP [6] Windows , Mac , *nix Código de bytes , JIT Tamaño de imagen pequeño del sistema lisp. Aritmética de enteros largos muy eficiente. Capacidad para crear archivos ejecutables. FFI (interfaz para llamar a funciones de bajo nivel (funciones de bibliotecas escritas en C, etc.) y para operar con memoria "no administrada"). Funciones de callback (integración con código de plataforma "nativa"). GNU GPL
CMUCL [7] Linux , FreeBSD , Solaris , Darwin código de bytes, código de máquina Compilador de alta calidad para código máquina. FFI. Funciones de callback (integración con código de plataforma "nativa"). Dominio público con partes bajo Licencia BSD
ECL Windows, * nix, Mac OS X Código de bytes, código de máquina a través de C Buena integración con programas C y con código de plataforma ejecutable directamente (FFI, funciones de devolución de llamada, la capacidad de crear bibliotecas estáticas y dinámicas binarias). Capacidad para crear archivos ejecutables. Multiproceso en todas las plataformas compatibles. GNU GPL con partes bajo otras licencias
Clozure CL (antes OpenMCL) [8] Linux/PPC, Linux/X86-64, Darwin/PPC, Darwin/X86-64, FreeBSD/X86-64, Windows codigo de maquina Compilador rápido. FFI potente y conveniente. Funciones de callback (integración con código binario de la plataforma). Capacidad para crear archivos ejecutables. Multiproceso en todas las plataformas compatibles. LGPL
SBCL [9] Linux, BSD , Solaris, Mac OS X (Darwin), Windows (experimental) codigo de maquina Compilador avanzado a código máquina. Capacidad para crear archivos ejecutables. FFI. Funciones de callback (integración con código binario de la plataforma). Multihilo en Linux, Solaris 10 y Mac OS X. Dominio público con partes bajo Licencia MIT y Licencia BSD
ABC [10] JVM código de bytes JVM Interfaz a la plataforma Java. Multiproceso. Independencia de la plataforma. LGPL
Allegro ceceo común [11] Windows, Unix , Linux, Mac OS X codigo de maquina Comercial, demostración limitada disponible
LispWorks [12] Windows, * nix, Mac OS X codigo de maquina IDE desarrollado. CAPI es una biblioteca para crear una interfaz de usuario. Buena integración con programas C y con código de plataforma "nativo" (FFI, funciones de devolución de llamada, la capacidad de crear bibliotecas dinámicas y estáticas nativas para la plataforma). Capacidad para crear archivos ejecutables. Multiproceso en todas las plataformas compatibles. Comercial, demostración limitada disponible
Ceceo común de Corman ventanas codigo de maquina Desde 2015 - Licencia MIT . Distribuido originalmente como Shareware, con el código fuente del sistema disponible (excluyendo IDE)

Notas

  1. ANSI INCITS 226-1994 (R2004) , anteriormente X3.226-1994 (R1999)
  2. Funciones de Common Lisp Archivado el 26 de diciembre de 2009.
  3. Lisp es un lenguaje de programación programable. . Consultado el 24 de abril de 2010. Archivado desde el original el 12 de septiembre de 2009.
  4. Lista de las principales implementaciones de Common Lisp . Consultado el 15 de mayo de 2007. Archivado desde el original el 1 de mayo de 2007.
  5. Implementaciones de Lisp Archivado el 4 de julio de 2008.
  6. [ GNU CLISP  ] . . Consultado el 24 de abril de 2010. Archivado desde el original el 16 de marzo de 2010. GNU CLISP  . ]
  7. CMUCL . Consultado el 15 de mayo de 2007. Archivado desde el original el 30 de octubre de 2005.
  8. Clozure CL Consultado el 10 de junio de 2008. Archivado desde el original el 5 de marzo de 2018.
  9. [ Lisp común de Steel Bank  ] . Consultado el 24 de abril de 2010. Archivado desde el original el 6 de junio de 2004. Ceceo común  de Steel Bank
  10. Armed Bear Common Lisp (enlace descendente) . Consultado el 10 de junio de 2008. Archivado desde el original el 29 de marzo de 2007. 
  11. [ Allegro CL - desarrollado por Franz Inc. (Inglés) . Consultado el 24 de abril de 2010. Archivado desde el original el 18 de junio de 2020. Allegro CL es un desarrollador de Franz Inc. (inglés) ]
  12. LispWorks Archivado el 2 de junio de 2007 en Wayback Machine . Desarrollador - LispWorks, LLC (anteriormente Xanalys, Inc.)

Enlaces