Class: Peruby::Op::Declare

Inherits:
Base
  • Object
show all
Defined in:
lib/peruby/op/variable.rb

Overview

Lexical variable declaration.

Instance Method Summary collapse

Methods inherited from Base

#argument_cells, #local_slot, #run_subroutine, #warning_directive?

Constructor Details

#initialize(sigil, name, initializer, predeclared = nil) ⇒ Declare

Returns a new instance of Declare.



278
279
280
281
282
283
# File 'lib/peruby/op/variable.rb', line 278

def initialize(sigil, name, initializer, predeclared = nil)
  @sigil = sigil
  @name = name
  @initializer = initializer
  @predeclared = predeclared
end

Instance Method Details

#lvalue(env, _context) ⇒ Object



311
312
313
# File 'lib/peruby/op/variable.rb', line 311

def lvalue(env, _context)
  env.fetch(@sigil, @name)
end

#run(env, context) ⇒ Object



285
286
287
288
289
290
291
292
# File 'lib/peruby/op/variable.rb', line 285

def run(env, context)
  values = @initializer&.run(env, @sigil == :scalar ? :scalar : :list)
  target = declaration_target(env)
  assign(target, values) if @initializer
  return Array(target.respond_to?(:cells) ? target.cells : target) if context == :list

  declaration_value(target)
end

#to_callableObject



294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
# File 'lib/peruby/op/variable.rb', line 294

def to_callable
  initializer = @initializer&.to_callable
  scalar_initializer = @initializer.scalar_callable if @initializer.respond_to?(:scalar_callable)
  lambda do |env, context|
    values = if @sigil == :scalar && scalar_initializer
               scalar_initializer.call(env)
             else
               initializer&.call(env, @sigil == :scalar ? :scalar : :list)
             end
    target = declaration_target(env)
    assign(target, values) if initializer
    next Array(target.respond_to?(:cells) ? target.cells : target) if context == :list

    declaration_value(target)
  end
end