builtin.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package muesli
  2. import "fmt"
  3. import "log"
  4. type LogTracer struct {
  5. }
  6. func (t LogTracer) Trace(vm VM, ast Ast, val ... Value) bool {
  7. log.Printf("Trace: %s -> %v", ast.String(), val)
  8. return false
  9. }
  10. type FmtTracer struct {
  11. }
  12. func (t FmtTracer) Trace(vm VM, ast Ast, args ... Value) bool {
  13. arg := args[0]
  14. rest := args[1:len(args)]
  15. fmt.Printf("Trace: %s: %v -> ", ast.String(), arg)
  16. for _, v := range rest {
  17. fmt.Printf("%v, ", v)
  18. }
  19. fmt.Printf("<-\n ")
  20. return false
  21. }
  22. func printf(vm *VM, args ...Value) []Value {
  23. var format string
  24. rest, err := ParseArgs(args, &format)
  25. if err != nil {
  26. return Return(ErrorValue{err})
  27. }
  28. fmt.Printf(format, rest...)
  29. return []Value{EmptyValue{}}
  30. }
  31. func println(vm *VM, args ...Value) []Value {
  32. var msg string
  33. _, err := ParseArgs(args, &msg)
  34. if err != nil {
  35. return Return(ErrorValue{err})
  36. } else {
  37. fmt.Println(msg)
  38. }
  39. return Return(EmptyValue{})
  40. }
  41. func p(vm *VM, args ...Value) []Value {
  42. for _, arg := range args {
  43. fmt.Printf("%v\n", arg)
  44. }
  45. return Return(EmptyValue{})
  46. }
  47. func trace(vm *VM, args ...Value) []Value {
  48. var b bool = true
  49. fmt.Printf("command trace: %v\n", args)
  50. _, err := ParseArgs(args, &b)
  51. if err != nil {
  52. fmt.Printf("Error: %s\n", err.Error())
  53. return Return(ErrorValue{err})
  54. }
  55. fmt.Printf("command trace: bool: %v\n", b)
  56. if b {
  57. vm.Tracer = FmtTracer{}
  58. } else {
  59. vm.Tracer = nil
  60. }
  61. return Return(BoolValue(b))
  62. }
  63. func addi(vm *VM, args ...Value) []Value {
  64. var i1, i2 int
  65. _, err := ParseArgs(args, &i1, &i2)
  66. if err != nil {
  67. fmt.Printf("Error: %s\n", err.Error())
  68. return Return(ErrorValue{err})
  69. }
  70. return Return(IntValue(i1 + i2))
  71. }
  72. func addf(vm *VM, args ...Value) []Value {
  73. var f1, f2 float64
  74. _, err := ParseArgs(args, &f1, &f2)
  75. if err != nil {
  76. fmt.Printf("Error: %s\n", err.Error())
  77. return Return(ErrorValue{err})
  78. }
  79. return Return(FloatValue(f1 + f2))
  80. }
  81. func val(vm *VM, args ...Value) []Value {
  82. if len(args) < 1 {
  83. return []Value{NewErrorValuef("val requres at least one argument.")}
  84. }
  85. return args
  86. }
  87. func (vm *VM) RegisterBuiltins() {
  88. vm.RegisterBuiltin("addi", addi)
  89. vm.RegisterBuiltin("addf", addf)
  90. // vm.RegisterCover("add")
  91. vm.RegisterBuiltin("p", p)
  92. vm.RegisterBuiltin("println", println)
  93. vm.RegisterBuiltin("printf", printf)
  94. vm.RegisterBuiltin("trace", trace)
  95. vm.RegisterBuiltin("val", val)
  96. }