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))))))