2010-06-03 34 views
33

que nunca había pensado en si un símbolo podría ser un número en Lisp, por lo que jugó un rato con él hoy en día:¿Cuál es la diferencia entre 1 y '1 en Lisp?

> '1 
1 
> (+ '1 '1) 
2 
> (+ '1 1) 
2 
> (define a '1) 
> (+ a 1) 
2 

El código anterior es esquema, pero parece ser más o menos la misma en Common Lisp y Clojure también. ¿Hay alguna diferencia entre 1 y 1 entre?

+3

He entrado en un montón de detalles respondiendo básicamente la misma pregunta aquí: http://stackoverflow.com/questions/2297452/using-quote-in-clojure - tal vez esa respuesta podría ser útil para usted. –

Respuesta

10

Bueno, en realidad son muy diferente. '1 es, sin embargo, exactamente igual que (quote 1). (car ''x) evalúa el símbolo 'quote'.

1 es una expresión S, es la representación externa de un dato, un número 1. Decir que 1 es un 'objeto-número' o una expresión S para ingresar a ese objeto sería aceptable. A menudo se dice que 1 es la representación externa del objeto numérico real.

(quote 1) es otra expresión-S, es un S-expresión para una lista cuyo primer elemento es el símbolo 'cita' y cuyo segundo elemento es el número 1. Esto es en donde está ya diferentes palabras clave, sintácticas, a diferencia funciones, no se consideran objetos en el lenguaje y no los evalúan.

Sin embargo, ambas son representaciones externas de objetos (datos) que evalúan con el mismo datum. El número cuya representación externa es 1, sin embargo, no son los mismos objetos, el mismo código, el mismo dato lo mismo, simplemente evalúan exactamente lo mismo. Los números se evalúan a sí mismos. Decir que son lo mismo es decir que:

(+ 1 (* 3 3)) 

Y

(if "Strings are true" (* 5 (- 5 3)) "Strings are not true? This must be a bug!") 

son 'lo mismo', no son, ambos son diferentes programas que acaba de pasar a terminar con el mismo valor, una forma de ceceo es también un programa, una forma es un dato que también es un programa, recuerde.

Además, me enseñaron un truco muy útil una vez que se demuestra que los datos auto-evaluación no son verdaderamente símbolos cuando entraron:

(let ((num 4)) 
    (symbol? num) ; ====> evaluates to #f 
    (symbol? 'num) ; ====> evaluates to #t 
    (symbol? '4) ; ====> evaluates to #f 
    (symbol? '#\c) ; #f again, et cetera 
    (symbol? (car ''x)) ; #t 
    (symbol? quote) ; error, in most implementations 
) 

datos auto evaluación verdaderamente se evalúan a sí mismos, no son 'símbolos predefinidos' de algunos géneros

11

Las cotizaciones evitan que las expresiones se evalúen hasta más adelante. Por ejemplo, la siguiente no es una lista adecuada:

(1 2 3) 

Esto es porque Lisp interpreta 1 como una función, que no lo es. Por lo que la lista debe ser citado:

'(1 2 3) 

Cuando se cita una expresión muy simple, como un número, Lisp efectivamente no altera su comportamiento.

Ver Wikipedia: Lisp.

+2

¿Por qué esto obtuvo votos ascendentes? ¡Esto no responde la pregunta en absoluto! La respuesta correcta fue "los números se evalúan a sí mismos", como se muestra a continuación. – mquander

+1

Esta respuesta tiene upvotes porque explica por qué los números se evalúan a sí mismos y proporciona un enlace a un artículo de Wikipedia con más información. De hecho, responde la pregunta. – mcandre

+1

Pero las matrices de 7 dimensiones y las formas de lambda, por ejemplo, son objetos de autoevaluación, mientras que una celda de cons no lo es, y no estoy seguro de llamar a los ejemplos anteriores "más simples" que el último. Esto solo funciona si defines "expresión muy simple" como "objeto de autoevaluación". :-) – Ken

14

Los números son self-evaluating objects. Es por eso que no tiene que preocuparse por citarlos, como lo hace con, por ejemplo, las listas.

Se puede hacer un símbolo desde cualquier cadena. Si desea que el símbolo cuyo nombre es el único carácter 1, se puede decir:

(intern "1") 

que imprime |1|, lo que sugiere una forma alternativa de entrar en él:

'|1| 
+0

Estoy usando clojure 1.1.0 ... ''| 1 |' evalúa ' | 1 | '. '| 1 |' trae de vuelta ... 'No se puede resolver el símbolo: | 1 |' – Droogans

25

En Common Lisp, '1 es taquigrafía para (CITA 1). Cuando se evalúa, (CITA algo) devuelve la parte algo, sin evaluar. Sin embargo, no hay diferencia entre 1 evaluado y 1 no evaluado.

Así que hay una diferencia para el lector: '1 se lee como (CITA 1) y 1 lee como 1. Pero no hay diferencia cuando se evalúa.

+2

Esto se aplica a todas las expresiones autoevaluadas – mathk

1

En Lisp, el apóstrofo impide que se evalúen los símbolos. Usar un apóstrofo antes de que un número no esté prohibido, no es necesario ya que los números se representan a sí mismos. Sin embargo, como cualquier otra lista, automáticamente se transforma en una llamada de función apropiada. El intérprete considera que estos números coinciden con su valor.

+0

¿Llamada de función? ¿Qué función? –

+0

¡Quise escribir QUOTE (llamada de función)! – Secko

+0

QUOTE no es una función. En Lisp, el apóstrofo evita la evaluación de cualquier cosa. Durante el tiempo de lectura se transforma en (cita ...). QUOTE es una forma especial que simplemente devuelve su argumento sin evaluar. El evaluador de Lisp (intérprete o compilador) tiene una regla de evaluación especial para eso. –

1

Como se ha señalado, no hay diferencia, ya que los números se evalúan a sí mismos. Puede confirmar esto utilizando eval:

(eval 1) ;=> 1 

Esto no se limita a los números, por cierto. De hecho, en Common Lisp, la mayoría de las cosas se evalúan a sí mismas. Es solo que es muy raro que se evalúe algo que no sean números, cadenas, símbolos y listas. Por ejemplo, las siguientes obras:

(eval (make-hash-table)) ;equivalent to just (make-hash-table) 
1

En Lisp, quote impide que se evalúe la siguiente expresión. ' es una abreviatura de quote. Como resultado, '1 es igual que (quote 1).

Sin embargo, en Lisp, los símbolos nunca pueden ser un número. Quiero decir, 'abc es un símbolo, pero '123 no es (evaluado en) un símbolo. Creo que esto está mal con el diseño de Lisp. Otro caso no es solo #t o #f puede usarse como una expresión booleana.

Cuestiones relacionadas