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:
- Nie ma czegoś takiego jak iteracja, zastępuje ja rekurencja, najlepiej ogonowa.
- 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