syntax - Qué significa#en LISP
common-lisp special-characters (1)
# ''nombre de función en Common Lisp
Common Lisp y algunos otros dialectos Lisp tienen más de un espacio de nombres. Aquí los de funciones y valores son diferentes. Para obtener el valor de la función de un nombre, necesitamos escribir:
(function functionname)
Dado que es un poco largo para escribir, hay una notación más corta:
#''functionname
Para mostrar el efecto, mira esto:
(let ((foo 42))
(flet ((foo () ''bar))
(list foo (function foo) #''foo (foo))))
Arriba se define una variable local FOO
y una función local FOO
. La declaración de lista devuelve el valor de FOO
, luego el valor de la función de foo
usando la notación (function ...)
, luego la misma usando la notación de mano corta y luego el valor de llamar realmente a la función FOO
.
(function foo)
y #''foo
son el mismo concepto, pero escrito de manera diferente. Ambos se refieren a la función léxica local denominada 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)
Arriba muestra que el primer elemento es realmente el valor de la variable FOO
y los siguientes dos elementos son los valores de la función, la función vinculada a FOO
. El último elemento es el símbolo BAR
, como se devuelve desde la llamada a la 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 caracter #
El carácter #
se usa para introducir una sintaxis especial en s-expressions. Aquí hay unos 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 de macro de despacho .
El ANSI Common Lisp HyperSpec describe el carácter #
en la Sección 2.4.8 Sharpsign .
Common Lisp podría haber usado una sintaxis diferente para los vectores. Di [1 2 3]
. También podría haber usado una sintaxis diferente para números complejos. Algo como {1 2}
. Pero no hace eso. ¿Por qué? La razón es porque Common Lisp intenta ser económico con el uso del carácter en el idioma 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 único carácter de envío #
y el siguiente carácter determina qué 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 esta sintaxis de nivel de caracteres. Ver la función SET-DISPATCH-MACRO-CHARACTER .
Por ejemplo, #''functionname
, ¿es necesario?