value.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package value
  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 also a value
  12. type Type Value
  13. var TypeType Type = NewObject("Type", nil, nil)
  14. var ObjectType Type = NewObject("Object", TypeType, nil)
  15. var ErrorType Type = NewObject("Error", ObjectType, nil)
  16. var StringType Type = NewObject("String", ObjectType, nil)
  17. var IntType Type = NewObject("Int", ObjectType, nil)
  18. var ListType Type = NewObject("List", ObjectType, nil)
  19. var MethodType Type = NewObject("Method", ObjectType, nil)
  20. type Object struct {
  21. name string
  22. typ Type
  23. members Members
  24. }
  25. func (o Object) String() string {
  26. return fmt.Sprintf("%s: %d", o.typ, o.name)
  27. }
  28. func (o Object) Name() string {
  29. return o.name
  30. }
  31. func (o Object) Members() Members {
  32. return o.members
  33. }
  34. func (o Object) Type() Type {
  35. return o.typ
  36. }
  37. func NewObject(name string, typ Type, members Members) Object {
  38. return Object{name: name, typ: typ, members: members}
  39. }
  40. type Error struct {
  41. Object
  42. Value error
  43. }
  44. func (s Error) String() string {
  45. return fmt.Sprintf("%w", s.Value)
  46. }
  47. func NewError(name string, members Members, value error) Error {
  48. return Error{Object: NewObject(name, ErrorType, members),
  49. Value: value}
  50. }
  51. type String struct {
  52. Object
  53. Value string
  54. }
  55. func (s String) String() string {
  56. return s.Value
  57. }
  58. func NewString(name string, members Members, value string) String {
  59. return String{Object: NewObject(name, StringType, members),
  60. Value: value}
  61. }
  62. type Int struct {
  63. Object
  64. Value int64
  65. }
  66. func NewInt(name string, members Members, value int64) Int {
  67. return Int{Object: NewObject(name, IntType, members),
  68. Value: value}
  69. }
  70. func (i Int) String() string {
  71. return fmt.Sprintf("%d", i.Value)
  72. }
  73. type List struct {
  74. Object
  75. Value []Value
  76. }
  77. func NewList(name string, members Members, value ...Value) List {
  78. return List{Object: NewObject(name, ListType, members),
  79. Value: value}
  80. }
  81. func (l List) String() string {
  82. return fmt.Sprintf("[%v]", l.Value)
  83. }
  84. type Method struct {
  85. Object
  86. Value func(env Value, self Value, args ...Value) List
  87. }
  88. func NewMethod(name string, members Members,
  89. value func(env Value, self Value, args ...Value) List) Method {
  90. return Method{Object: NewObject(name, MethodType, members),
  91. Value: value}
  92. }
  93. func (m Method) String() string {
  94. return fmt.Sprintf("Method: %s", m.Name)
  95. }
  96. var _ Value = String{}
  97. var _ Value = Int{}
  98. var _ Value = List{}