Sitat av
meeh
Lisp er ekstremt ulikt andre språk som python, php, java, c og c++. Lærer deg å bli en betre programmerer av å lære deg det, for du må tenke på helt andre måter.. F.eks Lisp Scheme.. Den første implementasjonen AFAIK. har f.eks ikke loops.. E.g ingen "for" eller "while"
Så en funksjon må kalle på seg selv flere ganger mens et globalt variabel teller f.eks.
https://en.wikipedia.org/wiki/Scheme...ng_language%29
Bruker litt Common Lisp på jobb.
Veldig enig der!
Etter å ha lært Lisp har stilen min i andre språk (til og med i et lavnivåspråk som C) endret seg ganske mye. Det samme gjelder nesten samtlige jeg kjenner (noen har parentes-allergi og har ikke kommet seg over syntaksen, som for øvrig kanskje er teknisk sett den enkleste syntaksen i noe som helst språk).
Det negative med å lære Lisp er at en etter hvert ser hvor mye andre språk mangler, eller hvor store omveier de går for å gjøre ting, syns jeg i alle fall. Konsepter fra funksjonell programmering som høyere ordens funksjoner, anonyme funksjoner, closures osv. har først nå begynt å komme skikkelig i vinden -- dette er noe Lisp-språkene har hatt i ca. 50 år. Lisp var jo også det første språket med en garbage collector.
Scheme er forresten ikke den første implementasjonen. John McCarthy (oppfinneren) implementerte selv Lisp på MITs maskiner, den første kompilatoren var ferdig i 1962. I løpet av 70-tallet ble det utviklet såkalte Lisp-maskiner, som faktisk kjørte Lisp-kode rett på hardwaren (altså med dedikerte kretser for cons/car/cdr, listemanipulering osv. -- ikke kompilering til en eller annen generell prosessorarkitektur). Scheme dukka først opp i 1975 og skilte seg i grunn litt ut fra de andre Lisp-dialektene ved å være veldig minimalistisk.
Looping i Scheme er som du sier ganske annerledes; man må utelukkende bruke rekursive funksjoner for å iterere. Det er ikke helt riktig at man bruker en global variabel for å iterere. Litt av poenget er jo at man ønsker å unngå endrende state så mye som mulig. I stedet er det vanlig å la telleren være et argument til funksjonen. Ganske ofte trenger man jo heller ikke en teller; hvis funksjonen bare skal gå gjennom en liste vet man jo at man skal stoppe når lista er tom. Heldigvis har Scheme halekallsoptimalisering, så en rekursiv funksjon som utfører det samme som en vanlig loop i et imperativt språk ville gjort, blir like effektiv.