Class: Lucio

Inherits:
Object
  • Object
show all
Defined in:
lib/lucio/lucio.rb

Instance Method Summary collapse

Constructor Details

#initialize(lexicon = Lexicon.new) ⇒ Lucio

Returns a new instance of Lucio.



2
3
4
5
6
7
8
9
10
11
12
13
# File 'lib/lucio/lucio.rb', line 2

def initialize(lexicon = Lexicon.new)
  @lexicon = lexicon
  @lexicon.add_function :+    , lambda{|items| items.reduce(0, :+)}
  @lexicon.add_function :*    , lambda{|items| items.reduce(1, :*)}
  @lexicon.add_function :-    , lambda{|items| case when items.size == 0; 0; else; head, tail = Lucio.behead(items); tail.empty? ? (head * -1) : tail.inject(head) {|subtraction, item| subtraction -= item}; end}
  @lexicon.add_function :/    , lambda{|items| case when items.size == 0; raise 'expects at least 1 arguments, given 0'; when items.size == 1; 1.0 / items[0]; else items.reduce{|result, item| result = result / item.to_f}; end}
  @lexicon.add_function :true , lambda{ true }
  @lexicon.add_function :false, lambda{ false }
  @lexicon.add_function :eql? , lambda{|items| items.map{|item| item == items[0]}.reduce{|memo, item| memo && item}}
  @lexicon.add_macro    :let  , lambda{|lexicon, items| lexicon.add_function(items[0].to_sym, lambda{(items[1].kind_of? Array) ? evaluate_tree(items[1]) : items[1]})}
  @lexicon.add_macro    :if   , lambda{|lexicon, items| evaluate_tree(items[0]) ? evaluate_tree(items[1]) : evaluate_tree(items[2]) }
end

Instance Method Details

#eval(source_code) ⇒ Object



15
16
17
18
19
20
# File 'lib/lucio/lucio.rb', line 15

def eval(source_code)
  tree = Sparse.new.parse(source_code)
  ret = nil
  tree.each {|list| ret = evaluate_tree list}
  ret
end