mirror of
https://github.com/janet-lang/janet
synced 2024-09-28 07:08:14 +00:00
Add symbol function
This commit is contained in:
parent
0cf278994d
commit
961275116f
8
Makefile
8
Makefile
@ -38,13 +38,13 @@ $(GST_TARGET): $(GST_CLIENT_OBJECTS) $(GST_CORE_OBJECTS)
|
|||||||
$(CC) $(CFLAGS) -o $@ -c $<
|
$(CC) $(CFLAGS) -o $@ -c $<
|
||||||
|
|
||||||
run: $(GST_TARGET)
|
run: $(GST_TARGET)
|
||||||
./$(GST_TARGET)
|
@ ./$(GST_TARGET)
|
||||||
|
|
||||||
debug: $(GST_TARGET)
|
debug: $(GST_TARGET)
|
||||||
gdb ./$(GST_TARGET)
|
@ gdb ./$(GST_TARGET)
|
||||||
|
|
||||||
valgrind: $(GST_TARGET)
|
valgrind: $(GST_TARGET)
|
||||||
valgrind --leak-check=full -v ./$(GST_TARGET)
|
@ valgrind --leak-check=full -v ./$(GST_TARGET)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm $(GST_TARGET) || true
|
rm $(GST_TARGET) || true
|
||||||
@ -54,7 +54,7 @@ clean:
|
|||||||
rm vgcore.* || true
|
rm vgcore.* || true
|
||||||
|
|
||||||
test: $(GST_TARGET)
|
test: $(GST_TARGET)
|
||||||
./$(GST_TARGET) gsttests/basic.gst
|
@ ./$(GST_TARGET) gsttests/basic.gst
|
||||||
|
|
||||||
valtest: $(GST_TARGET)
|
valtest: $(GST_TARGET)
|
||||||
valgrind --leak-check=full -v ./$(GST_TARGET) gsttests/basic.gst
|
valgrind --leak-check=full -v ./$(GST_TARGET) gsttests/basic.gst
|
||||||
|
@ -82,12 +82,11 @@ static char *gst_getline() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Compile and run an ast */
|
/* 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;
|
GstCompiler c;
|
||||||
GstValue func;
|
GstValue func;
|
||||||
/* Try to compile generated AST */
|
/* Try to compile generated AST */
|
||||||
gst_compiler(&c, vm);
|
gst_compiler(&c, vm);
|
||||||
gst_env_putc(vm, vm->env, "_", last);
|
|
||||||
func = gst_wrap_function(gst_compiler_compile(&c, ast));
|
func = gst_wrap_function(gst_compiler_compile(&c, ast));
|
||||||
/* Check for compilation errors */
|
/* Check for compilation errors */
|
||||||
if (c.error.type != GST_NIL) {
|
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", "");
|
printf_flags(flags, "31", "parse error: unexpected end of source%s\n", "");
|
||||||
break;
|
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;
|
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", "");
|
printf_flags(flags, "31", "parse error: unexpected end of source%s\n", "");
|
||||||
continue;
|
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));
|
printf_flags(flags, "36", "%s\n", (const char *) gst_description(vm, vm->ret));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
17
core/parse.c
17
core/parse.c
@ -161,14 +161,12 @@ static GstValue build_token(GstParser *p, GstBuffer *buf) {
|
|||||||
if (buf->data[0] >= '0' && buf->data[0] <= '9') {
|
if (buf->data[0] >= '0' && buf->data[0] <= '9') {
|
||||||
p_error(p, "symbols cannot start with digits");
|
p_error(p, "symbols cannot start with digits");
|
||||||
x.type = GST_NIL;
|
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 {
|
} else {
|
||||||
if (buf->data[0] == ':' && buf->count >= 2) {
|
x.type = GST_SYMBOL;
|
||||||
x.type = GST_STRING;
|
x.data.string = gst_buffer_to_string(p->vm, buf);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return x;
|
return x;
|
||||||
@ -238,11 +236,6 @@ static int string_state(GstParser *p, uint8_t c) {
|
|||||||
top->buf.string.count = 0;
|
top->buf.string.count = 0;
|
||||||
top->buf.string.accum = 0;
|
top->buf.string.accum = 0;
|
||||||
return 1;
|
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:
|
default:
|
||||||
p_error(p, "unknown string escape sequence");
|
p_error(p, "unknown string escape sequence");
|
||||||
return 1;
|
return 1;
|
||||||
|
12
core/stl.c
12
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)));
|
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 */
|
/* Create a thread */
|
||||||
int gst_stl_thread(Gst *vm) {
|
int gst_stl_thread(Gst *vm) {
|
||||||
GstThread *t;
|
GstThread *t;
|
||||||
@ -598,8 +607,6 @@ int gst_stl_print(Gst *vm) {
|
|||||||
uint32_t len = gst_string_length(string);
|
uint32_t len = gst_string_length(string);
|
||||||
for (i = 0; i < len; ++i)
|
for (i = 0; i < len; ++i)
|
||||||
fputc(string[i], stdout);
|
fputc(string[i], stdout);
|
||||||
if (j < count - 1)
|
|
||||||
fputc(' ', stdout);
|
|
||||||
}
|
}
|
||||||
fputc('\n', stdout);
|
fputc('\n', stdout);
|
||||||
return GST_RETURN_OK;
|
return GST_RETURN_OK;
|
||||||
@ -1087,6 +1094,7 @@ static const GstModuleItem std_module[] = {
|
|||||||
{"struct", gst_stl_struct},
|
{"struct", gst_stl_struct},
|
||||||
{"buffer", gst_stl_buffer},
|
{"buffer", gst_stl_buffer},
|
||||||
{"string", gst_stl_string},
|
{"string", gst_stl_string},
|
||||||
|
{"symbol", gst_stl_symbol},
|
||||||
{"thread", gst_stl_thread},
|
{"thread", gst_stl_thread},
|
||||||
{"status", gst_stl_status},
|
{"status", gst_stl_status},
|
||||||
{"current", gst_stl_current},
|
{"current", gst_stl_current},
|
||||||
|
@ -6,11 +6,11 @@
|
|||||||
(varset! num-tests-run (+ 1 num-tests-run))
|
(varset! num-tests-run (+ 1 num-tests-run))
|
||||||
(if x
|
(if x
|
||||||
(do
|
(do
|
||||||
(print " \e[32m✔\e[0m" e)
|
(print " \e[32m✔\e[0m " e)
|
||||||
(varset! num-tests-passed (+ 1 num-tests-passed))
|
(varset! num-tests-passed (+ 1 num-tests-passed))
|
||||||
x)
|
x)
|
||||||
(do
|
(do
|
||||||
(print " \e[31m✘\e[0m" e)
|
(print " \e[31m✘\e[0m " e)
|
||||||
x))))
|
x))))
|
||||||
|
|
||||||
(assert (= 10 (+ 1 2 3 4)) "addition")
|
(assert (= 10 (+ 1 2 3 4)) "addition")
|
||||||
@ -46,6 +46,7 @@
|
|||||||
|
|
||||||
(assert (= "hello" :hello) "keyword syntax for strings")
|
(assert (= "hello" :hello) "keyword syntax for strings")
|
||||||
(assert (= '(1 2 3) (quote (1 2 3)) (tuple 1 2 3)) "quote shorthand")
|
(assert (= '(1 2 3) (quote (1 2 3)) (tuple 1 2 3)) "quote shorthand")
|
||||||
|
(assert (= (symbol :banana) 'banana) "symbol function")
|
||||||
|
|
||||||
((fn []
|
((fn []
|
||||||
(var accum 1)
|
(var accum 1)
|
||||||
@ -103,4 +104,4 @@
|
|||||||
|
|
||||||
# report
|
# report
|
||||||
|
|
||||||
(print num-tests-passed "of" num-tests-run "tests passed")
|
(print num-tests-passed " of " num-tests-run " tests passed")
|
Loading…
Reference in New Issue
Block a user