|
@@ -12,16 +12,50 @@ type Value interface {
|
|
|
Members() Members
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-type Type Value
|
|
|
+
|
|
|
+type Type struct {
|
|
|
+ name string
|
|
|
+ meta *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
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func (t Type) Type() Type {
|
|
|
+
|
|
|
+ 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{}
|