Module: TokenizerHelper

Included in:
Tokenizer
Defined in:
lib/lisp/interpreter/tokenizer.rb

Overview

Tokenizer helper

Instance Method Summary collapse

Instance Method Details

#get_var(var) ⇒ Object



85
86
87
88
89
90
91
92
# File 'lib/lisp/interpreter/tokenizer.rb', line 85

def get_var(var)
  check = check_instance_var var
  return instance_variable_get("@#{var}") if check
  val = (predefined_method_caller [var])
  return val unless val.nil?
  valid = valid_var var
  valid ? var : (raise 'Invalid data type')
end

#init_do_not_calculate_fnObject



28
29
30
31
32
33
34
# File 'lib/lisp/interpreter/tokenizer.rb', line 28

def init_do_not_calculate_fn
  %w[
    foldl foldr map filter
    if apply numerator denominator
    lambda compose define
  ]
end

#init_functionsObject



36
37
38
39
40
41
42
43
44
45
# File 'lib/lisp/interpreter/tokenizer.rb', line 36

def init_functions
  {
    'string-downcase'  => 'strdowncase', 'string-upcase'  => 'strupcase',
    'string-contains?' => 'strcontains', 'string-length'  => 'strlen',
    'string->list'     => 'strlist',     'string-split'   => 'strsplit',
    'string-sufix?'    => 'strsufix',    'string-prefix?' => 'strprefix',
    'string-replace'   => 'strreplace',  'string-join'    => 'strjoin',
    'list-ref'         => 'listref',     'list-tail'      => 'listtail'
  }
end

#init_predefinedObject



47
48
49
50
51
52
53
54
# File 'lib/lisp/interpreter/tokenizer.rb', line 47

def init_predefined
  %w[
    define not equal? if quotient remainder modulo numerator denominator
    min max sub1 add1 abs string? substring null? cons null list car
    cdr list? pair? length reverse remove shuffle map foldl foldr filter
    member lambda apply compose
  ]
end

#init_reserved_fnObject



56
57
58
59
60
# File 'lib/lisp/interpreter/tokenizer.rb', line 56

def init_reserved_fn
  {
    'null' => '\'()'
  }
end

#initializeObject



14
15
16
17
18
19
20
21
22
# File 'lib/lisp/interpreter/tokenizer.rb', line 14

def initialize
  @other = []
  @procs = {}
  @do_not_calculate = init_do_not_calculate_fn
  @reserved = init_reserved_fn
  set_reserved_keywords
  @functions = init_functions
  init_predefined.each { |f| @functions[f] = f }
end

#resetObject



24
25
26
# File 'lib/lisp/interpreter/tokenizer.rb', line 24

def reset
  @other = []
end

#set_reserved_keywordsObject



62
63
64
65
66
# File 'lib/lisp/interpreter/tokenizer.rb', line 62

def set_reserved_keywords
  @reserved.each do |key, value|
    instance_variable_set("@#{key}", value)
  end
end

#set_var(var, value) ⇒ Object



80
81
82
83
# File 'lib/lisp/interpreter/tokenizer.rb', line 80

def set_var(var, value)
  raise 'Cannot predefine reserved keyword' if @reserved.key? var
  instance_variable_set("@#{var}", value)
end

#set_var_helper(var, value) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
# File 'lib/lisp/interpreter/tokenizer.rb', line 68

def set_var_helper(var, value)
  valid = (valid_var value.to_s) || (value.is_a? Proc)
  raise 'Invalid parameter' unless valid
  if value.is_a? Proc
    remove_instance_variable("@#{var}") if check_instance_var var
    @procs[var] = value if value.is_a? Proc
  else
    @procs.delete var
    set_var var, value
  end
end