Class: Code::Object::Code

Inherits:
Object show all
Defined in:
lib/code/object/code.rb

Constant Summary collapse

CLASS_DOCUMENTATION =
{
  name: "Code",
  description: "stores parsed source code for later evaluation.",
  examples: [
    "Code",
    "Code.evaluate(\"1 + 2\")",
    "Code.new(\"1 + 2\").evaluate"
  ]
}.freeze
CLASS_FUNCTIONS =
{
  "evaluate" => {
    name: "evaluate",
    description: "evaluates source code and returns the result.",
    examples: [
      "Code.evaluate(\"1\")",
      "Code.evaluate(\"1 + 2\")",
      "Code.evaluate(\"[1, 2].size\")"
    ]
  }
}.freeze
INSTANCE_FUNCTIONS =
{
  "evaluate" => {
    name: "evaluate",
    description: "evaluates stored source code and returns the result.",
    examples: [
      "Code(\"1\").evaluate",
      "Code(\"1 + 2\").evaluate",
      "Code(\"[1, 2].size\").evaluate"
    ]
  }
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args, **_kargs, &_block) ⇒ Code

Returns a new instance of Code.



45
46
47
48
# File 'lib/code/object/code.rb', line 45

def initialize(*args, **_kargs, &_block)
  self.raw =
    (args.first.is_a?(Node::Code) ? args.first : Node::Code.new(::Code.parse(args.first.to_s)))
end

Class Method Details

.call(**args) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/code/object/code.rb', line 56

def self.call(**args)
  code_operator = args.fetch(:operator, nil).to_code
  globals = multi_fetch(args, *GLOBALS)

  case code_operator.to_s
  when "evaluate"
    sig(args) { Object }
    code_evaluate(*args.fetch(:arguments, []).to_code.raw, **globals)
  else
    super
  end
end

.code_evaluate(*args, **globals) ⇒ Object



50
51
52
53
54
# File 'lib/code/object/code.rb', line 50

def self.code_evaluate(*args, **globals)
  code_args = args.to_code

  new(*code_args.raw).code_evaluate(**globals)
end

.function_documentation(scope) ⇒ Object



38
39
40
41
42
43
# File 'lib/code/object/code.rb', line 38

def self.function_documentation(scope)
  return INSTANCE_FUNCTIONS if scope == :instance
  return CLASS_FUNCTIONS if scope == :class

  {}
end

Instance Method Details

#call(**args) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/code/object/code.rb', line 69

def call(**args)
  code_operator = args.fetch(:operator, nil).to_code
  globals = multi_fetch(args, *GLOBALS)

  case code_operator.to_s
  when "evaluate"
    sig(args)
    code_evaluate(**globals)
  else
    super
  end
end

#code_deep_duplicateObject



86
87
88
# File 'lib/code/object/code.rb', line 86

def code_deep_duplicate
  self.class.new(raw)
end

#code_evaluate(**globals) ⇒ Object



82
83
84
# File 'lib/code/object/code.rb', line 82

def code_evaluate(**globals)
  raw.evaluate(**globals)
end