fbpx
Wikipedia

Common Lisp

Common Lisp es un lenguaje de programación que pertenece a la familia de lenguajes Lisp. Se encuentra descrito en el documento estándar ANSI INCITS 226-1994 (R2004) del ANSI, (antes X3.226-1994 (R1999)).[1]​ Desarrollado para estandarizar 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 de Common Lisp, incluyendo la de software libre y de código abierto y productos propietarios.

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.

Common Lisp incluye al CLOS, un sistema de objetos que soporta multimétodos y combinaciones de métodos. Es extensible a través de del MetaObject Protocol. Common Lisp es extensible usando las 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).

Sintaxis

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. El enlace (binding) se ; establece en un ámbito dinámico en vez de léxico. (setf *x* 42.1) ; Fija la variable *x* al valor 42,1 de coma 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 (cuadrado *x*) ; Retorna 1772,4099 
 ;; El constructor del 'let' crea un ámbito para variables locales. ;; Aquí la 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

Common Lisp tiene muchos tipos de datos, por ejemplo: Integers, Ratios, Complex Numbers, Stings, Arrays, Vectors, Hash Tables, Funciones, Streams.

Tipos escalares

Los tipos numéricos incluyen números enteros, cocientes, números de punto flotante, y números complejos.[2]​ 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. Common Lisp fuerza automáticamente a los valores numéricos entre estos tipos a medida que sean apropiados.

El tipo carácter de 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 Common Lisp son representados por los símbolos autoevaluantes T y NIL. 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 Common Lisp están compuestas de conses, a veces llamados celdas cons o pares. Una celda cons es una estructura de datos con dos slots, llamados sus car y cdr. Una lista es bien formada una cadena enlazada de celdas cons. 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. Nil también representa una lista vacía. 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 matemá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

En Common Lisp las funciones son objetos de primera clase por lo que es posible escribir funciones que toman otras funciones como argumentos o también retornen funciones.

Un ejemplo de la utilidad de tener funciones como parameteros de funciones se ve en la 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 solo 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 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.

A continuación un ejemplo de un macro que proporciona la forma de iteración 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 en Common Lisp (o de terceros). La notación de backquote usada arriba es proporcionada por 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

Common Lisp soporta el paradigma de programación orientada a objetos al través del CLOS (Common Lisp Object System), que es uno de los sistemas de objetos más poderosos disponible en cualquier lenguaje[cita requerida]. Originalmente propuesto como un add-on[cita requerida], el CLOS fue adoptado como parte del estándar ANSI de 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 a través del envió de mensajes encontradas en lenguajes.como Smalltalk, 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 objeto de primera clase. Cada clase del CLOS está integrada en el sistema de tipos de Common Lisp. Mucho tipos de Common Lisp tienen una clase correspondiente. Hay más uso potencial del CLOS para 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 de 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.

Implementaciones

  • CLISP
  • SBCL
  • Clozure CL (CCL)
  • ECL - Embeddable Common Lisp
  • ABCL - para Java
  • LispWorks
  • AllegroCL
  • MOCL - para IOs y Android

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). Se dice que durante los años de 1991 a 1995 el proyecto por sí solo ha retornado los costos de los treinta años de inversiones de DARPA en la investigación de la Inteligencia Artificial[cita requerida].
  • 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:

Véase también

Referencias

  1. Document page el 1 de enero de 2014 en Wayback Machine. at ANSI website
  2. Reddy, Abhishek (22 de agosto de 2008). . Archivado desde el original el 26 de diciembre de 2009. 
  3. «Unicode support». The Common Lisp Wiki. Consultado el 21 de agosto de 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
  5. https://tapoueh.org/blog/2014/05/why-is-pgloader-so-much-faster/
  6. «Stumpwm». 

Enlaces externos

  • The Common Lisp Cookbook, un manual sobre Common Lisp
  •   Wikilibros alberga un libro o manual sobre Common Lisp.
  • The Awesome-cl list, una lista de librerías populares
  • The CLiki, una wiki para sistemas Common Lisp libres y de código abierto funcionando en sistemas Unix y similares
  • Common Lisp software repository.
  • .
  • «History». Common Lisp HyperSpec. 
  • Lisping at JPL
  • The Nature of Lisp Essay that examines Lisp by comparison with XML.
  • Survey of maintained Common Lisp implementations.
  • Recursos Lisp en español
  •   Datos: Q849146
  •   Multimedia: Common Lisp

common, lisp, lenguaje, programación, pertenece, familia, lenguajes, lisp, encuentra, descrito, documento, estándar, ansi, incits, 1994, r2004, ansi, antes, 1994, r1999, desarrollado, para, estandarizar, variantes, divergentes, lisp, aunque, principalmente, va. Common Lisp es un lenguaje de programacion que pertenece a la familia de lenguajes Lisp Se encuentra descrito en el documento estandar ANSI INCITS 226 1994 R2004 del ANSI antes X3 226 1994 R1999 1 Desarrollado para estandarizar las variantes divergentes del Lisp aunque principalmente las variantes de MacLisp que lo precedio no es una implementacion sino una especificacion del lenguaje Estan disponibles varias implementaciones del estandar de Common Lisp incluyendo la de software libre y de codigo abierto y productos propietarios Common Lisp es un lenguaje multi paradigma de propositos generales Soporta una combinacion de paradigmas de programacion como procedimental imperativo funcional y orientada al objeto Como un lenguaje de programacion dinamica facilita el desarrollo de software de una manera evolutiva e incremental con la compilacion iterativa en programas eficientes en tiempo de ejecucion Common Lisp incluye al CLOS un sistema de objetos que soporta multimetodos y combinaciones de metodos Es extensible a traves de del MetaObject Protocol Common Lisp es extensible usando las caracteristicas estandar tales como macros de Lisp rearreglo del codigo en tiempo de compilacion logrado por el programa en si mismo y macros de lectura extension de la sintaxis para dar un significado especial a los caracteres reservados para los usuarios con este proposito Indice 1 Sintaxis 2 Tipos de datos 2 1 Tipos escalares 2 2 Estructuras de datos 2 3 Funciones 3 Ambito 3 1 Determinantes del ambito 4 Macros 5 Sistema de objetos del Common Lisp 6 Implementaciones 7 Aplicaciones 8 Vease tambien 9 Referencias 10 Enlaces externosSintaxis EditarCommon Lisp es un dialecto de Lisp usa expresiones S para denotar tanto el codigo como la estructura de datos Las funciones y la llamadas a macros son escritas como listas con el nombre de la funcion primero como en estos ejemplos 2 2 suma 2 mas 2 dando como resultado 4 defvar x Se asegura de que exista una variable x sin darle un valor El enlace binding se establece en un ambito dinamico en vez de lexico setf x 42 1 Fija la variable x al valor 42 1 de coma flotante Define la funcion que calcula el cuadrado de un numero defun cuadrado x x x Ejecuta la funcion cuadrado 3 Retorna 9 cuadrado x Retorna 1772 4099 El constructor del let crea un ambito para variables locales Aqui la variable a esta enlazada bound a 6 y la variable b esta enlazada a 4 Dentro de let hay un cuerpo donde el ultimo valor computado es retornado Aqui el resultado de sumar a y b es retornado desde la expresion let Las variables a y b tienen ambitos lexicos a menos que los simbolos hayan sido marcados como variables especiales por ejemplo por un DEFVAR anterior let a 6 b 4 a b retorna 10Tipos de datos EditarCommon Lisp tiene muchos tipos de datos por ejemplo Integers Ratios Complex Numbers Stings Arrays Vectors Hash Tables Funciones Streams Tipos escalares Editar Los tipos numericos incluyen numeros enteros cocientes numeros de punto flotante y numeros complejos 2 Common Lisp usa bignums para representar valores numericos de tamano y precision arbitrarios El tipo cociente representa fracciones exactamente una facilidad no disponible en muchos lenguajes Common Lisp fuerza automaticamente a los valores numericos entre estos tipos a medida que sean apropiados El tipo caracter de Common Lisp no se limita a los caracteres ASCII La mayoria de las implementaciones modernas permiten los caracteres de Unicode 3 El tipo simbolo es comun a los lenguajes Common Lisp pero largamente desconocido fuera de ellos Un simbolo es un unico objeto de datos con nombre que tiene varias partes nombre valor funcion lista y paquete De estos la celda del valor y la celda de la funcion son los mas importantes Los simbolos 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 simbolo es evaluado su valor es retornado Algunos simbolos se evaluan a si mismos por ejemplo todos los simbolos en un paquete de palabra clave son autoevaluados Los valores boleano en Common Lisp son representados por los simbolos autoevaluantes T y NIL Common Lisp tiene espacios de nombres para simbolos llamados paquetes Estructuras de datos Editar 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 Common Lisp estan compuestas de conses a veces llamados celdas cons o pares Una celda cons es una estructura de datos con dos slots llamados sus car y cdr Una lista es bien formada una cadena enlazada de celdas cons Cada car del cons refiere a un miembro de la lista posiblemente otra lista Cada cdr del cons refiere al cons siguiente a excepcion del ultimo cons cuyo cdr refiere al valor nil Nil tambien representa una lista vacia Los conses tambien pueden facilmente usarse para implementar arboles y otras estructuras de datos complejas aunque generalmente es aconsejado usar instancias de clases y estructuras Tambien es posible crear estructuras de datos circulares con los conses Common Lisp soporta arreglos multidimensionales y puede redimensionar los arreglos dinamicamente si fuera necesario Los arreglos multidimensionales pueden ser usados para matematica 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 especifico de miembros como en un vector de enteros Muchas implementaciones pueden optimizar funciones de arreglo cuando el arreglo usado es de un tipo especifico Dos tipos de arreglo estan 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 automaticamente a medida que se necesite Los paquetes son colecciones de simbolos usados principalmente para separar las partes de un programa en espacios de nombres Un paquete puede exportar algunos simbolos marcandolos como parte de una interface publica 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 numero y tipo de campos llamados slots Las estructuras permiten herencia simple Las clases son similares a las estructuras pero ofrecen caracteristicas mas dinamicas y herencia multiple 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 genericas Las funciones genericas son tanto funciones como instancias Funciones Editar En Common Lisp las funciones son objetos de primera clase por lo que es posible escribir funciones que toman otras funciones como argumentos o tambien retornen funciones Un ejemplo de la utilidad de tener funciones como parameteros de funciones se ve en la funcion sort toma un operador relacional como un argumento y una funcion clave como un argumento opcional de palabra clave Esto puede ser usado no solo para clasificar cualquier tipo de datos pero tambien para clasificar las estructuras de datos de acuerdo a una clave sort list 5 2 6 3 1 4 gt Ordena la lista usando la funcion gt como el operador relacional Returns 6 5 4 3 2 1 sort list 9 A 3 B 4 C lt key first Ordena la lista de acuerdo al primer elemento de cada sublista Returns 3 B 4 C 9 A El modelo de evaluacion para las funciones es muy simple Cuando el evaluador encuentra una forma F A1 A2 entonces se asume que el simbolo nombrado F es uno de los siguientes Un operador especial facilmente comprobado contra una lista fija Un macro operador debe haber sido definido previamente El nombre de una funcion por defecto que puede ser un simbolo o un principio de subforma con el simbolo lambda Si F es el nombre de una funcion despues las argumentos A1 A2 son evaluados en orden de izquierda a derecha y la funcion es encontrada e invocada con esos valores suministrados como parametros Ambito EditarComo en los programas en muchos otros lenguajes de programacion 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 estan conforme a un ambito La asociacion entre un nombre y la entidad a la que el nombre se refiere se llama binding enlace enlazamiento El ambito se refiere al conjunto de las circunstancias en las cuales un nombre es determinado para tener un enlace particular Determinantes del ambito Editar Las circunstancias que determinan el ambito en Common Lisp incluyen La localizacion de una referencia dentro de una expresion Si es la posicion extrema izquierda de una composicion se refiere a un enlace binding de un operador especial o un macro o una funcion si no a un enlace de variable o alguna otra cosa La clase de expresion 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 ambitos de X pueden estar activos en la misma region del texto del programa puesto que las etiquetas tagbody estan 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 simbolos en su sintaxis Por ejemplo en defclass x a b una definicion de clase el a b es una lista de clases base asi 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 semantica de defclass El unico hecho generico sobre esta expresion es que los defclass se refieren a un enlace binding de macro todo lo demas es dejado a defclass La localizacion de la referencia dentro del texto del programa Por ejemplo si una referencia a la variable X es envuelta en una construccion binding como un LET que define un binding para X entonces la referencia esta en el ambito creado por ese binding Para una referencia de variable independientemente de si el simbolo de variable ha sido local o globalmente declarado como especial Esto determina si la referencia esta resuelta dentro de un ambiente lexico o dentro de un ambiente dinamico La instancia especifica del ambiente en el cual la referencia es resuelta Un ambiente es un diccionario de tiempo de ejecucion run time que mapea los simbolos con los enlaces bindings Cada tipo de referencia usa sus propio tipo de ambiente Las referencias a las variables lexicas son resueltas en un ambiente lexico etcetera Mas de un ambiente puede estar asociado con la misma referencia Por ejemplo gracias a la recursion o al uso de multiples hilos multithreads pueden existir al mismo tiempo multiples activaciones de la misma funcion Estas activaciones comparten el mismo texto del programa pero cada una tiene su propia instancia de ambiente lexico Para entender a lo que hace referencia un simbolo el programador de Common Lisp debe saber que tipo de referencia esta siendo expresada que tipo de ambito es usado en caso de ser una referencia variable ambito dinamico versus lexico y tambien la situacion en tiempo de ejecucion en que ambiente es resuelta la referencia donde estaba el binding introducido en el ambiente etcetera Macros EditarEn Lisp un macro se asemeja superficialmente a una funcion en uso Sin embargo en vez de representar una expresion que es evaluada representa una transformacion del codigo fuente del programa A continuacion un ejemplo de un macro que proporciona la forma de iteracion until que puede ser familiar para lenguajes como Perl defmacro until test amp body body do test body ejemplo until random 10 0 write line Hola Todos los macros deben ser expandidos antes de que el codigo fuente que los contiene pueda ser evaluado o compilado normalmente Las macros pueden ser considerados como funciones que aceptan y retornan arboles de sintaxis abstracta expresiones S de Lisp Estas funciones son invocadas antes del evaluador o del compilador para producir el codigo fuente final Los macros son escritos en Common Lisp normal y pueden usar cualquier operador disponible en Common Lisp o de terceros La notacion de backquote usada arriba es proporcionada por Common Lisp especificamente para simplificar el caso comun de la substitucion en una plantilla de codigo Sistema de objetos del Common Lisp EditarArticulo principal Common Lisp Object System Common Lisp soporta el paradigma de programacion orientada a objetos al traves del CLOS Common Lisp Object System que es uno de los sistemas de objetos mas poderosos disponible en cualquier lenguaje cita requerida Originalmente propuesto como un add on cita requerida el CLOS fue adoptado como parte del estandar ANSI de Common Lisp CLOS es un sistema de objetos dinamico con despacho multiple y herencia multiple y se diferencia radicalmente de las facilidades de programacion orientada a objetos a traves del envio de mensajes encontradas en lenguajes como Smalltalk C o Java Como sistema de objetos dinamico CLOS permite cambios en tiempo de ejecucion a las funciones y clases genericas Los metodos 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 genericas pueden ser usadas como las funciones normales y son un objeto de primera clase Cada clase del CLOS esta integrada en el sistema de tipos de Common Lisp Mucho tipos de Common Lisp tienen una clase correspondiente Hay mas uso potencial del CLOS para Common Lisp La especificacion 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 estandar Las implementaciones reales de Common Lisp estan usando el CLOS para los pathnames streams condiciones de entrada salida la implementacion del CLOS en si mismo y mas Implementaciones EditarCLISP SBCL Clozure CL CCL ECL Embeddable Common Lisp ABCL para Java LispWorks AllegroCL MOCL para IOs y AndroidAplicaciones EditarCommon Lisp es usado para desarrollar aplicaciones de investigacion frecuentemente en inteligencia artificial en el desarrollo rapido de prototipos o para desplegar aplicaciones Common Lisp es usado en muchas aplicaciones comerciales incluyendo el sitio de comercio web Yahoo Store que originalmente implico a Paul Graham y fue posteriormente reescrito en C y el Perl 4 Otros ejemplos notables incluyen El Dynamic Analysis and Replanning Tool DART Se dice que durante los anos de 1991 a 1995 el proyecto por si solo ha retornado los costos de los treinta anos de inversiones de DARPA en la investigacion de la Inteligencia Artificial cita requerida El entorno de desarrollo para los juegos de video de Jak and Daxter para el Playstation 2 escrito por Naughty Dog El motor de busqueda para tarifas bajas de ITA software usado por sitios web de viajes como Orbitz y Kayak com y lineas aereas como American Airlines Continental Airlines y US Airways Tambien existen aplicaciones de fuente abierta escritas en Common Lisp como por ejemplo ACL2 un demostrador de teoremas de caracteristicas completas para una variante aplicativa de Common Lisp Maxima un sofisticado sistema algebraico computacional OpenMusic es un ambiente de programacion visual orientado a objetos basado en Common Lisp usado en la composicion asistida por computador Pgloader de la fundacion PostgreSQL Fue escrito de nuevo desde Python 5 Stumpwm 6 un gestor de ventanas de mosaico para X11 manejado por teclado escrito enteramente en Common Lisp Vease tambien EditarLisp Scheme Racket CLOSReferencias Editar Document page Archivado el 1 de enero de 2014 en Wayback Machine at ANSI website Reddy Abhishek 22 de agosto de 2008 Features of Common Lisp Archivado desde el original el 26 de diciembre de 2009 Unicode support The Common Lisp Wiki Consultado el 21 de agosto de 2008 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 https tapoueh org blog 2014 05 why is pgloader so much faster Stumpwm Enlaces externos EditarThe Common Lisp Cookbook un manual sobre Common Lisp Wikilibros alberga un libro o manual sobre Common Lisp The Awesome cl list una lista de librerias populares The CLiki una wiki para sistemas Common Lisp libres y de codigo abierto funcionando en sistemas Unix y similares Common Lisp software repository The Common Lisp directory information repository for all things Common Lisp History Common Lisp HyperSpec Lisping at JPL The Nature of Lisp Essay that examines Lisp by comparison with XML Common Lisp Implementations A Survey Survey of maintained Common Lisp implementations Recursos Lisp en espanol Datos Q849146 Multimedia Common Lisp Obtenido de https es wikipedia org w index php title Common Lisp amp oldid 134246620, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos