Sha256: 66b664983f24656d6d6264e5e61c136a68bdd56767e403ddfede4488252057dd

Contents?: true

Size: 1.39 KB

Versions: 4

Compression:

Stored size: 1.39 KB

Contents

class Code
  class Node
    class Name < Node
      def initialize(name)
        @name = name
      end

      def evaluate(**args)
        context = args.fetch(:context)
        arguments = args.fetch(:arguments, [])
        object = args.fetch(:object, nil)
        io = args.fetch(:io)

        if object
          object.call(
            context: context,
            operator: name,
            arguments: arguments,
            io: io,
          )
        elsif context.key?(name)
          object = context[name]

          if object.is_a?(::Code::Object::Function)
            object.call(
              context: context,
              operator: nil,
              arguments: arguments,
              io: io,
            )
          else
            object
          end
        elsif name == "puts"
          arguments.each { |argument| io.puts argument.value }
          ::Code::Object::Nothing.new
        elsif name == "print"
          arguments.each { |argument| io.print argument.value }
          ::Code::Object::Nothing.new
        elsif name == "context"
          return ::Code::Object::Nothing.new if arguments.size != 1
          context[arguments.first&.value] || ::Code::Object::Nothing.new
        else
          raise ::Code::Error::Undefined.new("#{name} undefined")
        end
      end

      private

      def name
        ::Code::Object::String.new(@name.to_s)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 2 rubygems

Version Path
template-ruby-0.3.1 lib/code/node/name.rb
code-ruby-0.3.1 lib/code/node/name.rb
template-ruby-0.3.0 lib/code/node/name.rb
code-ruby-0.3.0 lib/code/node/name.rb