Guest User

Untitled

a guest
Jun 19th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.76 KB | None | 0 0
  1. require 'object'
  2.  
  3. def for_each(list)
  4. loop do
  5. yield(list.car)
  6. list = list.cdr
  7. return if list.nil?
  8. end
  9. end
  10.  
  11. def map(list)
  12. [].tap do |r|
  13. loop do
  14. r << yield(list.car)
  15. list = list.cdr
  16. return r if list.nil?
  17. end
  18. end
  19. end
  20.  
  21.  
  22. class Evalator
  23. def initialize env
  24. @env = env
  25. end
  26.  
  27. def myeval(expr)
  28. if expr.respond_to?(:car)
  29. fn = expr.car
  30. args = map(expr.cdr){|e| myeval(e)}
  31. find(fn).call(*args)
  32. else
  33. expr
  34. end
  35. end
  36.  
  37. def find(sym)
  38. return @env[sym]
  39. end
  40. end
  41.  
  42. if __FILE__ == $0
  43. e = Evalator.new({:+ => lambda{|*args| args.inject(0){|s,n| s + n}}})
  44. Cons::list(:+, 1, 2)
  45. # for_each(Cons::list(:+, 1, 2)){|e| p e}
  46. # p map(Cons::list(:+, 1, 2)){|e| e}
  47. p e.myeval(Cons::list(:+, 1, 2))
  48. end
Add Comment
Please, Sign In to add comment