aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/http-server/http-server.tm2
-rw-r--r--examples/http/http.tm14
-rw-r--r--examples/ini/ini.tm4
-rw-r--r--examples/learnxiny.tm3
-rw-r--r--examples/tomodeps/tomodeps.tm2
-rw-r--r--src/ast.c1
-rw-r--r--src/ast.h5
-rw-r--r--src/compile.c25
-rw-r--r--src/parse.c46
-rw-r--r--src/typecheck.c2
-rw-r--r--test/bytes.tm2
-rw-r--r--test/integers.tm2
-rw-r--r--test/lambdas.tm2
-rw-r--r--test/optionals.tm56
-rw-r--r--test/paths.tm24
-rw-r--r--test/reductions.tm2
-rw-r--r--test/text.tm10
17 files changed, 63 insertions, 139 deletions
diff --git a/examples/http-server/http-server.tm b/examples/http-server/http-server.tm
index 56ba3683..1a09b601 100644
--- a/examples/http-server/http-server.tm
+++ b/examples/http-server/http-server.tm
@@ -138,7 +138,7 @@ func load_routes(directory:Path -> {Text=RouteEntry}):
func main(directory:Path, port=Int32(8080)):
say("Serving on port $port")
routes := load_routes(directory)
- !! Hosting: $routes
+ say(" Hosting: $routes")
serve(port, func(request:HTTPRequest):
if handler := routes[request.path]:
diff --git a/examples/http/http.tm b/examples/http/http.tm
index ce74d010..12d9978e 100644
--- a/examples/http/http.tm
+++ b/examples/http/http.tm
@@ -97,17 +97,17 @@ func delete(url:Text, data:Text?=none, headers=["Content-Type: application/json"
return _send(DELETE, url, data, headers)
func main():
- !! GET:
+ say("GET:")
say(get("https://httpbin.org/get").body)
- !! Waiting 1sec...
+ say("Waiting 1sec...
sleep(1)
- !! POST:
+ say("POST:")
say(post("https://httpbin.org/post", `{"key": "value"}`).body)
- !! Waiting 1sec...
+ say("Waiting 1sec...")
sleep(1)
- !! PUT:
+ say("PUT:")
say(put("https://httpbin.org/put", `{"key": "value"}`).body)
- !! Waiting 1sec...
+ say("Waiting 1sec...")
sleep(1)
- !! DELETE:
+ say("DELETE:")
say(delete("https://httpbin.org/delete").body)
diff --git a/examples/ini/ini.tm b/examples/ini/ini.tm
index d67dd0d5..cee33f3c 100644
--- a/examples/ini/ini.tm
+++ b/examples/ini/ini.tm
@@ -41,7 +41,7 @@ func main(path:Path, key:Text?):
data := parse_ini(path)
if keys.length < 1 or keys[1] == '*':
- !! $data
+ say("$data")
return
section := keys[1]:lower()
@@ -50,7 +50,7 @@ func main(path:Path, key:Text?):
Valid names: $\[1]$(", ":join([k:quoted() for k in data.keys]))$\[]
")
if keys.length < 2 or keys[2] == '*':
- !! $section_data
+ say("$section_data")
return
section_key := keys[2]:lower()
diff --git a/examples/learnxiny.tm b/examples/learnxiny.tm
index 7373f057..ecb1140f 100644
--- a/examples/learnxiny.tm
+++ b/examples/learnxiny.tm
@@ -9,9 +9,6 @@ func main():
# Print to the console
say("Hello world!")
- # You can also use !! as a shorthand:
- !! This is the same as using say(), but a bit easier to type
-
# Declare a variable with ':=' (the type is inferred to be integer)
my_variable := 123
diff --git a/examples/tomodeps/tomodeps.tm b/examples/tomodeps/tomodeps.tm
index 8c75173a..c6c2171e 100644
--- a/examples/tomodeps/tomodeps.tm
+++ b/examples/tomodeps/tomodeps.tm
@@ -13,7 +13,7 @@ enum Dependency(File(path:Path), Module(name:Text))
func _get_file_dependencies(file:Path -> {Dependency}):
if not file:is_file():
- !! Could not read file: $file
+ say("Could not read file: $file")
return {}
deps : @{Dependency} = @{}
diff --git a/src/ast.c b/src/ast.c
index d4ecca2d..c78f4f1a 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -177,7 +177,6 @@ CORD ast_to_xml(ast_t *ast)
optional_tagged("iterable", data.iter))
T(Skip, "<Skip>%r</Skip>", data.target)
T(Stop, "<Stop>%r</Stop>", data.target)
- T(PrintStatement, "<PrintStatement>%r</PrintStatement>", ast_list_to_xml(data.to_print))
T(Pass, "<Pass/>")
T(Defer, "<Defer>%r<Defer/>", ast_to_xml(data.body))
T(Return, "<Return>%r</Return>", ast_to_xml(data.value))
diff --git a/src/ast.h b/src/ast.h
index 3beb6be2..b48582f2 100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -123,7 +123,7 @@ typedef enum {
Unknown = 0,
None, Bool, Var,
Int, Num,
- TextLiteral, TextJoin, PrintStatement,
+ TextLiteral, TextJoin,
Path,
Declare, Assign,
Power, Multiply, Divide, Mod, Mod1, Plus, Minus, Concat, LeftShift, UnsignedLeftShift,
@@ -183,9 +183,6 @@ struct ast_s {
const char *path;
} Path;
struct {
- ast_list_t *to_print;
- } PrintStatement;
- struct {
ast_t *var;
type_ast_t *type;
ast_t *value;
diff --git a/src/compile.c b/src/compile.c
index ad3097a7..a4f5b3ec 100644
--- a/src/compile.c
+++ b/src/compile.c
@@ -213,11 +213,6 @@ static void add_closed_vars(Table_t *closed_vars, env_t *enclosing_scope, env_t
add_closed_vars(closed_vars, enclosing_scope, env, child->ast);
break;
}
- case PrintStatement: {
- for (ast_list_t *child = Match(ast, PrintStatement)->to_print; child; child = child->next)
- add_closed_vars(closed_vars, enclosing_scope, env, child->ast);
- break;
- }
case Declare: {
add_closed_vars(closed_vars, enclosing_scope, env, Match(ast, Declare)->value);
bind_statement(env, ast);
@@ -1406,24 +1401,6 @@ static CORD _compile_statement(env_t *env, ast_t *ast)
env->deferred = new(deferral_t, .defer_env=defer_env, .block=body, .next=env->deferred);
return code;
}
- case PrintStatement: {
- ast_list_t *to_print = Match(ast, PrintStatement)->to_print;
- if (!to_print)
- return CORD_EMPTY;
-
- CORD code = "say(";
- if (to_print->next) code = CORD_all(code, "Texts(");
- for (ast_list_t *chunk = to_print; chunk; chunk = chunk->next) {
- if (chunk->ast->tag == TextLiteral) {
- code = CORD_cat(code, compile(env, chunk->ast));
- } else {
- code = CORD_cat(code, compile_string(env, chunk->ast, "USE_COLOR"));
- }
- if (chunk->next) code = CORD_cat(code, ", ");
- }
- if (to_print->next) code = CORD_all(code, ")");
- return CORD_cat(code, ", yes);");
- }
case Return: {
if (!env->fn_ret) code_err(ast, "This return statement is not inside any function");
auto ret = Match(ast, Return)->value;
@@ -3738,7 +3715,7 @@ CORD compile(env_t *env, ast_t *ast)
case Extern: code_err(ast, "Externs are not supported as expressions");
case TableEntry: code_err(ast, "Table entries should not be compiled directly");
case Declare: case Assign: case UPDATE_CASES: case For: case While: case Repeat: case StructDef: case LangDef: case Extend:
- case EnumDef: case FunctionDef: case ConvertDef: case Skip: case Stop: case Pass: case Return: case DocTest: case PrintStatement:
+ case EnumDef: case FunctionDef: case ConvertDef: case Skip: case Stop: case Pass: case Return: case DocTest:
code_err(ast, "This is not a valid expression");
default: case Unknown: code_err(ast, "Unknown AST: ", ast_to_xml_str(ast));
}
diff --git a/src/parse.c b/src/parse.c
index 9d4d35ee..fa021e28 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -131,7 +131,6 @@ static PARSER(parse_path);
static PARSER(parse_reduction);
static PARSER(parse_repeat);
static PARSER(parse_return);
-static PARSER(parse_say);
static PARSER(parse_set);
static PARSER(parse_skip);
static PARSER(parse_stack_reference);
@@ -1740,8 +1739,7 @@ PARSER(parse_assignment) {
PARSER(parse_statement) {
ast_t *stmt = NULL;
if ((stmt=parse_declaration(ctx, pos))
- || (stmt=parse_doctest(ctx, pos))
- || (stmt=parse_say(ctx, pos)))
+ || (stmt=parse_doctest(ctx, pos)))
return stmt;
if (!(false
@@ -2287,48 +2285,6 @@ PARSER(parse_doctest) {
return NewAST(ctx->file, start, pos, DocTest, .expr=expr, .expected=expected);
}
-PARSER(parse_say) {
- const char *start = pos;
- if (!match(&pos, "!!")) return NULL;
- spaces(&pos);
-
- ast_list_t *chunks = NULL;
- CORD chunk = CORD_EMPTY;
- const char *chunk_start = pos;
- const char open_interp = '$';
- while (pos < ctx->file->text + ctx->file->len) {
- if (*pos == open_interp) { // Interpolation
- const char *interp_start = pos;
- if (chunk) {
- ast_t *literal = NewAST(ctx->file, chunk_start, pos, TextLiteral, .cord=chunk);
- chunks = new(ast_list_t, .ast=literal, .next=chunks);
- chunk = NULL;
- }
- ++pos;
- ast_t *interp;
- if (*pos == ' ' || *pos == '\t')
- parser_err(ctx, pos, pos+1, "Whitespace is not allowed before an interpolation here");
- interp = expect(ctx, interp_start, &pos, parse_term, "I expected an interpolation term here");
- chunks = new(ast_list_t, .ast=interp, .next=chunks);
- chunk_start = pos;
- } else if (*pos == '\r' || *pos == '\n') { // Newline
- break;
- } else { // Plain character
- chunk = CORD_cat_char(chunk, *pos);
- ++pos;
- }
- }
-
- if (chunk) {
- ast_t *literal = NewAST(ctx->file, chunk_start, pos, TextLiteral, .cord=chunk);
- chunks = new(ast_list_t, .ast=literal, .next=chunks);
- chunk = NULL;
- }
-
- REVERSE_LIST(chunks);
- return NewAST(ctx->file, start, pos, PrintStatement, .to_print=chunks);
-}
-
PARSER(parse_use) {
const char *start = pos;
diff --git a/src/typecheck.c b/src/typecheck.c
index c6f8b10f..c5243195 100644
--- a/src/typecheck.c
+++ b/src/typecheck.c
@@ -1020,7 +1020,7 @@ type_t *get_type(env_t *env, ast_t *ast)
case Stop: case Skip: {
return Type(AbortType);
}
- case Pass: case Defer: case PrintStatement: return Type(VoidType);
+ case Pass: case Defer: return Type(VoidType);
case Negative: {
ast_t *value = Match(ast, Negative)->value;
type_t *t = get_type(env, value);
diff --git a/test/bytes.tm b/test/bytes.tm
index b312c308..a62acd10 100644
--- a/test/bytes.tm
+++ b/test/bytes.tm
@@ -1,6 +1,6 @@
func main():
- !! Test bytes:
+ say("Test bytes:")
>> Byte(100)
= Byte(0x64)
diff --git a/test/integers.tm b/test/integers.tm
index 04256c88..76e55ca1 100644
--- a/test/integers.tm
+++ b/test/integers.tm
@@ -17,7 +17,7 @@ func main():
>> 1 << 10
= 1024
- !! Signed and unsigned bit shifting:
+ say("Signed and unsigned bit shifting:")
>> Int64(-2) << 1
= Int64(-4)
>> Int64(-2) <<< 1
diff --git a/test/lambdas.tm b/test/lambdas.tm
index b1bc2968..3d536086 100644
--- a/test/lambdas.tm
+++ b/test/lambdas.tm
@@ -36,7 +36,7 @@ func main():
fn := func():
return func():
return func():
- defer: !! $outer
+ defer: say("$outer")
return outer
>> fn()()()
= "Hello"
diff --git a/test/optionals.tm b/test/optionals.tm
index 703e74e9..316b2e71 100644
--- a/test/optionals.tm
+++ b/test/optionals.tm
@@ -86,7 +86,7 @@ func main():
= -1
do:
- !! Ints:
+ say("Ints:")
>> yep := maybe_int(yes)
= 123?
>> nope := maybe_int(no)
@@ -97,11 +97,10 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! Int64s:
+ say("Int64s:")
>> yep := maybe_int64(yes)
= Int64(123)?
>> nope := maybe_int64(no)
@@ -112,11 +111,10 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! Arrays:
+ say("Arrays:")
>> yep := maybe_array(yes)
= [10, 20, 30]?
>> nope := maybe_array(no)
@@ -127,11 +125,11 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! Bools:
+ say("...")
+ say("Bools:")
>> yep := maybe_bool(yes)
= no?
>> nope := maybe_bool(no)
@@ -142,11 +140,11 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! Text:
+ say("...")
+ say("Text:")
>> yep := maybe_text(yes)
= "Hello"?
>> nope := maybe_text(no)
@@ -157,11 +155,11 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! Nums:
+ say("...")
+ say("Nums:")
>> yep := maybe_num(yes)
= 12.3?
>> nope := maybe_num(no)
@@ -172,11 +170,11 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! Lambdas:
+ say("...")
+ say("Lambdas:")
# >> yep := maybe_lambda(yes)
# = func() [optionals.tm:54] : func()?
>> nope := maybe_lambda(no)
@@ -187,11 +185,11 @@ func main():
# else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! Structs:
+ say("...")
+ say("Structs:")
>> yep := Struct.maybe(yes)
= Struct(x=123, y="hello")?
>> nope := Struct.maybe(no)
@@ -202,11 +200,11 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! Enums:
+ say("...")
+ say("Enums:")
>> yep := Enum.maybe(yes)
= Enum.Y(123)?
>> nope := Enum.maybe(no)
@@ -217,11 +215,11 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
do:
- !! ...
- !! C Strings:
+ say("...")
+ say("C Strings:")
>> yep := maybe_c_string(yes)
= CString("hi")?
>> nope := maybe_c_string(no)
@@ -232,7 +230,7 @@ func main():
else: fail("Falsey: $yep")
>> if nope:
fail("Truthy: $nope")
- else: !! Falsey: $nope
+ else: say("Falsey: $nope")
if yep := maybe_int(yes):
>> yep
diff --git a/test/paths.tm b/test/paths.tm
index e8cfd2ab..e448dee1 100644
--- a/test/paths.tm
+++ b/test/paths.tm
@@ -82,49 +82,49 @@ func main():
= (..)
# Concatenation tests:
- !! Basic relative path concatenation:
+ say("Basic relative path concatenation:")
>> (/foo) ++ (./baz)
= (/foo/baz)
- !! Concatenation with a current directory (`.`):
+ say("Concatenation with a current directory (`.`):")
>> (/foo/bar) ++ (./.)
= (/foo/bar)
- !! Trailing slash in the first path:
+ say("Trailing slash in the first path:")
>> (/foo/) ++ (./baz)
= (/foo/baz)
- !! Trailing slash in the second path:
+ say("Trailing slash in the second path:")
>> (/foo/bar) ++ (./baz/)
= (/foo/bar/baz)
- !! Removing redundant current directory (`.`):
+ say("Removing redundant current directory (`.`):")
>> (/foo/bar) ++ (./baz/./qux)
= (/foo/bar/baz/qux)
- !! Removing redundant parent directory (`..`):
+ say("Removing redundant parent directory (`..`):")
>> (/foo/bar) ++ (./baz/qux/../quux)
= (/foo/bar/baz/quux)
- !! Collapsing `..` to navigate up:
+ say("Collapsing `..` to navigate up:")
>> (/foo/bar/baz) ++ (../qux)
= (/foo/bar/qux)
- !! Current directory and parent directory mixed:
+ say("Current directory and parent directory mixed:")
>> (/foo/bar) ++ (././../baz)
= (/foo/baz)
- !! Path begins with a `.`:
+ say("Path begins with a `.`:")
>> (/foo) ++ (./baz/../qux)
= (/foo/qux)
- !! Multiple slashes:
+ say("Multiple slashes:")
>> (/foo) ++ (./baz//qux)
= (/foo/baz/qux)
- !! Complex path with multiple `.` and `..`:
+ say("Complex path with multiple `.` and `..`:")
>> (/foo/bar/baz) ++ (./.././qux/./../quux)
= (/foo/bar/quux)
- !! Globbing:
+ say("Globbing:")
>> (./*.tm):glob()
diff --git a/test/reductions.tm b/test/reductions.tm
index f0618b21..f2fa4b9c 100644
--- a/test/reductions.tm
+++ b/test/reductions.tm
@@ -27,7 +27,7 @@ func main():
>> (_max_.y:abs(): [Foo(0, 0), Foo(1, 0), Foo(0, 10), Foo(0, -999)])!
= Foo(x=0, y=-999)
- !! (or) and (and) have early out behavior:
+ say("(or) and (and) have early out behavior:")
>> (or: i == 3 for i in 9999999999999999999999999999)!
= yes
diff --git a/test/text.tm b/test/text.tm
index 2e061415..df48470e 100644
--- a/test/text.tm
+++ b/test/text.tm
@@ -1,6 +1,6 @@
func main():
str := "Hello Amélie!"
- !! Testing strings like $str
+ say("Testing strings like $str")
>> str:upper()
= "HELLO AMÉLIE!"
@@ -100,7 +100,7 @@ func main():
"
= "line one$\nline two"
- !! Interpolation tests:
+ say("Interpolation tests:")
>> "A $(1+2)"
= "A 3"
>> 'A $(1+2)'
@@ -138,7 +138,7 @@ func main():
>> "":lines()
= []
- !! Test splitting and joining text:
+ say("Test splitting and joining text:")
>> "one,, two,three":split(",")
= ["one", "", " two", "three"]
>> [t for t in "one,, two,three":by_split(",")]
@@ -177,7 +177,7 @@ func main():
>> "":split()
= []
- !! Test text slicing:
+ say("Test text slicing:")
>> "abcdef":slice()
= "abcdef"
>> "abcdef":slice(from=3)
@@ -237,7 +237,7 @@ func main():
= "eilémA olleh"
do:
- !! Testing concatenation-stability:
+ say("Testing concatenation-stability:")
ab := Text.from_codepoint_names(["LATIN SMALL LETTER E", "COMBINING VERTICAL LINE BELOW"])!
>> ab:codepoint_names()
= ["LATIN SMALL LETTER E", "COMBINING VERTICAL LINE BELOW"]