Method: Code::Object#call

Defined in:
lib/code/object.rb

#call(**args) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/code/object.rb', line 5

def call(**args)
  operator = args.fetch(:operator, nil)
  arguments = args.fetch(:arguments, [])
  value = arguments.first&.value

  if operator == "=="
    sig(arguments) { ::Code::Object }
    equal(value)
  elsif operator == "==="
    sig(arguments) { ::Code::Object }
    strict_equal(value)
  elsif operator == "!="
    sig(arguments) { ::Code::Object }
    different(value)
  elsif operator == "<=>"
    sig(arguments) { ::Code::Object }
    compare(value)
  elsif operator == "&&" || operator == "and"
    sig(arguments) { ::Code::Object }
    and_operator(value)
  elsif operator == "||" || operator == "or"
    sig(arguments) { ::Code::Object }
    or_operator(value)
  elsif operator == "!" || operator == "not"
    sig(arguments)
    exclamation_point
  elsif operator == "+"
    sig(arguments)
    self
  elsif operator == ".."
    sig(arguments) { ::Code::Object }
    inclusive_range(value)
  elsif operator == "..."
    sig(arguments) { ::Code::Object }
    exclusive_range(value)
  elsif operator == "to_string"
    sig(arguments)
    to_string
  else
    raise(
      Code::Error::Undefined.new("#{operator} not defined on #{inspect}")
    )
  end
end