AST evaluate() function evaluates it ࣮ͷಛɻߏจղੳ3JQQFSʹ͍ͤͯΔɻ3JQQFSͷग़ྗ Λ؆ུԽͯ͠.JO3VCZͷ"CTUSBDU4ZOUBY5SFFʹม͢Δɻ "45ΛධՁ͢ΔFWBMVBUF ͕ؔΠϯλϓϦλͷਖ਼ମɻ 5SFF8BMLJOH*OUFSQSFUFS
a == 1 "ELSIF" else "ELSE" end if a == 0 "IF" else if a == 1 "ELSIF" else "ELSE" end end ["if", ["==", ["var_ref", "a"], ["lit", 0]], ["lit", "IF"], ["if", ["==", ["var_ref", "a"], ["lit", 1]], ["lit", "ELSIF"], ["lit", "ELSE"]]]
1 v else fact(n-1, v * (n-1)) end end p fact(5000, 1) % ruby interp.rb fact.rb Traceback (most recent call last): 5241: from interp.rb:118:in `<main>' 5240: from interp.rb:33:in `evaluate' 5239: from interp.rb:57:in `evaluate' 5238: from interp.rb:71:in `evaluate' 5237: from interp.rb:45:in `evaluate' 5236: from interp.rb:71:in `evaluate' 5235: from interp.rb:45:in `evaluate' 5234: from interp.rb:71:in `evaluate' ... 5229 levels... 4: from interp.rb:71:in `evaluate' 3: from interp.rb:45:in `evaluate' 2: from interp.rb:57:in `evaluate' 1: from interp.rb:12:in `evaluate' interp.rb:10:in `evaluate': stack level too deep (SystemStackError) ΄Βಈ͔ͳ͍Ͱ͠ΐɻ
tree[0] when "stmts" mark_tail(tree[-1], genv) when "if" mark_tail(tree[2], genv) mark_tail(tree[3], genv) when "func_call" mhd = genv[tree[1]] if mhd == nil || mhd[0] == "user_defined" tree[0] = "tail" end end end tail of statements ذͷೋͭͷࢬΛ୳ࡧ set "tail" two branches of if
mhd = genv[tree[1]] if mhd[0] == "builtin" .... else new_lenv = {} params = mhd[1] i = 0 while params[i] new_lenv[params[i]] = evaluate(tree[i + 2], genv, lenv) i = i + 1 end last = evaluate(mhd[2], genv, new_lenv) while genv["(jump)"] new_lenv = genv["(jump)"][0] jump = genv["(jump)"][1] genv["(jump)"] = nil last = evaluate(jump, genv, new_lenv) end last end (jump) loop
eval not implemented (in Rinda) -JOEBͷͭͷૢ࡞ͱɺPVU JO SE FWBMͰ͢ɻ࠷ॳͷࡾͭ3JOEB Ͱ࣮͞Ε͍ͯͯ·͢ɻૢ࡞ͷ໊લΘ͔Γ͘͢มߋ͠·ͨ͠ɻ ͍͠ͷFWBMͰ͢ɻ͜ΕͲ͏ʹ࣮Ͱ͖·ͤΜͰͨ͠ɻʢͪͳ ΈʹSJOEB@FWBMͱ͍͏αϒηοτ͋Γ·͢ɻʣ
(lazy evaluation??) hard to implement in Ruby because of special behavior Process Migration Dump the context, transfer, and load it. -JOEB FWBMΛ࣮͢ΔͨΊʹೋͭͷ͕͋Γ·͢ɻҾΛධՁ͠ ͳ͍ಛผͳGVOD@DBMM͕ඞཁɻͰ͜͏͍͏ৼΔ͍Λ3VCZͰ࡞Δ ͷࠔͳΜͰ͢Αɻ͋ͱϓϩηεͷҠૹɻ͜ΕίϯςΩετΛ γϦΞϥΠζͯ͠సૹͯ͠ಡΈ͢ͷ͕Ͱ͖Ε͍͍ɻ
&") end ts = Rinda::TupleSpace.new DRb.start_service('drbunix:/tmp/my_ts', ts) Thread.new do while true it = ts.take([:ts_eval, nil, nil, nil, nil]) it[0] = :ts_call ts.write(it) spawn_worker end end ts.take([:quit]) NZ@QMBDFSC5VQMF4QBDFαʔόʔͰ͢ɻUT@FWBMͰ࢝·Δλϓϧ Λͪଓ͚ɺ৽͍͠ϓϩηεΛੜ͠·͢ɻϓϩηεʹͯ͠΄͍͜͠ ͱΛ͑ΔͨΊʹɺUT@DBMMͷλϓϧΛॻ͖·͢ɻ