Browse Source

Add type value.

Beoran 2 years ago
parent
commit
8858f1d6cb
1 changed files with 48 additions and 12 deletions
  1. 48 12
      selsl/value/value.go

+ 48 - 12
selsl/value/value.go

@@ -12,16 +12,50 @@ type Value interface {
 	Members() Members
 }
 
-// A type is also a value
-type Type Value
+// A type is modeled by it's name as a string
+type Type struct {
+	name    string
+	meta    *Type // type of the type
+	members Members
+}
+
+func (t Type) String() string {
+	return fmt.Sprintf(":type %s;", t.name)
+}
+
+func (t Type) Name() string {
+	return t.name
+}
+
+func (t Type) Members() Members {
+	return t.members
+}
+
+// Type returns the metatype of a type.
+func (t Type) Type() Type {
+	// turtles all the way down.
+	if t.meta == nil || t.meta.meta == nil {
+		return RootType
+	}
+	return *t.meta
+}
+
+func (t Type) Match(v Value) bool {
+	t2 := v.Type()
+	return t.Name() == t2.Name()
+}
+
+func NewType(name string, meta *Type, members Members) Type {
+	return Type{name: name, meta: meta, members: members}
+}
 
-var TypeType Type = NewObject("Type", nil, nil)
-var ObjectType Type = NewObject("Object", TypeType, nil)
-var ErrorType Type = NewObject("Error", ObjectType, nil)
-var StringType Type = NewObject("String", ObjectType, nil)
-var IntType Type = NewObject("Int", ObjectType, nil)
-var ListType Type = NewObject("List", ObjectType, nil)
-var MethodType Type = NewObject("Method", ObjectType, nil)
+var RootType Type = NewType("Type", nil, nil)
+var ObjectType Type = NewType("Object", &RootType, nil)
+var ErrorType Type = NewType("Error", &ObjectType, nil)
+var StringType Type = NewType("String", &ObjectType, nil)
+var IntType Type = NewType("Int", &ObjectType, nil)
+var ListType Type = NewType("List", &ObjectType, nil)
+var MethodType Type = NewType("Method", &ObjectType, nil)
 
 type Object struct {
 	name    string
@@ -30,7 +64,7 @@ type Object struct {
 }
 
 func (o Object) String() string {
-	return fmt.Sprintf("%s: %d", o.typ, o.name)
+	return fmt.Sprintf("%s: %s", o.typ, o.name)
 }
 
 func (o Object) Name() string {
@@ -55,7 +89,7 @@ type Error struct {
 }
 
 func (s Error) String() string {
-	return fmt.Sprintf("%w", s.Value)
+	return fmt.Sprintf("%s", s.Value)
 }
 
 func NewError(name string, members Members, value error) Error {
@@ -118,9 +152,11 @@ func NewMethod(name string, members Members, signature List,
 }
 
 func (m Method) String() string {
-	return fmt.Sprintf("Method: %s", m.Name)
+	return fmt.Sprintf("Method: %s", m.Name())
 }
 
+var _ Value = RootType
+var _ Value = ObjectType
 var _ Value = Error{}
 var _ Value = String{}
 var _ Value = Int{}