package muesli import "fmt" import "log" type LogTracer struct { } func (t LogTracer) Trace(vm VM, ast Ast, val ... Value) bool { log.Printf("Trace: %s -> %v", ast.String(), val) return false } type FmtTracer struct { } func (t FmtTracer) Trace(vm VM, ast Ast, args ... Value) bool { arg := args[0] rest := args[1:len(args)] fmt.Printf("Trace: %s: %v -> ", ast.String(), arg) for _, v := range rest { fmt.Printf("%v, ", v) } fmt.Printf("<-\n ") return false } func printf(vm *VM, args ...Value) Value { var format string rest, err := ParseArgs(args, &format) if err != nil { return ErrorValue{err} } fmt.Printf(format, rest...) return EmptyValue{} } func println(vm *VM, args ...Value) Value { var msg string _, err := ParseArgs(args, &msg) if err != nil { return ErrorValue{err} } else { fmt.Println(msg) } return EmptyValue{} } func p(vm *VM, args ...Value) Value { for _, arg := range args { fmt.Printf("%v\n", arg) } return EmptyValue{} } func trace(vm *VM, args ...Value) Value { var b bool = true fmt.Printf("command trace: %v\n", args) _, err := ParseArgs(args, &b) if err != nil { fmt.Printf("Error: %s\n", err.Error()) return ErrorValue{err} } fmt.Printf("command trace: bool: %v\n", b) if b { vm.Tracer = FmtTracer{} } else { vm.Tracer = nil } return BoolValue(b) } func addi(vm *VM, args ...Value) Value { var i1, i2 int _, err := ParseArgs(args, &i1, &i2) if err != nil { fmt.Printf("Error: %s\n", err.Error()) return ErrorValue{err} } return IntValue(i1 + i2) } func addf(vm *VM, args ...Value) Value { var f1, f2 float64 _, err := ParseArgs(args, &f1, &f2) if err != nil { fmt.Printf("Error: %s\n", err.Error()) return ErrorValue{err} } return FloatValue(f1 + f2) } func val(vm *VM, args ...Value) Value { if len(args) < 1 { return NewErrorValuef("val requres one argument.") } return args[0] } func (vm *VM) RegisterBuiltins() { vm.RegisterBuiltin("addi", addi) vm.RegisterBuiltin("addf", addf) // vm.RegisterCover("add") vm.RegisterBuiltin("p", p) vm.RegisterBuiltin("println", println) vm.RegisterBuiltin("printf", printf) vm.RegisterBuiltin("trace", trace) vm.RegisterBuiltin("val", val) }