feat: add async/await keywords, Num/String extensions, and Jinja markdown example

Add `async` and `await` token support to the Wren compiler with scheduler resolution logic, extend `Num` with `e` constant, hyperbolic trig, base conversion, and new methods (`isZero`, `gcd`, `lcm`, `digits`, etc.), extend `String` with `lower`, `upper`, `capitalize`, `title`, and regenerate `wren_core.wren.inc`. Include `Makefile` for multi-platform builds, rewrite `README.md` with updated build instructions, and add `example/await_demo.wren` and `example/jinja_markdown.wren` demonstrating new features.
This commit is contained in:
2026-01-25 03:58:39 +00:00
parent 74ef5cbc11
commit 46fc2e2470
139 changed files with 5078 additions and 73 deletions
+18
View File
@@ -0,0 +1,18 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var dir = Path.new("/tmp/wren_pathlib_test_copy")
if (dir.exists()) dir.rmtree()
dir.mkdir()
var src = dir / "original.txt"
src.writeText("copy me")
var dst = dir / "copied.txt"
src.copyfile(dst)
System.print(dst.exists()) // expect: true
System.print(dst.readText()) // expect: copy me
dir.rmtree()
+12
View File
@@ -0,0 +1,12 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var cwd = Path.cwd
System.print(cwd.isAbsolute) // expect: true
System.print(cwd.exists()) // expect: true
System.print(cwd.isDir()) // expect: true
var home = Path.home
System.print(home.isAbsolute) // expect: true
System.print(home.exists()) // expect: true
+11
View File
@@ -0,0 +1,11 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var p1 = Path.new("/home/user")
var p2 = Path.new("/home/user")
var p3 = Path.new("/home/other")
System.print(p1 == p2) // expect: true
System.print(p1 != p3) // expect: true
System.print(p1 == p3) // expect: false
+13
View File
@@ -0,0 +1,13 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var p1 = Path.new("/tmp")
System.print(p1.exists()) // expect: true
System.print(p1.isDir()) // expect: true
System.print(p1.isFile()) // expect: false
var p2 = Path.new("/nonexistent_path_xyz_12345")
System.print(p2.exists()) // expect: false
System.print(p2.isDir()) // expect: false
System.print(p2.isFile()) // expect: false
+14
View File
@@ -0,0 +1,14 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var home = Path.home
var expanded = Path.new("~").expanduser()
System.print(expanded == home) // expect: true
var subpath = Path.new("~/docs").expanduser()
var expected = home / "docs"
System.print(subpath == expected) // expect: true
var regular = Path.new("/usr/local").expanduser()
System.print(regular) // expect: /usr/local
+22
View File
@@ -0,0 +1,22 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var base = Path.new("/tmp/wren_pathlib_test_glob")
if (base.exists()) base.rmtree()
base.mkdir(true)
(base / "a.txt").writeText("a")
(base / "b.txt").writeText("b")
(base / "c.md").writeText("c")
var sub = base / "sub"
sub.mkdir()
(sub / "d.txt").writeText("d")
var txtFiles = base.glob("*.txt")
System.print(txtFiles.count) // expect: 2
var allTxt = base.rglob("*.txt")
System.print(allTxt.count) // expect: 3
base.rmtree()
+24
View File
@@ -0,0 +1,24 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var dir = Path.new("/tmp/wren_pathlib_test_iterdir")
if (dir.exists()) dir.rmtree()
dir.mkdir()
(dir / "a.txt").writeText("a")
(dir / "b.txt").writeText("b")
(dir / "sub").mkdir()
var entries = dir.iterdir()
System.print(entries.count) // expect: 3
var names = {}
for (e in entries) {
names[e.name] = true
}
System.print(names.containsKey("a.txt")) // expect: true
System.print(names.containsKey("b.txt")) // expect: true
System.print(names.containsKey("sub")) // expect: true
dir.rmtree()
+19
View File
@@ -0,0 +1,19 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var p1 = Path.new("/home")
var p2 = p1.joinpath("user")
System.print(p2) // expect: /home/user
var p3 = p1 / "user" / "docs"
System.print(p3) // expect: /home/user/docs
var p4 = p1.joinpath("/absolute")
System.print(p4) // expect: /absolute
var p5 = Path.new("").joinpath("file.txt")
System.print(p5) // expect: file.txt
var p6 = Path.new("/home/").joinpath("user")
System.print(p6) // expect: /home/user
+10
View File
@@ -0,0 +1,10 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var p1 = Path.new("/home/user/file.txt")
System.print(p1.match("*.txt")) // expect: true
System.print(p1.match("*.py")) // expect: false
System.print(p1.match("file.*")) // expect: true
System.print(p1.match("f???.*")) // expect: true
System.print(p1.match("*")) // expect: true
+14
View File
@@ -0,0 +1,14 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var base = Path.new("/tmp/wren_pathlib_test_mkdir")
if (base.exists()) base.rmtree()
var nested = base / "a" / "b" / "c"
nested.mkdir(true)
System.print(nested.exists()) // expect: true
System.print(nested.isDir()) // expect: true
base.rmtree()
System.print(base.exists()) // expect: false
+17
View File
@@ -0,0 +1,17 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var dir = Path.new("/tmp/wren_pathlib_test_rw")
if (!dir.exists()) dir.mkdir()
var f = dir / "test.txt"
f.writeText("hello pathlib")
System.print(f.readText()) // expect: hello pathlib
System.print(f.exists()) // expect: true
System.print(f.isFile()) // expect: true
f.unlink()
System.print(f.exists()) // expect: false
dir.rmdir()
+10
View File
@@ -0,0 +1,10 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var p1 = Path.new("/home/user/docs/file.txt")
System.print(p1.relativeTo("/home/user")) // expect: docs/file.txt
System.print(p1.relativeTo("/home")) // expect: user/docs/file.txt
var p2 = Path.new("/home/user")
System.print(p2.relativeTo("/home/user")) // expect: .
+19
View File
@@ -0,0 +1,19 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var dir = Path.new("/tmp/wren_pathlib_test_rename")
if (dir.exists()) dir.rmtree()
dir.mkdir()
var src = dir / "source.txt"
src.writeText("content")
System.print(src.exists()) // expect: true
var dst = dir / "dest.txt"
src.rename(dst)
System.print(src.exists()) // expect: false
System.print(dst.exists()) // expect: true
System.print(dst.readText()) // expect: content
dir.rmtree()
+28
View File
@@ -0,0 +1,28 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var base = Path.new("/tmp/wren_pathlib_test_walk")
if (base.exists()) base.rmtree()
base.mkdir()
(base / "file1.txt").writeText("a")
var sub = base / "subdir"
sub.mkdir()
(sub / "file2.txt").writeText("b")
var entries = base.walk()
System.print(entries.count) // expect: 2
var root1 = entries[0][0]
var dirs1 = entries[0][1]
var files1 = entries[0][2]
System.print(dirs1) // expect: [subdir]
System.print(files1) // expect: [file1.txt]
var dirs2 = entries[1][1]
var files2 = entries[1][2]
System.print(dirs2) // expect: []
System.print(files2) // expect: [file2.txt]
base.rmtree()
+17
View File
@@ -0,0 +1,17 @@
// retoor <retoor@molodetz.nl>
import "pathlib" for Path
var p1 = Path.new("/home/user/file.txt")
var p2 = p1.withName("other.md")
System.print(p2) // expect: /home/user/other.md
var p3 = p1.withStem("archive")
System.print(p3) // expect: /home/user/archive.txt
var p4 = p1.withSuffix(".bak")
System.print(p4) // expect: /home/user/file.bak
var p5 = Path.new("/data/file.tar.gz").withSuffix(".zip")
System.print(p5) // expect: /data/file.tar.zip