Chervil is a toy Lisp interpreter written in Ruby
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

function.rb 857B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. module Chervil::AST
  2. class Function
  3. attr_reader :name
  4. attr_reader :params
  5. attr_reader :body
  6. def initialize(name, params, body)
  7. @name = name
  8. @params = params
  9. @body = body
  10. end
  11. def ==(other)
  12. @name == other.name && @params == other.params && @body == other.body
  13. end
  14. def evaluate(env)
  15. self
  16. end
  17. def call(args)
  18. unless @params.size == args.size
  19. raise "Expected #{params.size} arguments but received #{args.size}"
  20. end
  21. env = ::Chervil::Env.new
  22. @params.zip(args).each do |key, value|
  23. env.set(key.name, value)
  24. end
  25. current_expr = nil
  26. @body.each do |expr|
  27. current_expr = expr.evaluate(env)
  28. end
  29. current_expr
  30. end
  31. def to_s
  32. "<function: #{@name.name}(#{@params.map(&:name).join(' ')})>"
  33. end
  34. end
  35. end