Rezolvat Implementarea limbajelor funcționale haskell leneșe
Atunci când implementați un limbaj funcțional leneș, este necesar să stocați valori neevaluate, pentru a fi evaluate numai atunci când este necesar.

Una dintre provocările implementării eficiente, așa cum s-a discutat în, de exemplu, La Veule Tagless G-machine, este că această evaluare trebuie să fie efectuată o singură dată pentru fiecare thunk și cererile de „Acces trebuie să refolosească valoarea calculată - fără a face acest lucru așa că ar duce la o încetinire cel puțin pătratică (poate exponențială? Nu sunt sigur că mi-a trecut peste cap.)
Caut un exemplu simplu de implementare care funcționează ușor (spre deosebire de o forță industrială de implementare precum GHC, care este concepută pentru performanță în detrimentul simplității). Am întâlnit minihaskell la http://www.andrej.com/plzoo/ care conține următorul cod.
Întrucât este supranumit „performer eficient”, presupun, de fapt, că rularea fiecărei evaluări o singură dată și salvarea valorii calculate pentru reutilizare, dar am probleme să văd unde și cum? 'Sau' ce; Văd o singură declarație de atribuire în interpretul în sine, iar asta nu pare a suprascrie o parte a unei înregistrări thunk.
Întrebarea mea este, deci, este acesta un interpret care să facă astfel de cache și, dacă da, unde și cum? (Și dacă nu, care este cea mai simplă implementare existentă?)
Răspunsuri
Principalele sunt fișierele: avis,! R, r: = v. De fiecare dată când căutăm o variabilă de mediu, returnăm o înregistrare, pe care o referim pentru a vedea dacă este o greșeală. Dacă este o greșeală, o evaluăm și apoi salvăm rezultatul. Creăm thunks în timpul aplicației (rețineți apelul către constructorul ref), definiții recursive și potrivirea modelelor, deoarece acestea sunt constructe care leagă variabile.