2012-08-09 20 views
5

Soy consciente de que Common Lisp tiene diferentes entornos de enlace para funciones y variables, pero creo que también tiene otro entorno de enlace para las etiquetas de tagbody. ¿Hay aún más entornos vinculantes que esto? Si es así, ¿es justo categorizar Common Lisp como un Lisp-2?Common Lisp a Lisp-n?

Estas preguntas no están pensadas para pedantería o despojo de bicicleta, solo quiero obtener una mejor comprensión de Common Lisp y con suerte obtener algunos consejos sobre dónde profundizar en sus especificaciones.

Respuesta

9

Soy consciente de que Common Lisp tiene diferentes entornos de unión para funciones y variables,

Eso sería espacios de nombres, de acuerdo con el HyperSpec:

espacio de nombres n. 1. enlaces cuyas denotaciones están restringidas a un tipo particular . The bindings of names to tags is the tag namespace.'' 2. any mapping whose domain is a set of names. Un paquete define un espacio de nombres. ''

(Punto 1.)

pero creo que también tiene otro medio de unión para tagbody etiquetas. ¿Hay aún más entornos vinculantes que esto?

Sí, hay más espacios de nombres. Incluso recuerdo un pequeño fragmento que expone a la mayoría de ellos, pero desafortunadamente, no lo puedo encontrar más¹. Es al menos expuesto variables, función , etiqueta y bloque espacios de nombres, pero tal vez se incluyeron también los tipos y declaraciones. También hay another SO answer que enumera estos espacios de nombres.

Si es así, ¿es justo categorizar Common Lisp como Lisp-2?

En los comentarios a la respuesta vinculada anterior, Rainer Joswig acepta que el "debate general es sobre Lisp-1 contra Lisp-n".

El "2" puede deberse a la importancia relativa de la distinción entre ranuras de valores y funciones, o porque los objetos de los otros espacios de nombres no son objetos de primera clase. Por ejemplo en el Gabriel/Pitman paper se hace referencia en la otra respuesta:

realmente hay un mayor número de espacios de nombres que sólo los dos que se discuten aquí.Como notamos anteriormente, otros espacios de nombres incluyen en menos los de bloques y etiquetas; los nombres de tipo y los nombres de las declaraciones son espacios de nombres considerados a menudo. Por lo tanto, los nombres Lisp1 y Lisp2, que usamos , son engañosos. Los nombres Lisp5 y Lisp6 podrían ser más apropiados.

y:

En este trabajo, hay dos espacios de nombres de preocupación, que nos llamaré el "valor de espacio de nombres" y el "espacio de nombres de función." Otros espacios de nombres incluyen nombres de etiqueta (usados ​​por TAGBODY y GO) y nombres de bloque (usados ​​por BLOCK y RETURN-FROM), pero los objetos en las partes de ubicación de sus enlaces no son objetos Lisp de primera clase.


¹) PAIP, p. 837:

(defun f (f) 
    (block f 
    (tagbody 
    f (catch 'f 
     (if (typep f 'f) 
      (throw 'f (go f))) 
     (funcall #'f (get (symbol-value 'f) 'f)))))) 
1

Sí - http://www.lispworks.com/documentation/lw51/CLHS/Body/t_symbol.htm#symbol especifica una célula de función y celda de valor por separado, en consonancia con un lisp-2.

También hay una lista de propiedades, pero como no hay contexto en el que un símbolo se refiera "naturalmente" a su lista de propiedades, no es habitual describir CL como un lisp-3 (de hecho, no estoy al tanto de cualquier idioma usualmente designado).

3

En PAIP, Peter Norvig dice "Common Lisp tiene al menos siete espacios de nombres" (p 836).

Los siete Él lista son:

  1. funciones y macros
  2. las variables
  3. variables especiales
  4. tipos de datos
  5. etiqueta para declaraciones go dentro de un tagbody
  6. un nombre de bloque de declaraciones de devolución dentro de un bloque
  7. símbolos i nside una expresión entrecomillada

Peter Seibel hace un buen punto en su publicación comp.lang.lisp sobre los espacios de nombres "compilador" frente a "biblioteca". Creo que todos los siete espacios de nombres de Norvig son espacios de nombres "compiladores".