value.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package selsl
  2. import "fmt"
  3. type Members map[string][]Value
  4. type Value interface {
  5. Name() string
  6. // Proto/type of the value.
  7. Type() Type
  8. String() string
  9. Members() Members
  10. }
  11. // A type is modeled by it's name as a string
  12. type Type struct {
  13. name string
  14. meta *Type // type of the type
  15. members Members
  16. }
  17. func (t Type) String() string {
  18. return fmt.Sprintf(":type %s;", t.name)
  19. }
  20. func (t Type) Name() string {
  21. return t.name
  22. }
  23. func (t Type) Members() Members {
  24. return t.members
  25. }
  26. // Type returns the metatype of a type.
  27. func (t Type) Type() Type {
  28. // turtles all the way down.
  29. if t.meta == nil || t.meta.meta == nil {
  30. return RootType
  31. }
  32. return *t.meta
  33. }
  34. func (t Type) Match(v Value) bool {
  35. t2 := v.Type()
  36. return t.Name() == t2.Name()
  37. }
  38. func NewType(name string, meta *Type, members Members) Type {
  39. return Type{name: name, meta: meta, members: members}
  40. }
  41. var RootType Type = NewType("Type", nil, nil)
  42. var ObjectType Type = NewType("Object", &RootType, nil)
  43. var ErrorType Type = NewType("Error", &ObjectType, nil)
  44. var StringType Type = NewType("String", &ObjectType, nil)
  45. var IntType Type = NewType("Int", &ObjectType, nil)
  46. var ListType Type = NewType("List", &ObjectType, nil)
  47. var MethodType Type = NewType("Method", &ObjectType, nil)
  48. type Object struct {
  49. name string
  50. typ Type
  51. members Members
  52. }
  53. func (o Object) String() string {
  54. return fmt.Sprintf("%s: %s", o.typ, o.name)
  55. }
  56. func (o Object) Name() string {
  57. return o.name
  58. }
  59. func (o Object) Members() Members {
  60. return o.members
  61. }
  62. func (o Object) Type() Type {
  63. return o.typ
  64. }
  65. func NewObject(name string, typ Type, members Members) Object {
  66. return Object{name: name, typ: typ, members: members}
  67. }
  68. type Error struct {
  69. Object
  70. Value error
  71. }
  72. func (s Error) String() string {
  73. return fmt.Sprintf("%s", s.Value)
  74. }
  75. func NewError(name string, members Members, value error) Error {
  76. return Error{Object: NewObject(name, ErrorType, members),
  77. Value: value}
  78. }
  79. type String struct {
  80. Object
  81. Value string
  82. }
  83. func (s String) String() string {
  84. return s.Value
  85. }
  86. func NewString(name string, members Members, value string) String {
  87. return String{Object: NewObject(name, StringType, members),
  88. Value: value}
  89. }
  90. type Int struct {
  91. Object
  92. Value int64
  93. }
  94. func NewInt(name string, members Members, value int64) Int {
  95. return Int{Object: NewObject(name, IntType, members),
  96. Value: value}
  97. }
  98. func (i Int) String() string {
  99. return fmt.Sprintf("%d", i.Value)
  100. }
  101. type List struct {
  102. Object
  103. Value []Value
  104. }
  105. func NewList(name string, members Members, value ...Value) List {
  106. return List{Object: NewObject(name, ListType, members),
  107. Value: value}
  108. }
  109. func (l List) String() string {
  110. return fmt.Sprintf("[%v]", l.Value)
  111. }
  112. type Method struct {
  113. Object
  114. Signature List
  115. Value func(env Value, self Value, args ...Value) List
  116. }
  117. func NewMethod(name string, members Members, signature List,
  118. value func(env Value, self Value, args ...Value) List) Method {
  119. return Method{Object: NewObject(name, MethodType, members),
  120. Signature: signature, Value: value}
  121. }
  122. func (m Method) String() string {
  123. return fmt.Sprintf("Method: %s", m.Name())
  124. }
  125. var _ Value = RootType
  126. var _ Value = ObjectType
  127. var _ Value = Error{}
  128. var _ Value = String{}
  129. var _ Value = Int{}
  130. var _ Value = List{}
  131. var _ Value = Method{}