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 .
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 ).
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.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.
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.
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 funcionesLa 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).
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]
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) |
ceceo común | |||||||
---|---|---|---|---|---|---|---|
Implementaciones |
| ||||||
Software |
| ||||||
Publicaciones |
| ||||||
comité de diseño |
| ||||||
Otro |
|
Ceceo | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Características |
| ||||||||||||||
Implementaciones |
| ||||||||||||||
Hardware |
| ||||||||||||||
Comunidad |
| ||||||||||||||
|
Lenguajes de programación | |
---|---|
|