syntax - Por qué los dos puntos preceden a las variables en Common Lisp
common-lisp colon (2)
¿Qué significa la sintaxis, dos puntos que preceden a la variable en Common Lisp? He visto programas con eso, y presentaré algunos ejemplos de código aquí, de un gran conjunto de funciones.
(defun expand (successorf node)
(mapcar (lambda (action-state-cost)
(let ((action (car action-state-cost))
(state (cadr action-state-cost))
(cost (caddr action-state-cost)))
(make-node :state state :parent node
:action action :path-cost (+ (node-path-cost node) cost)
:depth (1+ (node-depth node)))
))
(funcall successorf (node-state node))
))
No son variables, en realidad; esas son palabras clave. Son un tipo especial de token eficiente, similar a los "átomos" en otros idiomas. Es una forma conveniente e integrada de pasar parámetros nombrados (y, casi siempre, opcionales) a una llamada de función.
http://www.gigamonkeys.com/book/functions.html describe la sintaxis de las llamadas a funciones.
Símbolos de palabras clave
:foo
es un símbolo de keyword .
- internado y exportado desde el paquete
KEYWORD
- constantemente atado a sí mismo
Uso
Los símbolos de palabras clave se utilizan cuando se necesita la combinación de las siguientes propiedades:
- Un símbolo es la estructura de datos correcta.
- los símbolos con el mismo nombre deben ser únicos (al introducirlos en un paquete) -> package
KEYWORD
- diferentes paquetes no son necesarios o deseados -> paquete
KEYWORD
- escribir el símbolo debería ser fácil ya que no es necesario citarlos ->
:foo
mejor que'':foo
- la capacidad de actuar como una variable con diferentes valores no es necesaria ->
:foo
evalúa a:foo
sí misma y solo a:foo
En Common Lisp, generalmente los símbolos pueden estar en un paquete (tipo de espacio de nombres).
Una bar
símbolos no exportada en un paquete foo
se escribe como foo::bar
. Los dos puntos dobles están entre el nombre del paquete y el nombre del símbolo.
Un símbolo exportado se escribe entonces como foo:bar
. Se utiliza un solo colon.
Si el símbolo está disponible en el paquete actual, se escribe como bar
sin el paquete.
El paquete KEYWORD
Hay un paquete especial llamado KEYWORD
. Una bar
símbolos en ese paquete se escribe simple y siempre como :bar
.
Ejemplos
Estos símbolos de palabras clave también tienen estas propiedades interesantes: los símbolos se exportan automáticamente desde el paquete KEYWORD
(por lo tanto, keyword::bar
, keyword:bar
, ::bar
y :bar
son todos el mismo símbolo) y se evalúan a sí mismos:
CL-USER 5 > :bar
:BAR
CL-USER 6 > (describe :bar)
:BAR is a SYMBOL
NAME "BAR"
VALUE :BAR
FUNCTION #<unbound function>
PLIST NIL
PACKAGE #<The KEYWORD package, 0/4 internal, 5830/8192 external>
CL-USER 7 > (eq ''keyword::bar '':bar)
T
CL-USER 8 > (eq :bar '':bar) ; quoted or unquoted, each subform evaluates to :bar
T
Uso
Los símbolos de palabras clave se utilizan, por ejemplo, como nombres en argumentos con nombre:
(defun foo (&key bar) (+ bar 10))
(foo :bar 7)
Normalmente, también se utilizan en argumentos para la construcción de instancia y estructura.
(defstruct node state parent action)
DEFSTRUCT
es una macro de Common Lisp y genera varias funciones. Una de ellas es una función MAKE-NODE
, que se puede utilizar como:
(make-node :state ''open
:parent some-parent
:action an-action)
Nota: a veces los datos también pueden ser una palabra clave. Por ejemplo, en el formulario anterior, el estado podría ser :open
y no open
:
(make-node :state :open
:parent some-parent
:action an-action)