Class: Lrb

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLrb

Returns a new instance of Lrb.



10
11
12
13
14
15
16
17
# File 'lib/lrb.rb', line 10

def initialize
  @debug = false
  @indent = 0
  @stack = Array.new
  @parser = Bracer.new
  @parser.ruby_keyword_literals = true
  readline_autocompletion
end

Instance Attribute Details

#debugObject

Returns the value of attribute debug.



8
9
10
# File 'lib/lrb.rb', line 8

def debug
  @debug
end

#parserObject

Returns the value of attribute parser.



8
9
10
# File 'lib/lrb.rb', line 8

def parser
  @parser
end

Instance Method Details

#eval_file(path) ⇒ Object



40
41
42
43
# File 'lib/lrb.rb', line 40

def eval_file path
  source = File.read path
  eval_source source, mode = :compile
end

#eval_list(list) ⇒ Object



70
71
72
# File 'lib/lrb.rb', line 70

def eval_list list
  eval list_to_ruby(list)
end

#eval_source(source, mode = :repl) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/lrb.rb', line 45

def eval_source source, mode = :repl
  begin
    e = to_ruby source
    evaluated = eval e
  rescue Exception => ex
    if @debug
      puts ex.backtrace.join("\n").red
      binding.pry 
    end
    puts ex.message.red
  end
  if @debug
    if mode == :compile
      puts "[LRB]:".light_yellow
      puts source.light_yellow
    end  
    puts e.light_green
    if mode == :compile
      puts "\n[evaluated]:".light_yellow
      puts "#{evaluated}".blue
    end
  end
  evaluated
end

#list_to_ruby(ast) ⇒ Object



74
75
76
77
78
79
80
81
# File 'lib/lrb.rb', line 74

def list_to_ruby ast
  ast = ast.map do |sexp|
    result = transform sexp
    puts result if @debug
    result
  end
  ast.join "\n\n"
end

#parse(source) ⇒ Object



19
20
21
# File 'lib/lrb.rb', line 19

def parse source
  @parser.parse_string source 
end

#replObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/lrb.rb', line 23

def repl
  begin
    while line = readline_with_hist_management
      @stack << line
      if balanced?
        e = eval_source @stack.join " "
        puts e.to_s.blue
        @stack.clear
        @indent = 0
      end
    end
  rescue Interrupt => e
    puts "\nGoodbye !".light_yellow
    exit
  end
end

#to_ruby(source) ⇒ Object



83
84
85
86
87
# File 'lib/lrb.rb', line 83

def to_ruby source
  ast = parse source 
  puts "parsed: #{ast}".green if @debug
  list_to_ruby ast
end

#transform(sexp) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/lrb.rb', line 89

def transform sexp
  puts line if @debug
  if sexp.class == Array
    fun = sexp.first
    args = wrap_string sexp.drop(1)
    result = ""
    if @debug
      puts "function: #{fun}".yellow
      puts "args: #{args}".yellow
      puts line 
    end
    
    if KEYWORD.include? fun
      result = self.instance_exec *args, &KEYWORD[fun]
    elsif class_method? fun
      puts "[ERROR] dot operator only take 1 arg.".red if args.length > 1
      result = class_method_append fun, args.first
    else
      # function call
      result = compose_function fun, args
    end

    if @debug
      puts result.light_green
      puts line
    end
    indent + result
  else
    puts "#{sexp}".yellow if @debug
    sexp
  end
end