# this is not a "normal" ruby file, ie it is not required by salama
# instead it is parsed by salama to define part of the program that runs

# Values are _not_ objects. Specifically they have the following properties not found in objects:
# - they are immutable
# - equality implies identity == is ===
# - they have type, not class

# To make them useful in an oo system, we assign a class to each basic type
# This makes them look more like objects, but they are not.

# Value is an abstract class that unifies the "has a type" concept
# Types are not "objectified", but are represented as integer constants

module Parfait
  class Value

    # to make the machine work, the constants need
    # - to start at 0
    # - be unique
    # - be smaller enough to fit into the 2-4 bits available
    INTEGER_VALUE = 0
    OBJECT_VALUE  = 1

    # the type is what identifies the value
    def get_type()
      raise "abstract clalled on #{self}"
    end

    # Get class works on the type. The value's type is stored by the machine.
    # So this function is not overriden in derived classes, because it is used
    # to espablish what class a value has! (it's that "fake" oo i mentioned)
    def get_class()
      type = self.get_type()
      return Integer if( type == INTEGER_VALUE )
      raise "invalid type"
    end
  end
end