diff --git a/Makefile b/Makefile index 0587cea7..07d6a2ae 100644 --- a/Makefile +++ b/Makefile @@ -38,13 +38,13 @@ $(GST_TARGET): $(GST_CLIENT_OBJECTS) $(GST_CORE_OBJECTS) $(CC) $(CFLAGS) -o $@ -c $< run: $(GST_TARGET) - ./$(GST_TARGET) + @ ./$(GST_TARGET) debug: $(GST_TARGET) - gdb ./$(GST_TARGET) + @ gdb ./$(GST_TARGET) valgrind: $(GST_TARGET) - valgrind --leak-check=full -v ./$(GST_TARGET) + @ valgrind --leak-check=full -v ./$(GST_TARGET) clean: rm $(GST_TARGET) || true @@ -54,7 +54,7 @@ clean: rm vgcore.* || true test: $(GST_TARGET) - ./$(GST_TARGET) gsttests/basic.gst + @ ./$(GST_TARGET) gsttests/basic.gst valtest: $(GST_TARGET) valgrind --leak-check=full -v ./$(GST_TARGET) gsttests/basic.gst diff --git a/client/main.c b/client/main.c index 3c814298..13e4bad8 100644 --- a/client/main.c +++ b/client/main.c @@ -82,12 +82,11 @@ static char *gst_getline() { } /* Compile and run an ast */ -static int debug_compile_and_run(Gst *vm, GstValue ast, GstValue last, int64_t flags) { +static int debug_compile_and_run(Gst *vm, GstValue ast, int64_t flags) { GstCompiler c; GstValue func; /* Try to compile generated AST */ gst_compiler(&c, vm); - gst_env_putc(vm, vm->env, "_", last); func = gst_wrap_function(gst_compiler_compile(&c, ast)); /* Check for compilation errors */ if (c.error.type != GST_NIL) { @@ -139,7 +138,7 @@ static int debug_run(Gst *vm, FILE *in, int64_t flags) { printf_flags(flags, "31", "parse error: unexpected end of source%s\n", ""); break; } - if (debug_compile_and_run(vm, gst_parse_consume(&p), vm->ret, flags)) { + if (debug_compile_and_run(vm, gst_parse_consume(&p), flags)) { break; } } @@ -179,7 +178,8 @@ static int debug_repl(Gst *vm, uint64_t flags) { printf_flags(flags, "31", "parse error: unexpected end of source%s\n", ""); continue; } - if (!debug_compile_and_run(vm, gst_parse_consume(&p), vm->ret, flags)) { + gst_env_putc(vm, vm->env, "_", vm->ret); + if (!debug_compile_and_run(vm, gst_parse_consume(&p), flags)) { printf_flags(flags, "36", "%s\n", (const char *) gst_description(vm, vm->ret)); } } diff --git a/core/parse.c b/core/parse.c index 824e3d66..e963d76e 100644 --- a/core/parse.c +++ b/core/parse.c @@ -161,14 +161,12 @@ static GstValue build_token(GstParser *p, GstBuffer *buf) { if (buf->data[0] >= '0' && buf->data[0] <= '9') { p_error(p, "symbols cannot start with digits"); x.type = GST_NIL; + } else if (buf->data[0] == ':' && buf->count >= 2) { + x.type = GST_STRING; + x.data.string = gst_string_b(p->vm, buf->data + 1, buf->count - 1); } else { - if (buf->data[0] == ':' && buf->count >= 2) { - x.type = GST_STRING; - x.data.string = gst_string_b(p->vm, buf->data + 1, buf->count - 1); - } else { - x.type = GST_SYMBOL; - x.data.string = gst_buffer_to_string(p->vm, buf); - } + x.type = GST_SYMBOL; + x.data.string = gst_buffer_to_string(p->vm, buf); } } return x; @@ -238,11 +236,6 @@ static int string_state(GstParser *p, uint8_t c) { top->buf.string.count = 0; top->buf.string.accum = 0; return 1; - case 'u': - top->buf.string.state = STRING_STATE_ESCAPE_HEX; - top->buf.string.count = 0; - top->buf.string.accum = 0; - return 1; default: p_error(p, "unknown string escape sequence"); return 1; diff --git a/core/stl.c b/core/stl.c index f026d4fd..ac023ce4 100644 --- a/core/stl.c +++ b/core/stl.c @@ -443,6 +443,15 @@ int gst_stl_string(Gst *vm) { gst_c_return(vm, gst_wrap_string(gst_string_end(vm, str))); } +/* Create a symbol */ +int gst_stl_symbol(Gst *vm) { + int ret = gst_stl_string(vm); + if (ret == GST_RETURN_OK) { + vm->ret.type = GST_SYMBOL; + } + return ret; +} + /* Create a thread */ int gst_stl_thread(Gst *vm) { GstThread *t; @@ -598,8 +607,6 @@ int gst_stl_print(Gst *vm) { uint32_t len = gst_string_length(string); for (i = 0; i < len; ++i) fputc(string[i], stdout); - if (j < count - 1) - fputc(' ', stdout); } fputc('\n', stdout); return GST_RETURN_OK; @@ -1087,6 +1094,7 @@ static const GstModuleItem std_module[] = { {"struct", gst_stl_struct}, {"buffer", gst_stl_buffer}, {"string", gst_stl_string}, + {"symbol", gst_stl_symbol}, {"thread", gst_stl_thread}, {"status", gst_stl_status}, {"current", gst_stl_current}, diff --git a/gsttests/basic.gst b/gsttests/basic.gst index 574e5b4e..3ffcaead 100644 --- a/gsttests/basic.gst +++ b/gsttests/basic.gst @@ -6,11 +6,11 @@ (varset! num-tests-run (+ 1 num-tests-run)) (if x (do - (print " \e[32m✔\e[0m" e) + (print " \e[32m✔\e[0m " e) (varset! num-tests-passed (+ 1 num-tests-passed)) x) (do - (print " \e[31m✘\e[0m" e) + (print " \e[31m✘\e[0m " e) x)))) (assert (= 10 (+ 1 2 3 4)) "addition") @@ -46,6 +46,7 @@ (assert (= "hello" :hello) "keyword syntax for strings") (assert (= '(1 2 3) (quote (1 2 3)) (tuple 1 2 3)) "quote shorthand") +(assert (= (symbol :banana) 'banana) "symbol function") ((fn [] (var accum 1) @@ -103,4 +104,4 @@ # report -(print num-tests-passed "of" num-tests-run "tests passed") \ No newline at end of file +(print num-tests-passed " of " num-tests-run " tests passed") \ No newline at end of file