2011-02-02 25 views

Respuesta

56

# functionname 'en Common Lisp

Common Lisp y algunos otros dialectos Lisp tiene más de un espacio de nombres. Aquí los de funciones y valores son diferentes. Para obtener el valor función de un nombre, tenemos que escribir:

(function functionname) 

Dado que es un poco largo para escribir, hay una notación más corta:

#'functionname 

para mostrar el efecto ver esto:

(let ((foo 42)) 
    (flet ((foo() 'bar)) 
    (list foo (function foo) #'foo (foo)))) 

anterior define una variable local FOO y una función localFOO. La sentencia de la lista devuelve el valor de FOO, entonces el valor de la función de foo usando la notación (function ...), entonces lo mismo usando la notación lado corto y luego el valor de realidad llamando a la función FOO.

(function foo) y #'foo son el mismo concepto, pero se escriben de manera diferente. Ambos se refieren a la función léxica local llamada FOO. FOO es introducido por el formulario FLET como una función local .

El Lisp REPL devuelve algo como esto:

(42 #<function FOO 4060008224> #<function FOO 4060008224> BAR) 

anterior muestra que el primer elemento es realmente el valor de la variable FOO y los dos siguientes artículos son la función valora, la función de salto a FOO. El último elemento es el símbolo BAR, como se devuelve desde la llamada de función (FOO).

Esta separación de espacios de nombres para valores normales y valores de función está presente en Common Lisp, Emacs Lisp e ISLisp. Otros dialectos de Lisp como Scheme no tienen esa separación. En Scheme, un nombre solo puede denotar un valor.

El carácter #.

El carácter # se usa para introducir una sintaxis especial en s-expressions. Aquí hay algunos ejemplos:

#'functionname -> (function functionname) 
#(1 2 3)   -> the vector of the elements 1 2 3 
#c(1 2)   -> a complex number 
#xFFFF   -> a hex number 
#b1111   -> a binary number 

y muchos más. # es un llamado carácter macro de despacho.

ANSI Common Lisp HyperSpec describe el carácter # en Section 2.4.8 Sharpsign.

Common Lisp podría haber usado una sintaxis diferente para los vectores. Diga [1 2 3]. También podría haber usado una sintaxis diferente para números complejos. Algo así como {1 2}. Pero no hace eso. ¿Por qué? La razón es porque Common Lisp intenta ser económico con el uso de caracteres en el lenguaje y deja caracteres como [, ], { y } al usuario para sus propias extensiones de sintaxis. A menudo, los usuarios de Lisp desarrollan lenguajes incrustados y, para hacerlo un poco más fácil, el estándar Common Lisp intenta mantener el uso de caracteres al mínimo y también proporciona el mecanismo de los macro caracteres y el despacho de caracteres macro.

Para mantener el uso del carácter hacia abajo, se utiliza un solo carácter de envío # y el siguiente carácter determina lo que se puede denotar. #b para números binarios. #x para números hexadecimales. #c para números complejos. #( para vectores. #' para nombres de funciones. Además de muchos más

Como Common Lisp es un lenguaje de programación programable, el usuario puede cambiar la sintaxis de este nivel de caracteres. Ver la función SET-DISPATCH-MACRO-CHARACTER.

+0

ha proporcionado un excelente artículo! ¡Lo encontré justo cuando lo necesitaba! – TheGeeko61