2010-06-11 5 views
5

Comencé a aprender Scheme, principalmente por diversión, y porque nunca antes había usado un lenguaje funcional. Elegí Scheme porque quería leer SICP durante mucho tiempo.¿Por qué el uso de contras para crear un par de dos listas produce una lista y dos elementos?

De todos modos, actualmente estoy aprendiendo sobre listas, y antes de eso aprendí sobre contras, coche y cdr. Y hay un ejemplo que crea una lista de listas con los contras, así:

(cons (list 1 2) (list 3 4)) 

La lista resultante es ((1 2) 3 4), lo cual no tiene sentido para mí, yo esperaría que ((1 2) (3 4)) para ser el resultado (una lista hecha de dos listas). ¿Por qué se comporta así? Me doy cuenta de que si tuviera que usar un automóvil, obtendría (1 2) y obtendría cdr (3 4) porque cdr siempre devuelve "el resto", pero no entiendo por qué la lista no está hecha. de dos listas?

+1

Esta pregunta es ligeramente diferente, pero las respuestas responden exactamente a su pregunta: http://stackoverflow.com/questions/2921912/in-sicp-exercise-2-26-using-drscheme-why-does-cons-return -a-list-instead-of-ap –

+1

¿por qué haría una lista con CONS cuando hizo una lista con LIST? ¿Por qué no seguir utilizando LIST para hacer listas? CONS no hace lo mismo que LISTAR - por eso también son funciones diferentes. –

+0

Fue un ejercicio en SICP – fingerprint211b

Respuesta

9

Obtiene una lista con (1 2) como el primer elemento (el automóvil) y (3 4) como el resto (cdr) porque el primer argumento para contras es el primer elemento de la lista y el segundo argumento es una lista que contiene el artículos.

Esto se asemeja mucho a la estructura de una lista: cada nodo de una lista (adecuada) contiene un elemento y una lista que contiene todos los demás elementos. cons crea uno de esos nodos.

Si el segundo argumento para cons se convertiría en el segundo elemento de la lista, ¿cómo crearía una lista con tres argumentos? Tendría que hacer 0 cons en términos díblicos, en ese punto, sería otro nombre para list.

Si desea crear una lista de listas, use (list (list 1 2) (list 3 4)).

+0

Gracias, eso ayudó. – fingerprint211b

+0

'(1 2)' es el coche, no el cdr, y '(3 4)' es el cdr. – Zorf

+0

@Lajla: Bah, por supuesto. Fijo. – sepp2k

1
list A: [ |  ] 
      1 [ | ] 
       2/

list B: [ |  ] 
      3 [ | ] 
       4/

====================== 

(cons A B) 

[   |   ] 
[ |  ] [ |  ] 
    1 [ | ]  3 [ | ] 
     2/  4/

Una representación gráfica de las estructuras internas puede ayudarnos a visualizar el problema.

Y esto ayudará un poco más:

[   |   ] 
    X  [ |  ] 
       3 [ | ] 
        4/

¿Ves el patrón? Lo anterior es la lista (X 3 4). Esa es la razón por la que (cons A B) solo dibuja la parte car como una lista separada y no como cdr.

3
(list (list 1 2) 
     (list 3 4)) 

es la misma que

(cons (list 1 2) 
     (cons (list 3 4) 
      '())) 

que resulta en

((1 2) (3 4)) 

que también se puede escribir como

((1 . (2 .())) 
. 
((3 . (4 .())) 
    . 
())) 
0

Debido a que una de las células contras es no una lista de dos elementos, los dos a menudo se confunden. Si (a . b) es una celda de cons, entonces (a . (b .())) es una lista de dos elementos. Cualquier lista segura de la lista vacía específicamente es una celda de cons cuyo campo de auto contiene el primer elemento y cuyo campo cdr contiene la lista que contiene los elementos restantes. Una lista es simplemente un árbol binario cuya hoja más a la derecha es la constante especial () o nil dependiendo de su dialecto.

¿Cuál es la razón por (cons 0 '(1 2 3)) evalúa a (0 1 2 3) y no (0 (1 2 3)) creamos una célula contras cuyo coche es 0, y cuyo cdr es (1 2 3), por lo que una lista de (0 1 2 3).

Cuestiones relacionadas