Cóż, jest append!
jako prymitywne, która rozwiązuje większość problemów, jak zauważył już, Schemat wydaje się krzywić w przypadku mutacji jest to możliwe, ale zazwyczaj unikane, więc wszystkie procedury, które mutują, mają na końcu koniec !
(zwany hukiem).
Ponadto, set!
nie zmienia danych, zmienia środowisko , zmienia punkt na inną rzecz, oryginalne dane pozostają niezmienione.
Mutowanie danych w Schemacie jest dość kłopotliwe, ale w celu uzyskania własnej implementacji dołączenia! aby zobaczyć, jak to się robi:
(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))))
Uwaga wykorzystanie set-cdr!
, który jest prawdziwym mutator, to działa tylko w parach, to mutuje dane w pamięci, w przeciwieństwie do `set„!. Jeśli para zostanie przekazana do funkcji i zmutowana za pomocą set-cdr! lub set-car !, jest zmutowany w każdym miejscu programu.
Jest to zgodne z załącznikiem SRFI! spec, która mówi, że powinna być zmienna i że powinna zwracać na przykład niezdefiniowaną wartość.
(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
który wyświetla:
(1 2 3 4 2 3 4 3 1)
(2 3 4 3 1)
(3 1)
Jak widać, dołącz!może wziąć nieskończoną liczbę argumentów i mutuje je wszystkie oprócz ostatniego.
Schemat może nie być idealnym językiem dla Ciebie. Korzystanie z append! jak wspomniano wcześniej, jest niestandardowy, zamiast tego preferowany jest append, który nie mutuje i jest nazywany wartością zwracaną. Które zaimplementować jako takie:
(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)
który pokazuje bardziej znajomy styl programu w przypadku braku mutacji, intensywnego użytkowania rekursji i bez użycia sekwencjonowania.
Edycja: Jeśli chcesz po prostu dodać kilka elementów do listy, a nie per se dołączyć dwa choć:
(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
która robi to, czego oczekują
Dzięki za odpowiedź .. Btw .. 'babcia',' porno' .. Możesz chcieć je zmienić .. Inaczej możesz dostać głosowanie :) –
@ darkie15 To nie czyni odpowiedzi mniej "użyteczną" lub " jasne ", jeśli ludzie chcą to zrobić z powodu tych rzeczy, to ta strona jest już zagubiona. Zresztą i tak masz odpowiedź. =) Poza tym inne osoby mogą je edytować, jeśli zechcą. – Zorf