123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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)
- }
|