Sha256: e3c3efdb489e547d897ae3c55dc0d300f9adf4d2f1d27c19002793c90b56b641

Contents?: true

Size: 1.62 KB

Versions: 6

Compression:

Stored size: 1.62 KB

Contents

module Pione
  module Lang
    # Expr is a base class for all PIONE expressions.
    class Expr < StructX
      include Util::Positionable
      immutable true

      class << self
        attr_reader :pione_type

        # Set pione model type of the model.
        def pione_type(type=nil)
          if type
            @pione_type = type
            Type.table[type.name][:sequence_class] = self
          else
            @pione_type
          end
        end

        def inherited(subclass)
          if @pione_type
            subclass.pione_type(@pione_type)
          end
        end
      end

      forward :class, :pione_type

      def eval(env)
        return self
      end

      def eval!(env)
        return self
      end

      # Convert to text string.
      def textize
        args = to_h.map do |key, val|
          "%s: %s" % [key, val.kind_of?(Piece) ? val.textize : val.to_s]
        end.join(", ")
        "#%s{%s}" % [piece_classes.first.piece_type_name, args]
      end

      def to_s
        textize
      end
    end

    module Callable
      # Call the pione method.
      def call_pione_method(env, name, args)
        # check arguments
        raise ArgumentError.new(args) unless args.is_a?(Array)

        if pione_method = pione_type.find_method(env, name, self, args)
          # evaluate arguments if the method type is immediate
          if pione_method.method_type == :immediate
            args = args.map {|arg| arg.eval(env)}
          end
          # call it
          pione_method.call(env, self, args)
        else
          raise MethodNotFound.new(name, self, args)
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
pione-0.4.2 lib/pione/lang/expr.rb
pione-0.4.1 lib/pione/lang/expr.rb
pione-0.4.0 lib/pione/lang/expr.rb
pione-0.3.2 lib/pione/lang/expr.rb
pione-0.3.1 lib/pione/lang/expr.rb
pione-0.3.0 lib/pione/lang/expr.rb