2011-11-08 62 views
5

En Common Lisp definición del paquete, ¿cuál es la diferencia entreCommon Lisp definición del paquete

(defpackage #:foo 
    (:use :cl) 
    (:export #:bar 
     #:baz)) 

(in-package #:foo) 

y

(defpackage :foo 
    (:use :cl) 
    (:export :bar 
     :baz)) 

(in-package :foo) 

me refiero. Cuando tengo que usar el caracter "#"? Todos estos símbolos son ininterrumpidos, ¿verdad?

+1

La respuesta está aquí: http://stackoverflow.com/questions/7894548/why-are-uninterned-symbols-used-for-package-names-and-exports-in-common-lisp –

Respuesta

8

:foo es la sintaxis de un símbolo de palabra clave, y #:foo es la sintaxis de un símbolo no identificado. Cuando un símbolo se utiliza principalmente para obtener la cadena que es su nombre (como en defpackage y in-package), prefiero usar símbolos no internados.

Estas son las otras opciones:

  • utilizar un símbolo de palabras clave; No me gusta la forma en que internan los símbolos de palabras clave que aparecen en apropos y en otros lugares
  • usan una cadena; No me gusta cómo esto rompe de manera gratuita el modo "moderno" de Allegro
  • use un símbolo simple; No me gusta cómo ambos pasantes un símbolo, y como pasantes de que en un paquete potencialmente aleatoria

Qué estilo te o alguien utiliza más es una cuestión de gusto.

+0

Gracias por la responder. Adoptaré símbolos no identificados para evitar algunos enfrentamientos en el espacio de nombres, ya que este enlace muestra http://stackoverflow.com/questions/7894548/why-are-uninterned-symbols-used-for-package-names-and-exports-in -common-lisp. Creo que es el mejor enfoque. – csgui