diff --git a/examples/assembly.janet b/examples/assembly.janet index 049918cb..8f74e1c2 100644 --- a/examples/assembly.janet +++ b/examples/assembly.janet @@ -18,3 +18,11 @@ (ret 0) # return $0 ] })) + +# Test it + +(defn testn + [n] + (print "fibasm(" n ") = " (fibasm n))) + +(for i 0 10 (testn i)) diff --git a/examples/colors.janet b/examples/colors.janet index 7f27b842..c8697e2c 100644 --- a/examples/colors.janet +++ b/examples/colors.janet @@ -35,7 +35,13 @@ :bright-white 97 :bg-bright-white 107}) -(loop [[name color] :in (pairs colormap)] - (defglobal (string/slice name 1) - (fn color-wrapper [& pieces] - (string "\e[" color "m" ;pieces "\e[0m")))) +(defn color + "Take a string made by concatenating xs and colorize it for an ANSI terminal." + [c & xs] + (def code (get colormap c)) + (if (not code) (error (string "color " c " unknown"))) + (string "\e[" code "m" ;xs "\e[0m")) + +# Print all colors + +(loop [c :keys colormap] (print (color c c))) diff --git a/src/core/vm.c b/src/core/vm.c index 02f39d3f..65790c5c 100644 --- a/src/core/vm.c +++ b/src/core/vm.c @@ -556,6 +556,12 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in) { if (fiber->stacktop > fiber->maxstack) { vm_throw("stack overflow"); } + if (janet_checktype(callee, JANET_KEYWORD)) { + vm_commit(); + int32_t argc = fiber->stacktop - fiber->stackstart; + if (argc < 1) janet_panicf("method call takes at least 1 argument, got %d", argc); + callee = janet_get(fiber->data[fiber->stackstart], callee); + } if (janet_checktype(callee, JANET_FUNCTION)) { func = janet_unwrap_function(callee); janet_stack_frame(stack)->pc = pc; @@ -587,6 +593,12 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in) { VM_OP(JOP_TAILCALL) { Janet callee = stack[D]; + if (janet_checktype(callee, JANET_KEYWORD)) { + vm_commit(); + int32_t argc = fiber->stacktop - fiber->stackstart; + if (argc < 1) janet_panicf("method call takes at least 1 argument, got %d", argc); + callee = janet_get(fiber->data[fiber->stackstart], callee); + } if (janet_checktype(callee, JANET_FUNCTION)) { func = janet_unwrap_function(callee); if (janet_fiber_funcframe_tail(fiber, func)) {