2010-08-12 13 views
12

LISP común y LISP de Emacs tienen el predicado de tipo de átomo. Scheme y Clojure no lo tienen. http://hyperpolyglot.wikidot.com/lispScheme y Clojure no tienen el predicado de tipo atómico: ¿es esto por diseño?

¿Hay un motivo de diseño para esto o simplemente no es una función esencial para incluir en la API?

+0

Además de la curiosidad en general, hay una razón por la que iba a encontrar un uso para él? Un objeto es un átomo o un objeto compuesto, y normalmente estarías interesado en qué tipo de objeto compuesto, ¿verdad? –

+0

Algunos esquemas vienen con varias cosas pequeñas como átomo? predefinido para su conveniencia. Por ejemplo, [Petite] Chez Scheme viene con la mayoría de las funciones triviales que esperarías existir. – erjiang

Respuesta

14

En Clojure, el predicado átomo no es tan importante porque Clojure enfatiza varios otros tipos de (inmutables) data structures en lugar de centrarse en las células/listas cons.

También podría causar confusión. ¿Cómo espera que se comporte esta función cuando se le da un hashmap, un conjunto o un vector, por ejemplo? ¿O un objeto Java que representa una estructura de datos mutable compleja?

También el nombre "átomo" se usa para algo completamente diferente: es uno de los mecanismos de concurrencia de núcleo de Clojure to manage shared, synchronous, independent state.

6

En todas las librerías estándar de IronScheme que implementan R6RS, nunca necesité tal función.

En resumen:

  • Es inútil
  • Es bastante fácil de escribir, si lo necesita

que sigue más o menos enfoque minimalista del Esquema.

12

Clojure tiene la función coll? (¿colección?), Que es (algo así como) la inversa de atom?.

1

Es una función trivial:

(defun atom (x) 
    (not (consp x))) 

Se utiliza en la elaboración de la lista, cuando el dialecto de Lisp utiliza conses para crear listas. Hay algunos 'Lisps' para los cuales este no es el caso o no es central.

2

En Scheme cualquier cosa que no sea pair es atom. Como Esquema ya define el predicado pair?, no se necesita el predicado atom?, ya que es tan trivial para definir:

(define (atom? s) 
    (not (pair? s))) 
+0

¿El esquema no conoce la diferencia entre un par y una lista? ¿O ha cambiado el concepto de pareja? En Lisp no existe una pareja, solo átomos, contras y listas. Mientras sepa que un par consiste en dos cosas solo. Entonces puedes decir que una lista de dos elementos es un par, pero no una lista de tres o más. Pero tomar una lista de dos elementos como un par no es conceptualmente bueno. Es mejor contar uno de otro. – Alfgaar

+0

@Alfgaar: Eso no está del todo bien. Una lista es una estructura de datos recursiva: cada lista es la lista vacía, o un par donde el segundo elemento, el cdr, es en sí mismo una lista. Una lista de 100 elementos sigue siendo un par, que comprende una cadena de pares. –

6

En el libro The Little Schemer, atom? se define como sigue:

(define (atom? x) 
    (and (not (pair? x)) 
     (not (null? x)))) 

Tomando nota de que null no se considera un átomo, como han sugerido otras respuestas. En el libro mencionado atom? se usa mucho, en particular cuando se escriben procedimientos que tratan con listas de listas.

+1

¡Impresionante! Me encantó ese libro. – hawkeye

+0

esquema es realmente un lenguaje extraño, tiene nulo en lugar de nulo, y nulo no es un átomo. El esquema debe ser el dialecto más extraño de lisp, aparte de javascript. – Alfgaar

+0

Creo que debe agregar '(no (procedimiento? X)' a esta definición, a menos que tome un procedimiento es un átomo. – Alfgaar

0

Atom es un símbolo, un carácter, un número o nulo.

(define (atom? a) 
    (or (symbol? a) 
     (char? a) 
     (number? a) 
     (null? a))) 

Creo que esos son todos los átomos que existen, si encuentra más Agregar a la conditional expression. Por ejemplo, si crees que una cadena es un átomo, agrega (cadena? A), :-). La ausencia de una definición de átomo le permite definirlo de la manera que desee. Después de todo, Scheme no sabe qué es un átomo.

En Lisp nil es un átomo, así que he hecho null un átomo. nil es también una lista por simplificación nil = (nil . nil), del mismo modo que los números enteros son números racionales por simplificación, 2 = 2/1, 2 es un número integral, 2/1 es un número racional, ya que ambos son iguales por simplificación del racional; uno dice que el número integral 2 también es un número racional. Pero el predicado de la lista ya está definido en Scheme, no hay nada de qué preocuparse.

Sobre la pregunta. Mientras me preocupe Scheme tiene predicados solo para tipos de clase, átomo no es un tipo de clase, átomo es una abstracción que incorpora varios tipos de clases. Quizás esa es la razón. Pero el par tampoco es un tipo de clase, pero no incorpora varios tipos de clase y, sin embargo, algunos pueden considerar el par como un tipo de clase.

Atom significa que cierta cosa no es algo compuesto. Una razón para no incluir dicho predicado es cuando el lenguaje le permite definir tipos atómicos, por lo que la pletora de átomos puede crecer más y más, y tal predicado no tendría sentido. No sé si Scheme lo permite. Solo puedo decir que los predicados de Scheme (los integrados) son todos específicos. Puedes preguntar, ¿es esto una manzana?, ¿Es esto una naranja?; pero no puedes preguntar ¿es esto una fruta?. :-). Bueno, puedes, si lo haces tú mismo. A pesar de lo dicho, Scheme tiene un predicado general number? y predicados numéricos específicos, integer?, rational?, real?; no obstante, el número se puede considerar como un tipo de clase (los otros predicados se refieren a subtipos de número), mientras que el átomo no lo es (al menos en Scheme).

Nota: tipos de clases: tipos que pertenecen a una determinada clase de cosas. Ejemplo:

número, entero, real, racional, carácter, procedimiento, lista, vector, hilo, etc.

Cuestiones relacionadas