Kazimir Majorinc Moćan Koliko Je God Moguće
Total Page:16
File Type:pdf, Size:1020Kb
Kazimir Majorinc Moćan koliko je god moguće eval[e; a] = [atom[e] → assoc[e; a]; atom[car[e]] → [eq[car[e]; QUOTE] → cadr[e]; eq[car[e]; ATOM] → atom[eval[cadr[e]; a]]; eq[car[e]; EQ] → eq[eval[cadr[e]; a]; eval[caddr[e]; a]]; eq[car[e]; COND] → evcon[cdr[e]; a]; eq[car[e]; CAR] → car[eval[cadr[e]; a]]; eq[car[e]; CDR] → cdr[eval[cadr[e]; a]]; eq[car[e]; CONS] → cons[eval[cadr[e]; a]; eval[caddr[e]; a]]; T → eval[cons[assoc[car[e]; a]; cdr[e]]; a]]; eq[caar[e]; LABEL] → eval[cons[caddar[e]; cdr[e]]; cons[list[cadar[e]; car[e]]; a]]]; eq[caar[e]; LAMBDA] → eval[caddar[e]; append[pair[cadar[e];evlis[cdr[e];a]]; a]]] Kazimir Majorinc: Moćan koliko je god moguće Glavne ideje Lispa u McCarthyjevom periodu Multimedijalni institut ISBN 978-953-7372-28-6 CIP zapis je dostupan u računalnome katalogu Nacionalne i sveučilišne knjižnice u Zagrebu pod brojem 000910180. Zagreb, srpanj 2015. Ova knjiga dana je na korištenje pod licencom Creative Commons Imenovanje ∞ Bez prerada 4.0 međunarodna. Kazimir Majorinc Moćan koliko je god moguće Glavne ideje Lispa u McCarthyjevom periodu Multimedijalni institut Sadržaj 1. Uvod → 10 2. Rani utjecaji na McCarthyja → 13 2.1. Tehnološki entuzijazam → 14 2.2. Konačni automati i eksplicitne reprezentacije činjenica → 14 2.3. Digitalna računala kao inteligentni strojevi → 16 3. Dartmouthški projekt → 17 3.1. Jezik inteligentnih računala → 18 3.2. Između IPL-a i Fortrana → 19 4. FLPL → 20 4.1. Operacije nad riječima → 21 4.2. Liste → 22 4.3. Kreiranje lista → 23 5. Prijedlog kompajlera → 26 5.1. Programski jezik kao koordinatni sustav → 27 5.2. Sloboda programera → 28 5.3. Logičke vrijednosti i funkcije → 28 5.4. Funkcija if → 29 5.5. Sintaksa → 29 5.6. Liste → 30 5.7. Funkcije s višestrukim vrijednostima i kompozicija funkcija → 30 6. Prijedlog programskog jezika → 32 6.1. Uvjetna naredba → 33 6.2. Go to naredba → 33 6.3. Makro naredba → 34 6.4. Funkcije višeg reda → 35 6.5. Lambda-izrazi → 36 7. Imperativni Lisp → 37 7.1. Imperativni i algebarski jezik → 40 7.2. Osnovni tipovi i naredbe → 41 7.3. Potprogrami i “funkcije” → 43 7.4. Simbolički izrazi → 44 7.5. Liste svojstava → 45 7.6. Liste i reprezentacija simboličkih izraza → 45 7.7. Funkcije za analizu i sintezu riječi i referenciranje → 48 7.8. Upravljanje slobodnom memorijom → 49 7.9. Osnovne operacije nad cijelim listama → 50 7.10. Funkcija maplist → 51 8. Elementi funkcionalnog programiranja → 53 8.1. Nova funkcija maplist → 54 8.2. McCarthyjevi lambda-izrazi → 55 8.3. Pojednostavljenje jezika → 58 8.4. Implementacija rekurzivnih funkcija → 60 8.5. Funkcionalni i imperativni stil → 60 8.6. Nede∫nabilnost funkcije list → 61 8.7. Supstitucijske funkcije i funkcija apply → 62 8.8. Pomoćne funkcije i implementacija apply → 63 8.9. Automatizirano upravljanje memorijom → 66 8.10. Rochesterovi lambda izrazi → 66 8.11. Formatiranje programa → 67 8.12. Kompozicije funkcija car i cdr → 67 8.13. Funkcija compute → 67 9. Čisti Lisp → 68 9.1. Matematički izrazi → 72 9.2. Uvjetni izrazi → 72 9.3. Rekurzivno i simultano rekurzivno de∫nirane funkcije → 73 9.4. Lambda-izrazi → 74 9.5. Label-izrazi → 75 9.6. Slobodne i vezane varijable → 76 9.7. Primjedba o simultano rekurzivnim funkcijama → 77 9.8. De∫nicija simboličkih izraza → 77 9.9. Razlika u odnosu na prethodne de∫nicije → 78 9.10. Meta-izrazi → 80 9.11. S-funkcije → 80 9.12. Elementarne S-funkcije → 81 9.13. Primjedbe uz McCarthyjevo de∫niranje S-funkcija → 83 9.14. Primjeri ne-elementarnih S-funkcija → 85 9.15. Pokrata i funkcija list → 89 9.16. Funkcije kao argumenti funkcija → 89 9.17. Primjedba o eliminiranju pokrata i ne-elementarnih S-funkcija → 90 9.18. Prevođenje M-izraza u S-izraze → 92 9.19. Primjedbe o prevođenju M-izraza → 95 9.20. Matematička de∫nicija S-funkcije eval → 97 9.21. S-funkcija eval → 101 9.22. Primjedbe uz de∫niciju funkcije eval → 103 9.23. Univerzalna S-funkcija apply → 105 9.24. Interpreter za Lisp → 106 9.25. S-funkcije i teorija izračunljivosti → 107 9.26. Simulacija Turingovih strojeva S-funkcijom → 108 9.27. Pitanja o S-funkcijama neodlučiva S-funkcijom → 114 9.28. Programi kao S-funkcije → 116 9.29. Predstavljanje simboličkih izraza u memoriji računala → 117 9.30. Razlike između simboličkih izraza i struktura lista → 118 9.31. Garbage collection → 119 10. Linearni Lisp → 121 10.1. L-izrazi → 122 10.2. Elementarne funkcije → 123 10.3. Izdvajanje podizraza → 124 11. Binarni Lisp → 125 12. Slagleov jezik za manipulaciju simbola → 127 13. Simbolički izrazi kao sintaksa jezika → 129 14. Fortranolike naredbe, funkcija program, moć i multiparadigmatičnost Lispa → 132 14.1. Kodiranje stanja stroja i fortranolikih naredbi → 133 14.2. S-funkcija program → 134 14.3. Simultano izvršavanje fortranolikih naredbi i uređaj među simbolima → 135 14.4. Multiparadigmatičnost Lispa → 135 14.5. Moć jezika sa stanovišta programera → 137 15. Woodward-Jenkinsova aritmetika → 139 16. Lisp 1.5 → 142 16.1. Čisti Lisp → 144 16.2. Upotreba liste svojstava → 147 16.3. Pseudofunkcije → 149 16.4. Specijalne forme → 151 16.5. Fexprovi → 151 16.6. Programi u LISP-u → 153 16.7. Funkcionalni argumenti → 155 16.8. Specijalni operator prog → 158 16.9. Gensym i oblist → 159 16.10. Simboli T, *T* i NIL → 161 16.11. Aritmetika → 162 16.12. Polja → 163 16.13. Logika → 163 17. Matematička teorija izračunavanja → 165 17.1. Funkcije de∫nirane osnovnim funkcijama → 167 17.2. Funkcionali → 167 17.3. Uklonjivost label-izraza → 168 17.4. Uvjetni izrazi nisu funkcije → 171 17.5. Neizračunljive funkcije → 171 17.6. Višeznačne funkcije → 172 17.7. Rekurzivna de∫nicija skupa simboličkih izraza → 172 17.8. Rekurzivna indukcija → 173 17.9. Apstraktna sintaksa programskih jezika → 174 17.10. Semantika → 176 18. Gilmoreov lispoliki jezik → 178 18.1. Uvjetni izrazi → 179 18.2. Quote i label → 179 18.3. Apstraktni stroj → 180 19. Memoizacija → 182 20. Nova funkcija eval → 186 20.1. Prošireni Lisp → 187 20.2. Novi eval → 188 20.3. Autonimi lambda i label → 189 21. Prve primjene Lispa → 190 Slike → 195 Bibliogra∫ja → 196 Moćan koliko je god moguće Glavne ideje Lispa u McCarthyjevom periodu 1. Uvod “In developing LISP our first goal is to describe a lan- guage which is as powerful as possible from the point of view of the programmer.” 1 Većina programera se prvi puta susreće s Lispom preko nekog od brojnih citata i aforizama u kojima se, ponekad i preko mjere, ističu ljepota, elegancija i moć jezika. Tako se, primjerice, razumijevanje Lispa naziva prosvjet ljenjem; tvrdi se da iskustvo programiranja u Lispu čini programera boljim, čak i ako nikad u životu ne bude ko ristio Lisp. Jeziku se, doduše u šali, pripisuju mistična svojstva; bog (ili bogovi) su svijet napisali u Lispu, a Lisp zajednica se opisuje kao kult. Odluči li programer proučiti Lisp, zacijelo će zaključiti da je Lisp začuđujuće moćan, ali jednako tako začuđujuće jednostavan programski jezik. Moć je manje upitna; želi li dizajner jezika stvoriti moćan jezik, uloži li dovoljno vre mena i napora, teško da neće i uspjeti. Jednostavnost je čudna; ona ostavlja dojam da je Lisp otkriven, a ne stvo ren. Sličan su dojam imali i članovi ARTIFICIAL INTELLI- GENCE projekta na američkom MITju koji su razvili Lisp, zamišljen kao moćan, ali praktičan i vrlo složen jezik. Suprotno onome što bi se moglo očekivati, Lisp je tijekom razvoja postajao sve jednostavniji. Tek kad je glavni dizaj ner, John McCarthy napisao članak kojim je Lisp predsta vljen javnosti, članovi projekta su prepoznali Lisp kao “predmet ljepote” i sam vrijedan proučavanja. Narednih desetljeća, neki članovi Lisp zajednice su pokušali jezik učiniti još općenitijim, moćnijim, jednostav nijim, korektnijim opisom načina na koji programeri raz mišljaju. Drugi, brojniji pokušaji unapređenja potaknuti su željom da se jezik učini efikasnijim, praktičnijim, popu larnijim, možda čak i profitabilnijim. Čak i kad su radili kompromise, dizajneri su nastojali identificirati, zadržati, možda i unaprijediti bitne kvalitete jezika. Lisp je utjecao na druge programske jezike. U manjoj mjeri, i drugi pro gramski jezici su utjecali na Lisp. Različiti motivi, priori teti i rješenja doveli su do raspada i fragmentacije zajedni ce i razvoja brojnih, znatno različitih dijalekata i zajednica okupljenih oko dijalekata. 1 McCarthy, Programs in Lisp, AIM012, 1959., str. 4. 11 U uvjetima fragmentacije zajednice i postojanja broj nih tumačenja osnovnih ideja, onaj tko želi razumjeti Lisp teško može izbjeći povijesni pristup; upoznavanje s ideja ma u obliku koji su imale kad su nastajale. Najzanimljivi ji period je pri tome, u pravilu, onaj najraniji. Ova knjiga pokušava izložiti nastajanje i razvoj glavnih ideja Lispa tijekom prvih nekoliko godina u kojima je John McCarthy vodio razvoj jezika. Pokušaja sistematičnog izlaganja glavnih ideja Lispa u ranom periodu je već bilo. Sam je McCarthy održao ne koliko predavanja i napisao nekoliko članaka o toj temi. Ranu povijest Lispa je daleko najviše istraživao Herbert Stoyan. Osim Stoyanove knjige LISP, Anwendungsgebie- te, Grundbegriffe, Geschichte iz 1980., izdane samo na nje mačkom jeziku i danas teško dostupne, svi radovi o povi jesti Lispa pisani su u obliku za čije je razumijevanje pot rebna već dobra upućenost u Lisp. Ova knjiga pisana je tako da bude razumljiva svakom programeru s malo isku stva u bilo kojem programskom jeziku. Tijekom pisanja knjige, autor je održao nekoliko dese taka izlaganja u Hacklabu Mama u Zagrebu. Diskusije s članovima Hacklaba su u velikoj mjeri utjecale na sadržaj i oblik knjige. U izvornim dokumentima, ime Lisp je obično pisano velikim slovima: LISP. U knjizi se koristi danas uobičajen i praktičniji način pisanja: Lisp. Izvorni način pisanja za držan je samo pri citiranju.