Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scheme Interpreter in Ruby

Scheme Interpreter in Ruby

社内LT大会 0x64物語 #04 Compiler / Interpreter 資料

HORINOUCHI Masato

January 26, 2016
Tweet

More Decks by HORINOUCHI Masato

Other Decks in Programming

Transcript

  1. Scheme Interpreter in Ruby 2016/01/26 0x64 Tales #04 Compiler /

    Interpreter Livesense Inc. HORINOUCHI Masato
  2. Fibonacci number (Scheme) (define (fib n) (cond ((= n 0)

    0) ((= n 1) 1) (else (+ (fib (- n 2)) (fib (- n 1))))))
  3. Fibonacci number (Ruby) def fib(n) case n when 0 0

    when 1 1 else fib(n-2) + fib(n-1) end end
  4. ΋͠ಈతείʔϓͩͱͨ͠Β… ((lambda (x) ((lambda (fun) ((lambda (x) (fun)) 1)) (lambda

    () x))) 2) # => 1 ↑ಈతείʔϓͷ Emacs Lisp Ͱ͸্هͷίʔυͰ 1 ͕ฦΓ·͢ɻ
  5. ΋͠(ུ) (Ruby൛) (lambda { |x| (lambda { |fun| (lambda {

    |x| fun.call }).call(1) }).call(lambda { x }) }).call(2) ͪͳΈʹ Ruby ͸੩తείʔϓͳͷͰɺ͋͘·ͰίʔυͷΘ͔Γ ΍͢͞ͷ࿩ɻ Scheme ͱ͋·ΓมΘΒͳ͍ͷ͸ώϛπ…ɻ
  6. ΋͠(ུ) (y ʹมߋ) ((lambda (x) ((lambda (fun) ((lambda (y) (fun))

    1)) (lambda () x))) 2) # => 2 ↑಺ଆͷ (x) Λ (y) ʹม਺໊มߋ͚ͨͩ͠Ͱ 2 ʹͳΔɻ
  7. ؀ڥϞσϧ • ֎ଆͷ lambda x ͱ಺ଆͷ lambda x Λ۠ผ͢Δඞཁ͕͋Δɻ •

    ֎ଆͷ lambda ΛධՁ͍ͯ͠Δͱ͖͸ {x: 2} ͱ͢Δɻ • ಺ଆͷ lambda ΛධՁ͍ͯ͠Δͱ͖͸ {x: 1} ͱ͢Δɻ • ਅΜதͷ lambda fun ΛධՁͨ͠ࡍʹɺλࣜͱධՁ࣌ͷ؀ڥΛϖ Ξͱͯ͠ΫϩʔδϟʔΛฦ͢ɻ
  8. ࣮૷ • Ruby ͷ _eval ؔ਺ͱ apply ؔ਺Λ࣮ߦ͍ͯ͘͠ • Scheme

    ͷϦετ͸ Ruby ͷ Array • Scheme ͷ؀ڥ͸ Ruby ͷ Hash ͷ Array • Scheme ͸ Lisp-1 ͳͷͰɺHash ͷ Array ͸1͚ͭͩͰ okܥɻ
  9. _eval def _eval(exp, env) if not list?(exp) if immediate_val?(exp) exp

    else lookup_var(exp, env) end else if special_form?(exp) eval_special_form(exp, env) else fun = _eval(car(exp), env) args = eval_list(cdr(exp), env) apply(fun, args) end end end
  10. lookup_var ͱ extend_env def lookup_var(var, env) alist = env.find {

    |alist| alist.key?(var) } if alist == nil raise "couldn't find value to variables: '#{var}'" end alist[var] end def extend_env(parameters, args, env) alist = parameters.zip(args) h = Hash.new alist.each { |k, v| h[k] = v } [h] + env # ↑ ্هͰ env.find ͯ͠ΔͷͰ Array ͷઌ಄ʹ௥Ճ͢Δͷ͕ॏཁɻ end
  11. parse def parse(exp) program = exp.strip(). gsub(/[a-zA-Z\+\-\*><=][0-9a-zA-Z\+\-=!*]*/, ':\\0'). gsub(/\s+/, ',

    '). gsub(/\(/, '['). gsub(/\)/, ']') eval(program) end ↑࠷ޙʹ Ruby ͷ eval ͯ͠Δɻ
  12. Next Step ܭࢉػϓϩάϥϜͷߏ଄ͱղऍ (௨শ SICP) MITͷೖ໳ίʔεͰ࢖͏ܭࢉػՊֶͷ༏ ΕͨڭՊॻ ϋϧɾΤΠϒϧιϯ, δΣϦ ʔɾαεϚϯ,

    δϡϦʔɾαεϚϯڞஶ(࿨ ాӳҰ༁)ʮܭࢉػϓϩάϥϜͷߏ଄ͱղ ऍ ୈೋ൛ʯ(ϐΞιϯɾΤσϡέʔγϣϯ 2000೥). දࢴͷຐज़ࢣΏ͑ʹͦ͏͍ΘΕ Δ. LISP/Schemeੈքͷ੟యͷͻͱͭ. ← ਤʹ "Eval / Apply" ͷଠۃਤ (Tao) ͕ඳ ͔Ε͍ͯΔͷʹ͝஫໨ɻ