Scheme - listy

0

Witam,

otóż chciałem się zapytać, jak po zadeklarowaniu listy można ją wypełaniać?? Bo tylko łatwo to wygląda kiedy

(define lista (list 1 2 3 4 5 6))

Bo to totalne zło i nie rozumiem tych zasad ogona i ŋłowy. I dlaczego nie mogę nic tutaj znaleźć na temat iteracji??

Z góry dziękuję za odpowiedzi

A tak BTW. Wesołych świąt!!!

0

Nie pisałem nigdy w lispie, ale jeśli wygląda to tak jak w ocamlu, erlangu i tym podobnych języka to zasady są proste:

  1. Nie ma czegoś takiego jak iteracja, zastępuje ja rekurencja, najlepiej ogonowa.
  2. Lista składa się z głowy (która jest elementem) oraz z ogona (który jest listą). Jeśli chcesz przelecieć przez całą listę to robisz to tak:
    Tworzysz funkcję która przyjmuje jako argument listę, następnie rozbija tą listę na głowę (to będzie element który przetwarzasz) oraz na ogon (to będzie argument z którym ponownie wywołasz tą funkcję rekurencyjnie). Jeśli argumentem jest lista pusta, to po prostu wracamy z funkcji. Jeśli nie, to rozbijamy, wykonujemy operacje na głowie i wywołujemy rekurencję na ogonie.

Czyli dla przykładu: chcemy wypisać elementy listy. Nasza lista to np. [1,2,3,4], funkcja nazywa się wypisz(lista).
Wywołujemy funkcję z argumentem:
wypisz([1,2,3,4]):
dzielimy listę na head=1 i tail = [2,3,4],
wypisujemy head, wywołujemy funkcję na ogonie
wypisz([2,3,4]):
dzielimy listę na head=2 i tail = [3,4],
wypisujemy head, wywołujemy funkcję na ogonie
wypisz([3,4]):
dzielimy listę na head=3 i tail = [4],
wypisujemy head, wywołujemy funkcję na ogonie
wypisz([4]):
dzielimy listę na head=4 i tail = [],
wypisujemy head, wywołujemy funkcję na ogonie
wypisz([]):
lista jest listą pustą, więc wracamy

Oczywiście jezyki funkcyjne optymalizują sobie wywołania ogonowe i to wszystko odbywa się w tej samej ramce stosu, ale dla początkującego to raczej taka ciekawostka

0

Możesz dać krótki przykład??

0

Jasne, ale nie w lispie, bo nie chce mi się w wigilię przeglądać tutoriala do niego :P
erlang:

wypisz([])->
	io:format("~n",[]);
wypisz([H|T])->
	io:format("~w",[H]),
	wypisz(T).

Ocaml:

let rec wypisz = fun lista -> match lista with
	| [] -> print_endline
	| h::t -> print_string (string_of_int h); wypisz(t);;

1 użytkowników online, w tym zalogowanych: 0, gości: 1