Pregunta

La plataforma que trabajo es DrScheme.

he visto que un par (a b) [construido por (cons a b)] se lleva a cabo dentro de la lengua como un procedimiento que es similar al siguiente:

(define (cons a b)
  (lambda(pick)
    (cond ((= pick 1) a)
          ((= pick 2) b))))

y los selectores:

(define (car x) (x 1))
(define (cdr x) (x 2))

Luego están listas, construido con expresión como (cons a (cons b (cons c (cons ...)))).

Ahora, lo que yo estaba tratando de entender es esto (escribe en DrScheme del sistema):

> (define l1 '(a b c))
> (define l2 (list 'a 'b 'c))
> l1
(a b c)
> l2
(a b c)
> (eq? l1 l2)
#f

Ok, L2 es sólo una lista (es decir, un procedimiento, etc ...) como el que he descrito morada, pero ... lo es l1? ¿Un símbolo? Una secuencia de caracteres? Y sea lo que es, cómo se implementa dentro de la lengua? Gracias!

¿Fue útil?

Solución

l1 es también sólo una lista que contiene los mismos elementos. Tenga en cuenta que esto también vuelve #f:

(define l1 '(a b c))
(define l2 '(a b c))
(eq? l1 l2)

Si bien esto #t rendimientos:

(define l1 '(a b c))
(define l2 (list 'a 'b 'c))
(equal? l1 l2)

La razón es que los controles eq? si l1 y l2 son referencias al mismo objeto en la memoria, mientras que los cheques equal? si tienen el mismo contenido.

Otros consejos

Las listas no son átomos , que es la parte importante aquí. Símbolos, aunque son átomos, que significa que cuando son lo mismo, que residan en la misma memoria, son como los números y de hecho puede ser visto como punteros. Los símbolos no son mutables también, un foo símbolo es como un 3 número.

Listas sin embargo no son átomos, dos listas, o cadenas, de vectores con el mismo contenido muy bien pueden residir en dos lugares diferentes de memoria.

eq? pone a prueba en la posición de memoria solamente. eqv? pruebas de equivalencia, lo que es eso es vaga y que depende de la aplicación, la norma esquema es bastante liberal con esto, sólo dice que por lo menos debe ser un superconjunto de eq? básicamente. equal? en las otras pruebas finales en igualdad estructural y lo hace de forma recursiva, por lo que es una operación muy costosa y es por eso que los símbolos son a menudo preferidos a las cadenas de los identificadores.

(define l1 (list 1 2 3))
(define l2 (list 1 2 3))
(eq? l1 l2) ; ===> #f in most implementations
(equal? l1 l2) ; ===> #t in all implementations
(eqv? l1 l2) ; ===> #t in some implementations
(define l3 (cdr l1))
(define l4 (cdr l1))
(eq? l3 l4) ; ===> #t, this means that they 'share memory', if you change l3 or l4, l1 will change with it, beware. This is how car and cdr work, they do not copy.
(define l6 (cons 1 l4));
(eq? l1 l6) ; ===> #f again, cons does allocate new memory, but the tails may very well share it, s in this case, l6 does share its tail with all lists except l2 here in memory. 

Además, un poco de la terminología, contras crea un par, esto es diferente de una lista de dos elementos, se crea un (a . b) par la lista (a b) es, de hecho, idéntica a la par (a . (b . ()))

Además, los contras y coche y CDR son primitivas, la aplicación que aparece a continuación es la manifestación en estructura e implementación de programas de ordenador que demuestra que no se necesitan estrictamente como ellos, pero que tienen como primitivas aumenta drásticamente el rendimiento, así que es mejor no volver a definir su contra, coche y CDR.

> > (define l1 '(a b c))
> > (define l2 (list 'a 'b 'c))
> > l1 (a b c)
> > l2 (a b c)
> > (eq? l1 l2)
> #f
  

Ok, L2 es sólo una lista (es decir, un procedimiento, etc ...) como el que he descrito   morada, pero ... ¿qué es l1? ¿Un símbolo? Una secuencia de caracteres? Y sea lo   es decir, cómo se implementa dentro de la lengua? Gracias!

Una definición tiene la forma:

(definir )

En tiempo de ejecución la expresión es evaluado, y el resultado es un valor. Ese valor se almacena en algún lugar de la memoria. Para utilizar este valor en otros cálculos, se puede utilizar el nombre . El termininology es que está ligada al valor.

Lo importante a destacar es que el nombre sólo aparece en su código fuente. No está presente en tiempo de ejecución. Preguntando si el nombre es l1 Por lo tanto, un símbolo no tiene sentido.

Una posible estrategia para un compilador para traducirlo (definir ) es el siguiente (ignorando que las implementaciones Esquema tienen recolección de basura).

  1. Reserva un m celda de memoria para un puntero p
  2. Código de salida que calcula el valor de v
  3. tienda de la dirección de la celda de memoria que contenga v en la celda de memoria m.

Tenga en cuenta, que el nombre no aparece en esta lista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top