syntax common-lisp colon

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)