--[[
       lazy evaluation of Fibonacci sequence with big numbers
--]]
local bc = require "bc"

-- describe a recurrence relation for Fibonacci numbers
local function fibRecurrence(seq, n)
       if rawget(seq, n) then return rawget(seq, n) end;
       table.insert(seq, bc.add(seq[#seq], seq[#seq - 1]))
       return fibRecurrence(seq, n)
end

-- describe a list with initial values 0 and 1 with fibRecurrence relation
local fibonacci = setmetatable({0,1}, {__index=fibRecurrence})

-- describe action to print 10000th element
local main = function () print(fibonacci[10000]) end

-- desribe entry-point
return main()

--[[
$ lua fibonacci.lua | fold -w79
2079360823713349807211264898864283682508703609401590311968294586652850142345568
6648927456034305226515591757343297190158010624794267250973176133810179902738038
2317897483462355564831914315919245323944200280678103204087244146934628490626683
8708330804825092065449334087873322637758084744632487379760373479464825811385863
1550404081017260381202919943892370942852601647398213554479081823593715429566945
1493129936648467790904377992847736753792842706601751346648332663776986420121068
9135579114187277693408080350495679409464829288056605636471818766266897075853738
3352677420835574155945658542003634765324541006121012446785689171494803262408602
6930912116019739382294466360499015319632861596990778804277202892355393296718771
8291564341907918652511867885682160089752017107049943765706734240087108390881180
0976259727431820539554256869460815355918458253398234382360435762759823179896116
7484242695459246332046141379928508143520187384809235815539889908971514694061316
9561449778372074346137375621868510685682609069633981549092125371453724186691160
4250597353747823733268178182198509240226955826416016690084749816072843582488613
1848299053831501800478443537515542015738331055219809981238332532612286898240517
7784658846107979080782836713238479845179401107656905752215868037896153216085838
7223882974380483931929541222100800313580688585002598879566463221427820448492565
0731065958088374016489964235633861097820456341224678729218456064091743606356182
1688381256232166444282295253757749271536532113420453068674243545450510326976814
4370118494906390254934942358904031509877369722437053383165360388595116980245927
9352259015376349256548723808771830083010745694440024264364147569050945350728047
6468449210568002473991449055590439136921869638709291818924615710345038705022930
0603241611410707453960080170928277951834763216705242485820801423866526633816082
9214428830954632590804718193292017101478280252213856563402074897963176632788722
0760779103443170011275355881347888872750382538906682309868335569571813786788298
2111710796422706778536913192342733364556727928018953989153106047379741280794091
639429908796650294603536651238230626
--]]