Common Lisp

Common Lisp

El Common Lisp, puede ser implementado por medio de JAVA. CLISP comúnmente abreviado como TL, es un dialecto del lenguaje de programación Lisp, publicado en el documento estándar ANSI INCITS 226-1994 (R2004) del ANSI, (antes X3.226-1994 (R1999)).[1] Desarrollado para estandardizar las variantes divergentes del Lisp (aunque principalmente las variantes de MacLisp) que lo precedió, no es una implementación sino una especificación del lenguaje. Están disponibles varias implementaciones del estándar del Common Lisp, incluyendo la de software libre y de código abierto y productos propietarios.

El Common Lisp es un lenguaje multi paradigma de propósitos generales. Soporta una combinación de paradigmas de programación como procedimental (imperativo), funcional, y orientada al objeto. Como un lenguaje de programación dinámica, facilita el desarrollo de software de una manera evolutiva e incremental, con la compilación iterativa en programas eficientes en tiempo de ejecución.

El Common Lisp incluye al CLOS, un sistema de objetos que soporta multimétodos y combinaciones de métodos. Es extensible a través de características estándar tales como macros de Lisp (rearreglo del código en tiempo de compilación logrado por el programa en sí mismo) y macros de lectura (extensión de la sintaxis para dar un significado especial a los caracteres reservados para los usuarios con este propósito).

Contenido

Sintaxis

El Common Lisp es un dialecto de Lisp; usa expresiones S para denotar tanto el código como la estructura de datos. Las funciones y la llamadas a macros son escritas como listas, con el nombre de la función primero, como en estos ejemplos:

 (+ 2 2)           ; suma 2 más 2, dando como resultado 4.
 (defvar *x*)      ; Se asegura de que exista una variable *x*,
                   ; sin darle un valor. Los asteriscos son parte del nombre.
                   ; El símbolo "x" también es dotado con
                   ; la propiedad de que los enlaces (binding) subsecuentes
                   ; de ella son dinámicos en vez de léxicos.
 (setf *x* 42.1)   ; Fija la variable *x* al valor 42.1 de punto flotante
 ;; Define la función que calcula el cuadrado de un número:
 (defun cuadrado (x) 
   (* x x))
 ;; Ejecuta la función:
 (cuadrado 3)        ; Retorna 9
 ;; El constructor del 'let' crea un ámbito para variables locales.
 ;; Aquí the variable 'a' está enlazada (bound) a 6 y la variable 'b' está enlazada a 4.
 ;; Dentro de 'let' hay un 'cuerpo' donde el último valor computado es retornado.
 ;; Aquí, el resultado de sumar a y b es retornado desde la expresión 'let'.
 ;; Las variables a y b tienen ámbitos léxicos a menos que los símbolos hayan sido
 ;; marcados como variables especiales (por ejemplo por un DEFVAR anterior). 
 (let ((a 6)
       (b 4)) 
   (+ a b))        ; retorna 10

Tipos de datos

El Common Lisp tiene muchos tipos de datos, más que muchos otros lenguajes.

Tipos escalares

Los tipos numéricos incluyen números enteros, cocientes, números de punto flotante, y números complejos.[2] El Common Lisp usa bignums para representar valores numéricos de tamaño y precisión arbitrarios. El tipo cociente representa fracciones exactamente, una facilidad no disponible en muchos lenguajes. El Common Lisp fuerza automáticamente a los valores numéricos entre estos tipos a medida que sean apropiados.

El tipo caracter del Common Lisp no se limita a los caracteres ASCII. La mayoría de las implementaciones modernas permiten los caracteres de Unicode.[3]

El tipo símbolo es común a los lenguajes Common Lisp, pero largamente desconocido fuera de ellos. Un símbolo es un único, objeto de datos con nombre que tiene varias partes: nombre, valor, función, lista y paquete. De éstos, la celda del valor y la celda de la función son los más importantes. Los símbolos en Lisp son frecuente usados similarmente a los identificadores en otros lenguajes: para contener el valor de una variable; sin embargo, hay muchas otros usos. Normalmente, cuando un símbolo es evaluado, su valor es retornado. Algunos símbolos se evalúan a sí mismos, por ejemplo todos los símbolos en un paquete de palabra clave son autoevaluados. Los valores boleano en el Common Lisp son representados por los símbolos autoevaluantes T y NIL. El Common Lisp tiene espacios de nombres para símbolos, llamados "paquetes”.

Estructuras de datos

Los tipos de secuencia en Common Lisp incluye listas, vectores, vectores-bit, y strings. Hay muchas operaciones que pueden trabajar en cualquier tipo de secuencia.

Como en casi todos los otros dialectos Lisp, las listas en el Common Lisp están compuestas de conses, a veces llamados celdas cons o pares. Un cons es una estructura de datos con dos slots, llamados sus car y cdr. Una lista es una cadena enlazada de conses. Cada car del cons refiere a un miembro de la lista (posiblemente otra lista). Cada cdr del cons refiere al cons siguiente -- a excepción del último cons, cuyo cdr refiere al valor nil. Los conses también pueden fácilmente usarse para implementar árboles y otras estructuras de datos complejas; aunque generalmente es aconsejado usar instancias de clases y estructuras. También es posible crear estructuras de datos circulares con los conses.

Common Lisp soporta arreglos multidimensionales, y puede redimensionar los arreglos dinámicamente si fuera necesario. Los arreglos multidimensionales pueden ser usados para metemática de matrices. Un vector es un arreglo unidimensional. Los arreglos pueden tener cualquier tipo como miembros (incluso tipos mezclados en el mismo arreglo) o pueden estar especializados para contener un tipo específico de miembros, como en un vector de enteros. Muchas implementaciones pueden optimizar funciones de arreglo cuando el arreglo usado es de un tipo específico. Dos tipos de arreglo están estandarizados: un string es un vector de caracteres, mientras que un vector-bit es un vector de bits.

Las tablas hash almacenan asociaciones entre objetos de datos. Cualquier objeto puede ser usado como clave o valor. Las tablas de hash, al igual que los arreglos, son redimensionadas automáticamente a medida que se necesite.

Los paquetes son colecciones de símbolos, usados principalmente para separar las partes de un programa en espacios de nombres. Un paquete puede exportar algunos símbolos, marcándolos como parte de una interface pública. Los paquetes pueden usar otros paquetes.

Las estructuras, similares en uso a los structs de C y a los records de Pascal, representan estructuras de datos arbitrariamente complejas con cualquier número y tipo de campos (llamados slots). Las estructuras permiten herencia simple.

Las clases son similares a las estructuras, pero ofrecen características más dinámicas y herencia múltiple. (Ver CLOS). Las clases han sido agregadas tarde al Common Lisp y hay un cierto solapamiento conceptual con las estructuras. Los objetos creados de clases son llamados instancias. Un caso especial son las funciones genéricas. Las funciones genéricas son tanto funciones como instancias.

Funciones

Common Lisp soporta las funciones de primera clase. Por ejemplo, es posible escribir funciones que toman otras funciones como argumentos o también retornen funciones. Esto hace posible describir operaciones muy generales.

La biblioteca de Common Lisp confía fuertemente en tales funciones del alto orden. Por ejemplo, la función función sort toma un operador relacional como un argumento y una función clave como un argumento opcional de palabra clave. Esto puede ser usado no sólo para clasificar cualquier tipo de datos, pero también para clasificar las estructuras de datos de acuerdo a una clave.

 (sort (list 5 2 6 3 1 4) #'>)
 ; Ordena la lista usando la función > como el operador relacional.
 ; Returns (6 5 4 3 2 1).
 (sort (list '(9 A) '(3 B) '(4 C)) #'< :key #'first)
 ; Ordena la lista de acuerdo al primer elemento de cada sublista.
 ; Returns ((3 B) (4 C) (9 A)).

El modelo de evaluación para las funciones es muy simple. Cuando el evaluador encuentra una forma (F A1 A2…) entonces se asume que el símbolo nombrado F es uno de los siguientes:

  1. Un operador especial (fácilmente comprobado contra una lista fija)
  2. Un macro operador (debe haber sido definido previamente)
  3. El nombre de una función (por defecto), que puede ser un símbolo, o un principio de subforma con el símbolo lambda.

Si F es el nombre de una función, después las argumentos A1, A2,…, son evaluados en orden de izquierda a derecha, y la función es encontrada e invocada con esos valores suministrados como parámetros.

Ámbito

Como en los programas en muchos otros lenguajes de programación, Los programas Common Lisp hacen uso de nombres para referirse a las variables, funciones, y a muchas otras clases de entidades. Las referencias de nombres están conforme a un ámbito.

La asociación entre un nombre y la entidad a la que el nombre se refiere se llama binding (enlace, enlazamiento).

El ámbito se refiere al conjunto de las circunstancias en las cuales un nombre es determinado para tener un enlace particular.

Determinantes del ámbito

Las circunstancias que determinan el ámbito en el Common Lisp incluyen:

  • La localización de una referencia dentro de una expresión. Si es la posición extrema izquierda de una composición, se refiere a un enlace (binding) de un operador especial o un macro o una función, si no a un enlace de variable o alguna otra cosa.
  • La clase de expresión en la cual la referencia ocurre. Por ejemplo, (GO X) significa transferir el control a la etiqueta X, mientras que (PRINT X) se refiere a la variable X. Ambos ámbitos de X pueden estar activos en la misma región del texto del programa, puesto que las etiquetas tagbody están en un espacio de nombre separado de los nombres de variables. Una forma especial o la forma de macro tiene completo control sobre los significados de todos los símbolos en su sintaxis. Por ejemplo en (defclass x (a b) ()), una definición de clase, el (a b) es una lista de clases base, así que estos nombres son buscados en el espacio de nombres de clases, y x no es una referencia a un binding (enlace) existente, sino el nombre de una nueva clase que es derivada de a y b. Estos hechos emergen puramente de la semántica de defclass. El único hecho genérico sobre esta expresión es que los defclass se refieren a un enlace (binding) de macro; todo lo demás es dejado a defclass.
  • La localización de la referencia dentro del texto del programa. Por ejemplo, si una referencia a la variable X es envuelta en una construcción binding como un LET que define un binding para X, entonces la referencia está en el ámbito creado por ese binding.
  • Para una referencia de variable, independientemente de si el símbolo de variable ha sido local o globalmente declarado como especial. Esto determina si la referencia está resuelta dentro de un ambiente léxico, o dentro de un ambiente dinámico.
  • La instancia específica del ambiente en el cual la referencia es resuelta. Un ambiente es un diccionario de tiempo de ejecución (run-time) que mapea los símbolos con los enlaces (bindings). Cada tipo de referencia usa sus propio tipo de ambiente. Las referencias a las variables léxicas son resueltas en un ambiente léxico, etcétera. Más de un ambiente puede estar asociado con la misma referencia. Por ejemplo, gracias a la recursión o al uso de múltiples hilos (multithreads), pueden existir al mismo tiempo múltiples activaciones de la misma función. Estas activaciones comparten el mismo texto del programa, pero cada una tiene su propia instancia de ambiente léxico.

Para entender a lo que hace referencia un símbolo, el programador de Common Lisp debe saber que tipo de referencia está siendo expresada, que tipo de ámbito es usado en caso de ser una referencia variable (ámbito dinámico versus léxico), y también la situación en tiempo de ejecución: en qué ambiente es resuelta la referencia, donde estaba el binding introducido en el ambiente, etcétera.

Macros

En Lisp un macro se asemeja superficialmente a una función en uso. Sin embargo, en vez de representar una expresión que es evaluada, representa una transformación del código fuente del programa.

Los macros permiten a los programadores Lisp crear nuevas formas sintácticas en el lenguaje. Por ejemplo, este macro proporciona la forma del loop until, que puede ser familiar para lenguajes como Perl:

 (defmacro until (test &body body)
   `(do ()
        (,test)
      ,@body))
 
 ;; ejemplo
 (until (= (random 10) 0) 
   (write-line "Hola"))

Todos los macros deben ser expandidos antes de que el código fuente que los contiene pueda ser evaluado o compilado normalmente. Las macros pueden ser considerados como funciones que aceptan y retornan árboles de sintaxis abstracta (expresiones-S de Lisp). Estas funciones son invocadas antes del evaluador o del compilador para producir el código fuente final. Los macros son escritos en Common Lisp normal, y pueden usar cualquier operador disponible del Common Lisp (o de terceros). La notación de backquote usada arriba es proporcionada por el Common Lisp específicamente para simplificar el caso común de la substitución en una plantilla de código.

Sistema de objetos del Common Lisp

Artículo principal: Common Lisp Object System

El Common Lisp incluye un juego de herramientas (toolkit) para la programación orientada a objetos, el Common Lisp Object System o CLOS, que es uno de los sistemas de objetos más poderosos disponible en cualquier lenguaje. Originalmente propuesto como un add-on, el CLOS fue adoptado como parte del estándar ANSI del Common Lisp. CLOS es un sistema de objetos dinámico con despacho múltiple y herencia múltiple, y se diferencia radicalmente de las facilidades de programación orientada a objetos (OOP) encontradas en lenguajes estáticos como C++ o Java. Como sistema de objetos dinámico, CLOS permite cambios en tiempo de ejecución a las funciones y clases genéricas. Los métodos pueden ser agregados y removidos, las clases pueden ser agregadas y redefinidas, los objetos pueden ser actualizados para los cambios de la clase y la clase de objetos puede ser cambiada.

El CLOS se ha integrado en el ANSI Common Lisp. Las funciones genéricas pueden ser usadas como las funciones normales y son un tipo de datos de primera clase. Cada clase del CLOS está integrada en el sistema de tipos del Common Lisp. Mucho tipos del Common Lisp tienen una clase correspondiente. Hay más uso potencial del CLOS para el Common Lisp. La especificación no dice si las condiciones son implementadas con el CLOS. Los pathnames (nombres de ruta) y los streams (flujos) pueden ser implementados con el CLOS. Estas futuras posibilidades del uso de CLOS para el ANSI Common Lisp no son parte del estándar. Las implementaciones reales del Common Lisp están usando el CLOS para los pathnames, streams, condiciones de entrada/salida, la implementación del CLOS en sí mismo y más.

Aplicaciones

Common Lisp es usado para desarrollar aplicaciones de investigación (frecuentemente en inteligencia artificial), en el desarrollo rápido de prototipos o para desplegar aplicaciones.

Common Lisp es usado en muchas aplicaciones comerciales, incluyendo el sitio de comercio web Yahoo! Store, que originalmente implicó a Paul Graham y fue posteriormente reescrito en C++ y el Perl.[4] Otros ejemplos notables incluyen:

  • El Dynamic Analysis and Replanning Tool (DART), que se dice que ¿¿por sí solo ha retornado los costos?? durante los años de 1991 a 1995 por los treinta años de inversiones de DARPA en la investigación de la Inteligencia Artificial.
  • El entorno de desarrollo para los juegos de video de Jak and Daxter para el Playstation 2 escrito por Naughty Dog
  • El motor de búsqueda para tarifas bajas de ITA software, usado por sitios web de viajes como Orbitz y Kayak.com y líneas aéreas como American Airlines, Continental Airlines y US Airways.

También existen aplicaciones de fuente abierta escritas en Common Lisp, como por ejemplo:

  • ACL2, un demostrador de teoremas de características completas para una variante aplicativa del Common Lisp.
  • Maxima, un sofisticado sistema algebraico computacional.
  • OpenMusic es un ambiente de programación visual orientado a objetos basado en Common Lisp, usado en la composición asistida por computador.
  • Stumpwm, un X11 Window Manager embaldosado (con ventanas que no se solapan), manejado por teclado, escrito enteramente en Common Lisp.

Véase también

Referencias

  1. Document page at ANSI website
  2. Reddy, Abhishek (22-08-2008). «Features of Common Lisp».
  3. «Unicode support». The Common Lisp Wiki. Consultado el 21-08-2008.
  4. "In January 2003, Yahoo released a new version of the editor written in C++ and Perl. It's hard to say whether the program is no longer written in Lisp, though, because to translate this program into C++ they literally had to write a Lisp interpreter: the source files of all the page-generating templates are still, as far as I know, Lisp code." Paul Graham, Beating the Averages

Enlaces externos

Wikilibros


Wikimedia foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Mira otros diccionarios:

  • Common Lisp — Paradigm(s) Multi paradigm: procedural, functional, object oriented, meta, reflective, generic Appeared in 1984, 1994 for ANSI Common Lisp Developer ANSI X3J13 committee Typing discipline …   Wikipedia

  • Common-Lisp — Inoffizielles Lisp Logo Basisdaten Paradigmen: multiparadigmatisch: funktional, prozedural …   Deutsch Wikipedia

  • Common LISP — Inoffizielles Lisp Logo Basisdaten Paradigmen: multiparadigmatisch: funktional, prozedural …   Deutsch Wikipedia

  • Common Lisp — Inoffizielles Lisp Logo Basisdaten Paradigmen: multiparadigmatisch: funktional, prozedural, modular, objektorientiert …   Deutsch Wikipedia

  • Common Lisp — est un langage fonctionnel impur de la famille Lisp. Sommaire 1 Introduction 2 Syntaxe 3 Types de données 3.1 Types scalaires …   Wikipédia en Français

  • Common Lisp — Семантика: мультипарадигмальный: объектно ориентированный, функциональный, императивный, метаязык Тип исполнения: компилируемый Появился в: 1984, стандартизирован ANSI в 1994 …   Википедия

  • Common Lisp the Language — is an influential book by Guy L. Steele about Common Lisp. Contents 1 History 1.1 Before standardization 1.2 During standardization 1.3 A …   Wikipedia

  • Common lisp object system — Cette page est considérée comme un article à approfondir. Le Common Lisp Object System, souvent abrégé en CLOS (prononcé si lauss ), est l ensemble des primitives présentes dans le langage de programmation Common Lisp pour construire un programme …   Wikipédia en Français

  • Common Lisp HyperSpec — (CLHS) гипертекстовая версия стандарта ANSI Common Lisp. Кроме самого стандарта содержит ряд дополнительных материалов комитета NCITS/J13 по стандартизации Common Lisp. CLHS является собственностью компании Lisp Works Ltd. и создан с разрешения… …   Википедия

  • Common Lisp FullScreen Window Manager — Dernière version 1106 [ …   Wikipédia en Français

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”