Mutar los datos en Scheme es bastante engorroso, pero, para darle mi propia implementación de append! para ver cómo se hace:
(define (append! lst . lsts)
(if (not (null? lsts))
(if (null? (cdr lst))
(begin
(set-cdr! lst (car lsts))
(apply append! (car lsts) (cdr lsts)))
(apply append! (cdr lst) lsts))))
Nota el uso de set-cdr!
, que es un verdadero mutador, que sólo funciona en pares, que muta de datos en la memoria, a diferencia de `set '!. Si un par se pasa a una función y se muta con set-cdr! o set-car !, está mutado en todas partes en el programa.
¡Esto obedece a SRFI append! especificación que dice que debe ser variadic y que debe devolver un valor indefinido, por ejemplo.
(define l1 (list 1 2 3 4))
(define l2 (list 2 3 4))
(define l3 (list 3 1))
(append! l1 l2 l3)
l1
l2
l3
que muestra:
(1 2 3 4 2 3 4 3 1)
(2 3 4 3 1)
(3 1)
Como es visible, anexar!puede tomar una cantidad infinita de argumentos y los muta todos menos al último.
Es posible que el esquema no sea el idioma ideal para usted. El uso de append! como se dijo antes no es estándar, en su lugar, se prefiere agregar, que no cambia y se solicita su valor de retorno. ¿Qué debo hacer para implementar tales como:
(define (append . lsts)
(cond
((null? lsts) '())
((null? (car lsts)) (apply append (cdr lsts)))
(else (cons (caar lsts) (apply append (cdar lsts) (cdr lsts))))))
> (append (list 1 2 3) (list 4 5 6) (list 'granny 'porn))
(1 2 3 4 5 6 granny porn)
la cual muestra un estilo Esquema más familiar en la ausencia de la mutación, un uso intensivo de la recursividad y no uso de la secuenciación.
Editar: Si lo que desea es añadir algunos elementos a una lista y no es per se une a dos sin embargo:
(define (extend l . xs)
(if (null? l)
xs
(cons (car l) (apply extend (cdr l) xs))))
(define (extend! l . xs)
(if (null? (cdr l))
(set-cdr! l xs)
(apply extend! (cdr l) xs)))
(extend '(0 1 2 3) 4 5 6)
(define list1 '(0 1 2 3))
(extend! list1 4 5 6)
list1
que no es lo que esperas
Gracias por la respuesta .. Btw .. 'abuelita',' porno' .. Es posible que desee cambiarlos .. De lo contrario, podría bajar votó :) –
@ darkie15 No hace que la respuesta sea menos 'útil' o ' claro ', si la gente quiere rechazarlo debido a esas cosas, entonces este sitio ya está perdido. Además, tienes tu respuesta de todos modos. =) Además, otras personas pueden editarlo si lo desean. – Zorf