builtin.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. package muesli
  2. import "fmt"
  3. import "log"
  4. import "runtime"
  5. import "strings"
  6. import "sort"
  7. type LogTracer struct {
  8. }
  9. func (t LogTracer) Trace(vm VM, ast Ast, val ... Value) bool {
  10. log.Printf("Trace: %s -> %v", ast.String(), val)
  11. return false
  12. }
  13. type FmtTracer struct {
  14. }
  15. func (t FmtTracer) Trace(vm VM, ast Ast, args ... Value) bool {
  16. arg := args[0]
  17. rest := args[1:len(args)]
  18. fmt.Printf("Trace: %s: %v -> ", ast.String(), arg)
  19. for _, v := range rest {
  20. fmt.Printf("%v, ", v)
  21. }
  22. fmt.Printf("<-\n ")
  23. return false
  24. }
  25. func printf(vm *VM, args ...Value) []Value {
  26. var format string
  27. rest, err := ParseArgs(args, &format)
  28. if err != nil {
  29. return Fail(err)
  30. }
  31. extra := ListFromList(rest)
  32. fmt.Printf(format, extra...)
  33. return None()
  34. }
  35. func println(vm *VM, args ...Value) []Value {
  36. var msg string
  37. _, err := ParseArgs(args, &msg)
  38. if err != nil {
  39. return Fail(err)
  40. } else {
  41. fmt.Println(msg)
  42. }
  43. return None()
  44. }
  45. func p(vm *VM, args ...Value) []Value {
  46. for _, arg := range args {
  47. fmt.Printf("%v\n", arg)
  48. }
  49. return None()
  50. }
  51. func trace(vm *VM, args ...Value) []Value {
  52. var b bool = true
  53. fmt.Printf("command trace: %v\n", args)
  54. _, err := ParseArgs(args, &b)
  55. if err != nil {
  56. fmt.Printf("Error: %s\n", err.Error())
  57. return Fail(err)
  58. }
  59. fmt.Printf("command trace: bool: %v\n", b)
  60. if b {
  61. vm.Tracer = FmtTracer{}
  62. } else {
  63. vm.Tracer = nil
  64. }
  65. return Ok(BoolValue(b))
  66. }
  67. func sumi(vm *VM, args ...Value) []Value {
  68. slice, err := ParseArgsToIntSlice(args)
  69. if err != nil {
  70. fmt.Printf("Error: %s\n", err.Error())
  71. return Fail(err)
  72. }
  73. res := int(0)
  74. for _, val := range slice {
  75. res += val
  76. }
  77. return IntOk(res)
  78. }
  79. func sumf(vm *VM, args ...Value) []Value {
  80. slice, err := ParseArgsToFloat64Slice(args)
  81. if err != nil {
  82. fmt.Printf("Error: %s\n", err.Error())
  83. return Fail(err)
  84. }
  85. res := float64(0)
  86. for _, val := range slice {
  87. res += val
  88. }
  89. return FloatOk(res)
  90. }
  91. func addi(vm *VM, args ...Value) []Value {
  92. var v1, v2 int
  93. _, err := ParseArgs(args, &v1, &v2)
  94. if err != nil {
  95. return Fail(err)
  96. }
  97. return IntOk(v1 + v2)
  98. }
  99. func addf(vm *VM, args ...Value) []Value {
  100. var v1, v2 float64
  101. _, err := ParseArgs(args, &v1, &v2)
  102. if err != nil {
  103. return Fail(err)
  104. }
  105. return FloatOk(v1 + v2)
  106. }
  107. func subi(vm *VM, args ...Value) []Value {
  108. var v1, v2 int
  109. _, err := ParseArgs(args, &v1, &v2)
  110. if err != nil {
  111. return Fail(err)
  112. }
  113. return IntOk(v1 - v2)
  114. }
  115. func subf(vm *VM, args ...Value) []Value {
  116. var v1, v2 float64
  117. _, err := ParseArgs(args, &v1, &v2)
  118. if err != nil {
  119. return Fail(err)
  120. }
  121. return FloatOk(v1 - v2)
  122. }
  123. func muli(vm *VM, args ...Value) []Value {
  124. var v1, v2 int
  125. _, err := ParseArgs(args, &v1, &v2)
  126. if err != nil {
  127. return Fail(err)
  128. }
  129. return IntOk(v1 * v2)
  130. }
  131. func mulf(vm *VM, args ...Value) []Value {
  132. var v1, v2 float64
  133. _, err := ParseArgs(args, &v1, &v2)
  134. if err != nil {
  135. return Fail(err)
  136. }
  137. return FloatOk(v1 * v2)
  138. }
  139. func divi(vm *VM, args ...Value) []Value {
  140. var v1, v2 int
  141. _, err := ParseArgs(args, &v1, &v2)
  142. if err != nil {
  143. return Fail(err)
  144. }
  145. return IntOk(v1 / v2)
  146. }
  147. func divf(vm *VM, args ...Value) []Value {
  148. var v1, v2 float64
  149. _, err := ParseArgs(args, &v1, &v2)
  150. if err != nil {
  151. return Fail(err)
  152. }
  153. return FloatOk(v1 / v2)
  154. }
  155. func andb(vm * VM, args ...Value) []Value {
  156. var v1, v2 bool
  157. _, err := ParseArgs(args, &v1, &v2)
  158. if err != nil {
  159. return Fail(err)
  160. }
  161. return BoolOk(v1 && v2)
  162. }
  163. func orb(vm * VM, args ...Value) []Value {
  164. var v1, v2 bool
  165. _, err := ParseArgs(args, &v1, &v2)
  166. if err != nil {
  167. return Fail(err)
  168. }
  169. return BoolOk(v1 || v2)
  170. }
  171. func val(vm *VM, args ...Value) []Value {
  172. if len(args) < 1 {
  173. return []Value{NewErrorValuef("val requres at least one argument.")}
  174. }
  175. return args
  176. }
  177. func to(vm *VM, args ...Value) []Value {
  178. var name string
  179. rest, err := ParseArgs(args, &name)
  180. if err != nil {
  181. return Fail(err)
  182. }
  183. if len(rest) < 1 {
  184. return Fail(NewErrorValuef("Need at least 2 arguments: %v", args))
  185. }
  186. last := rest[len(rest)-1]
  187. block, isBlock := last.(*BlockValue)
  188. if ! isBlock {
  189. return Fail(NewErrorValuef("Not a block: %v", last))
  190. }
  191. param := rest[0:len(rest)-1]
  192. defpars := []*Parameter{}
  193. for i := 1 ; i < len(param) ; i += 2 {
  194. par := &Parameter{}
  195. name := param[i-1]
  196. typ := param[i]
  197. var ok bool
  198. if par.Name, ok = name.(WordValue); !ok {
  199. return Fail(NewErrorValuef("Not a word value: %v", name))
  200. }
  201. if par.Type, ok = typ.(TypeValue); !ok {
  202. return Fail(NewErrorValuef("Not a type value: %v", typ))
  203. }
  204. defpars = append(defpars, par)
  205. }
  206. return Ok(vm.RegisterDefined(name, defpars, block))
  207. }
  208. func cover(vm *VM, args ...Value) []Value {
  209. var name, target string
  210. rest, err := ParseArgs(args, &name, &target)
  211. if err != nil {
  212. return Fail(err)
  213. }
  214. types := []TypeValue{}
  215. for i, arg := range rest {
  216. if typ, ok := arg.(TypeValue) ; ok {
  217. types = append(types, typ)
  218. } else {
  219. return Fail(NewErrorValuef("Argument %d: not a type: %v %s", i+2, arg, arg.String()))
  220. }
  221. }
  222. err = vm.AddOverload(name, target, types...)
  223. if err != nil {
  224. return Fail(err)
  225. }
  226. return Ok()
  227. }
  228. func types(vm *VM, args ...Value) []Value {
  229. result := []Value{}
  230. for i, arg := range args {
  231. typ := arg.Type()
  232. result = append(result, typ)
  233. fmt.Printf("Type %d: %s\n", i, typ.String())
  234. }
  235. return Ok(NewListValue(result...))
  236. }
  237. func set(vm *VM, val ...Value) []Value {
  238. if len(val) < 2 {
  239. return Fail(fmt.Errorf("set needs at least 2 arguments: received %v", val))
  240. }
  241. target := val[0].String()
  242. value := val[1]
  243. if target == "(" || target == "$" {
  244. if len(val) < 3 {
  245. return Fail(fmt.Errorf("indirect get needs results: received %v", val))
  246. }
  247. target = val[1].String()
  248. value = val[2]
  249. }
  250. vm.Register(target, value)
  251. return Ok(value)
  252. }
  253. func get(vm *VM, val ...Value) []Value {
  254. if len(val) < 1 {
  255. return Fail(fmt.Errorf("get needs at least 1 argument"))
  256. }
  257. target := val[0].String()
  258. if target == "(" || target == "$" {
  259. if len(val) < 2 {
  260. return Fail(fmt.Errorf("indirect get needs results: received %v", val))
  261. }
  262. target = val[1].String()
  263. }
  264. return Ok(vm.Lookup(target))
  265. }
  266. func fetchl(vm *VM, args ...Value) []Value {
  267. var index int
  268. var list *ListValue
  269. _, err := ParseArgs(args, &list, &index)
  270. if err != nil {
  271. return Fail(err)
  272. }
  273. return Ok(list.List[index])
  274. }
  275. func storel(vm *VM, args ...Value) []Value {
  276. var index int
  277. var list *ListValue
  278. rest, err := ParseArgs(args, &list, &index)
  279. if err != nil {
  280. return Fail(err)
  281. }
  282. if len (rest) < 1 {
  283. return Fail(fmt.Errorf("fetch: need 3 arguments"))
  284. }
  285. list.List[index] = rest[0]
  286. return Ok(list.List[index])
  287. }
  288. func fetchm(vm *VM, args ...Value) []Value {
  289. var index Value
  290. var hmap *MapValue
  291. _, err := ParseArgs(args, &hmap, &index)
  292. if err != nil {
  293. return Fail(err)
  294. }
  295. return Ok(hmap.Map[index])
  296. }
  297. func storem(vm *VM, args ...Value) []Value {
  298. var index Value
  299. var hmap *MapValue
  300. rest, err := ParseArgs(args, &hmap, &index)
  301. if err != nil {
  302. return Fail(err)
  303. }
  304. if len (rest) < 1 {
  305. return Fail(fmt.Errorf("fetch: need 3 arguments"))
  306. }
  307. hmap.Map[index] = rest[0]
  308. return Ok(hmap.Map[index])
  309. }
  310. func newmap(vm *VM, args ...Value) []Value {
  311. result := make(map[Value] Value)
  312. for i := 1; i < len(args) ; i+=2 {
  313. result[args[i-1]] = args[i]
  314. }
  315. return Ok(NewMapValue(result))
  316. }
  317. func help(vm *VM, val ...Value) [] Value {
  318. if len(val) < 1 {
  319. fmt.Printf("help <callable> will display help on the callable\n\nThe following commands are available:\n")
  320. helpers := vm.DefinedHelpers()
  321. sort.SliceStable(helpers, func(i, j int) bool {
  322. return helpers[i].HelperName() < helpers[j].HelperName()
  323. })
  324. for _, helper := range helpers {
  325. fl := strings.SplitN(helper.Help(),"\n", 2)
  326. fmt.Printf("%s %s: \n", helper.HelperName(), fl[0])
  327. }
  328. return Ok()
  329. }
  330. targetName := val[0].String()
  331. target := vm.Lookup(targetName)
  332. if target == nil {
  333. fmt.Printf("help: %s not found.\n", targetName)
  334. }
  335. if helper, isHelper := target.(Helper) ; isHelper {
  336. help := helper.Help()
  337. fmt.Printf("%s: %s.\n", targetName, help)
  338. return Ok(StringValue(help))
  339. }
  340. return Ok()
  341. }
  342. func explain(vm *VM, val ...Value) [] Value {
  343. var target, help string
  344. _, err := ParseArgs(val, &target, &help)
  345. if err != nil {
  346. return Fail(err)
  347. }
  348. err = vm.SetHelp(target, help)
  349. if err != nil {
  350. return Fail(err)
  351. }
  352. return Ok(StringValue(help))
  353. }
  354. func exit(vm *VM, val ...Value) [] Value {
  355. var code int
  356. _, err := ParseArgs(val, &code)
  357. if err != nil {
  358. runtime.Goexit()
  359. }
  360. vm.ExitStatus = code
  361. runtime.Goexit()
  362. return Ok()
  363. }
  364. func (vm *VM) RegisterBuiltins() {
  365. vm.RegisterBuiltinWithHelp("addi", addi, `[Int Int] -> Int: adds two integers together`)
  366. vm.RegisterBuiltinWithHelp("addf", addf, `[Int Int] -> Int: adds two floats together`)
  367. vm.RegisterBuiltinWithHelp("andb", andb, `[Bool Bool] -> Bool: returns true if all it's arguments are true`)
  368. vm.RegisterBuiltin("cover", cover)
  369. vm.RegisterBuiltin("fetchl", fetchl)
  370. vm.RegisterBuiltin("fetchm", fetchm)
  371. vm.RegisterBuiltin("sumi", sumi)
  372. vm.RegisterBuiltin("sumf", sumf)
  373. vm.RegisterBuiltin("subi", subi)
  374. vm.RegisterBuiltin("subf", subf)
  375. vm.RegisterBuiltin("divi", divi)
  376. vm.RegisterBuiltin("divf", divf)
  377. vm.RegisterBuiltin("map", newmap)
  378. vm.RegisterBuiltin("muli", muli)
  379. vm.RegisterBuiltin("mulf", mulf)
  380. vm.RegisterBuiltinWithHelp("orb", orb, `[Bool Bool] -> Bool: returns true if on of it's arguments is true`)
  381. // vm.RegisterCover("add")
  382. vm.RegisterBuiltin("p", p)
  383. vm.RegisterBuiltin("println", println)
  384. vm.RegisterBuiltin("printf", printf)
  385. vm.RegisterBuiltin("storel", storel)
  386. vm.RegisterBuiltin("storem", storem)
  387. vm.RegisterBuiltin("trace", trace)
  388. vm.RegisterBuiltin("to", to)
  389. vm.RegisterBuiltin("types", types)
  390. vm.RegisterBuiltin("val", val)
  391. vm.RegisterBuiltin("set", set)
  392. vm.RegisterBuiltin("get", get)
  393. vm.RegisterBuiltin("help", help)
  394. vm.RegisterBuiltin("explain", explain)
  395. vm.RegisterBuiltin("exit", exit)
  396. vm.AddOverloads("mul",
  397. Over("mulf", FloatTypeValue, FloatTypeValue),
  398. Over("muli", IntTypeValue, IntTypeValue),
  399. Over("mulf", FloatTypeValue, IntTypeValue),
  400. Over("mulf", FloatTypeValue, IntTypeValue))
  401. vm.SetHelp("mul", " Num: Multiplies two numbers. Cover for muli and mulf.")
  402. vm.AddOverloads("fetch",
  403. Over("fetchl", ListTypeValue, IntTypeValue),
  404. Over("fetchm", MapTypeValue, AnyTypeValue),
  405. )
  406. vm.SetHelp("fetch", " storage, index. Fetch value in storage at given index.")
  407. /*
  408. vm.AddOverloads("store",
  409. Over("storel", ListTypeValue, IntTypeValue, AnyTypeValue),
  410. Over("storem", MapTypeValue, AnyTypeValue, AnyTypeValue),
  411. )
  412. vm.SetHelp("store", " storage, index, value. Store value in storage at given index.")
  413. */
  414. }