value.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package muesli
  2. import "fmt"
  3. /* Run time values */
  4. type Value interface {
  5. String() string
  6. Type() TypeValue
  7. }
  8. type IntValue int64
  9. type FloatValue float64
  10. type StringValue string
  11. type BoolValue bool
  12. type WordValue string
  13. type TypeValue string
  14. type ErrorValue struct {
  15. error
  16. }
  17. type EmptyValue struct {
  18. }
  19. type ListValue struct {
  20. List []Value
  21. }
  22. const (
  23. TrueValue = BoolValue(true)
  24. FalseValue = BoolValue(false)
  25. IntTypeValue = TypeValue("Int")
  26. FloatTypeValue = TypeValue("Float")
  27. StringTypeValue = TypeValue("String")
  28. BoolTypeValue = TypeValue("Bool")
  29. WordTypeValue = TypeValue("Word")
  30. ErrorTypeValue = TypeValue("Error")
  31. TypeTypeValue = TypeValue("Type")
  32. EmptyTypeValue = TypeValue("Empty")
  33. ListTypeValue = TypeValue("List")
  34. AnyTypeValue = TypeValue("Any")
  35. )
  36. var NilValue = Value(nil)
  37. func (val IntValue) String() string {
  38. return fmt.Sprintf("%d", int64(val))
  39. }
  40. func (val FloatValue) String() string {
  41. return fmt.Sprintf("%f", float64(val))
  42. }
  43. func (val BoolValue) String() string {
  44. if bool(val) {
  45. return "true"
  46. } else {
  47. return "false"
  48. }
  49. }
  50. func (val StringValue) String() string {
  51. return string(val)
  52. }
  53. func (val WordValue) String() string {
  54. return string(val)
  55. }
  56. func (val TypeValue) String() string {
  57. return string(val)
  58. }
  59. func (val ErrorValue) String() string {
  60. return fmt.Sprintf("%s", val.Error())
  61. }
  62. func (val EmptyValue) String() string {
  63. return "<empty>"
  64. }
  65. func (val ListValue) String() string {
  66. res := "["
  67. sep := ""
  68. for _, elt := range val.List {
  69. res = res + sep + elt.String()
  70. sep = ", "
  71. }
  72. res += "]"
  73. return res
  74. }
  75. func (v IntValue) Type() TypeValue { return IntTypeValue }
  76. func (v FloatValue) Type() TypeValue { return FloatTypeValue }
  77. func (v StringValue) Type() TypeValue { return StringTypeValue }
  78. func (v BoolValue) Type() TypeValue { return BoolTypeValue }
  79. func (v WordValue) Type() TypeValue { return WordTypeValue }
  80. func (v TypeValue) Type() TypeValue { return TypeTypeValue }
  81. func (v ErrorValue) Type() TypeValue { return ErrorTypeValue }
  82. func (v EmptyValue) Type() TypeValue { return EmptyTypeValue }
  83. func (v ListValue) Type() TypeValue { return ListTypeValue }
  84. func NewErrorValuef(format string, args ...interface{}) ErrorValue {
  85. err := fmt.Errorf(format, args...)
  86. return ErrorValue{err}
  87. }
  88. func NewListValue(elements ...Value) ListValue {
  89. return ListValue{elements}
  90. }
  91. func (list *ListValue) Append(elements ...Value) {
  92. list.List = append(list.List, elements...)
  93. }