bene, c'è append!
come un primitivo, che risolve la maggior parte dei vostri problemi, come detto già, Scheme tende ad aggrottare le sopracciglia su mutazione, è possibile, ma in genere evitato, quindi tutte le procedure che mutano hanno un !
(chiamato un botto) alla loro fine.
Inoltre, set!
non mutare dei dati, cambia un ambiente, si fa un punto variabile per un'altra cosa, i dati originali rimane invariato.
La modifica dei dati in Schema è piuttosto macchinosa, ma per darti la mia implementazione di append! per vedere come è fatto:
(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 l'uso di set-cdr!
, che è un vero mutatore, funziona solo su coppie, esso muta i dati in memoria, a differenza di `set '!. Se una coppia viene passata a una funzione e mutata con set-cdr! o set-car !, è mutato ovunque nel programma.
Questo obbedisce all'app SRFI! specifica che dice che dovrebbe essere variadic e che dovrebbe restituire un valore indefinito, per esempio.
(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
che visualizza:
(1 2 3 4 2 3 4 3 1)
(2 3 4 3 1)
(3 1)
Come visibile, aggiungere!può prendere un numero infinito di argomenti e li muta tutti tranne l'ultimo.
Schema potrebbe non essere la lingua ideale per te però. L'uso di append! come detto prima è non standard, invece, è preferibile append, che non muta e viene chiamato per il suo valore di ritorno. Che a implementare in quanto tale:
(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)
che mostra uno stile Scheme più familiare in assenza di mutazione, pesante uso di ricorsione e nessun uso di sequenziamento.
Edit: Se si desidera solo aggiungere alcuni elementi a un elenco e non per se unire due però:
(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
che fa quello che ci si aspetta
Grazie per la risposta .. Btw .. 'nonna',' porn' .. Potresti volerli cambiare .. Altrimenti potresti essere giù votato :) –
@ darkie15 Non rende la risposta meno 'utile' o ' chiaro ', se le persone vogliono svenderlo a causa di queste cose, allora questo sito è già perso. Inoltre, hai comunque la tua risposta. =) Inoltre, altre persone possono modificarlo se lo desiderano. – Zorf