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:
Vendored
+167
@@ -0,0 +1,167 @@
|
||||
// retoor <retoor@molodetz.nl>
|
||||
|
||||
import "pathlib" for Path
|
||||
|
||||
System.print("=== Pathlib Module Demo ===\n")
|
||||
|
||||
System.print("--- Path Construction ---")
|
||||
var p = Path.new("/home/user/documents/report.tar.gz")
|
||||
System.print("Path: %(p)")
|
||||
System.print("Name: %(p.name)")
|
||||
System.print("Stem: %(p.stem)")
|
||||
System.print("Suffix: %(p.suffix)")
|
||||
System.print("Suffixes: %(p.suffixes)")
|
||||
System.print("Parts: %(p.parts)")
|
||||
|
||||
System.print("\n--- Parent Navigation ---")
|
||||
System.print("Parent: %(p.parent)")
|
||||
System.print("Parents:")
|
||||
for (ancestor in p.parents) {
|
||||
System.print(" %(ancestor)")
|
||||
}
|
||||
|
||||
System.print("\n--- Path Properties ---")
|
||||
System.print("Root: %(p.root)")
|
||||
System.print("Anchor: %(p.anchor)")
|
||||
System.print("Is absolute: %(p.isAbsolute)")
|
||||
var rel = Path.new("relative/path.txt")
|
||||
System.print("%(rel) is absolute: %(rel.isAbsolute)")
|
||||
|
||||
System.print("\n--- Join Operator (/) ---")
|
||||
var base = Path.new("/home/user")
|
||||
var config = base / ".config" / "myapp" / "settings.json"
|
||||
System.print("%(base) / .config / myapp / settings.json = %(config)")
|
||||
|
||||
System.print("\n--- joinpath ---")
|
||||
var multi = Path.new("/opt").joinpath(["local", "bin", "wren_cli"])
|
||||
System.print("Joined: %(multi)")
|
||||
|
||||
System.print("\n--- withName / withStem / withSuffix ---")
|
||||
var orig = Path.new("/data/archive.tar.gz")
|
||||
System.print("Original: %(orig)")
|
||||
System.print("withName(\"backup.zip\"): %(orig.withName("backup.zip"))")
|
||||
System.print("withStem(\"snapshot\"): %(orig.withStem("snapshot"))")
|
||||
System.print("withSuffix(\".bak\"): %(orig.withSuffix(".bak"))")
|
||||
|
||||
System.print("\n--- relativeTo ---")
|
||||
var full = Path.new("/home/user/projects/wren/src/main.c")
|
||||
var project = Path.new("/home/user/projects/wren")
|
||||
System.print("%(full) relative to %(project) = %(full.relativeTo(project))")
|
||||
|
||||
System.print("\n--- Glob Matching ---")
|
||||
var file = Path.new("/tmp/notes.txt")
|
||||
System.print("%(file.name) matches *.txt: %(file.match("*.txt"))")
|
||||
System.print("%(file.name) matches *.md: %(file.match("*.md"))")
|
||||
System.print("%(file.name) matches note?: %(file.match("note?"))")
|
||||
System.print("%(file.name) matches n*s.txt: %(file.match("n*s.txt"))")
|
||||
|
||||
System.print("\n--- Home and CWD ---")
|
||||
System.print("Home: %(Path.home)")
|
||||
System.print("CWD: %(Path.cwd)")
|
||||
|
||||
System.print("\n--- Expand User ---")
|
||||
var tilde = Path.new("~/.bashrc")
|
||||
System.print("%(tilde) -> %(tilde.expanduser())")
|
||||
|
||||
System.print("\n--- Equality ---")
|
||||
var a = Path.new("/tmp/test")
|
||||
var b = Path.new("/tmp/test")
|
||||
var c = Path.new("/tmp/other")
|
||||
System.print("%(a) == %(b): %(a == b)")
|
||||
System.print("%(a) == %(c): %(a == c)")
|
||||
System.print("%(a) != %(c): %(a != c)")
|
||||
|
||||
System.print("\n--- Filesystem Operations ---")
|
||||
var testDir = Path.new("/tmp/wren_pathlib_demo")
|
||||
if (testDir.exists()) testDir.rmtree()
|
||||
|
||||
testDir.mkdir(true)
|
||||
System.print("Created: %(testDir)")
|
||||
System.print("Exists: %(testDir.exists())")
|
||||
System.print("Is dir: %(testDir.isDir())")
|
||||
|
||||
var testFile = testDir / "hello.txt"
|
||||
testFile.writeText("Hello from pathlib!")
|
||||
System.print("Wrote: %(testFile)")
|
||||
System.print("Content: %(testFile.readText())")
|
||||
System.print("Is file: %(testFile.isFile())")
|
||||
|
||||
System.print("\n--- Stat ---")
|
||||
var s = testFile.stat()
|
||||
System.print("Size: %(s.size) bytes")
|
||||
|
||||
System.print("\n--- Touch ---")
|
||||
var marker = testDir / "marker"
|
||||
marker.touch()
|
||||
System.print("Touched: %(marker) (exists: %(marker.exists()))")
|
||||
|
||||
System.print("\n--- Copy ---")
|
||||
var copy = testDir / "hello_copy.txt"
|
||||
testFile.copyfile(copy)
|
||||
System.print("Copied to: %(copy)")
|
||||
System.print("Copy content: %(copy.readText())")
|
||||
|
||||
System.print("\n--- Rename ---")
|
||||
var renamed = testFile.rename(testDir / "greeting.txt")
|
||||
System.print("Renamed to: %(renamed)")
|
||||
System.print("Old exists: %(testFile.exists())")
|
||||
System.print("New content: %(renamed.readText())")
|
||||
|
||||
System.print("\n--- Resolve ---")
|
||||
var resolved = Path.new(".").resolve()
|
||||
System.print("Resolved '.': %(resolved)")
|
||||
|
||||
System.print("\n--- Same File ---")
|
||||
System.print("Same file: %(renamed.samefile(renamed))")
|
||||
|
||||
System.print("\n--- Owner and Group ---")
|
||||
System.print("Owner: %(renamed.owner())")
|
||||
System.print("Group: %(renamed.group())")
|
||||
|
||||
System.print("\n--- Mkdir with Parents ---")
|
||||
var deep = testDir / "a" / "b" / "c"
|
||||
deep.mkdir(true)
|
||||
System.print("Created: %(deep)")
|
||||
System.print("Exists: %(deep.exists())")
|
||||
|
||||
System.print("\n--- Iterdir ---")
|
||||
(testDir / "file1.txt").writeText("one")
|
||||
(testDir / "file2.txt").writeText("two")
|
||||
var entries = testDir.iterdir()
|
||||
System.print("Entries in %(testDir.name):")
|
||||
for (entry in entries) {
|
||||
var kind = entry.isDir() ? "dir" : "file"
|
||||
System.print(" %(entry.name) (%(kind))")
|
||||
}
|
||||
|
||||
System.print("\n--- Glob ---")
|
||||
var txtFiles = testDir.glob("*.txt")
|
||||
System.print("Text files in %(testDir.name):")
|
||||
for (f in txtFiles) {
|
||||
System.print(" %(f.name)")
|
||||
}
|
||||
|
||||
System.print("\n--- Recursive Glob ---")
|
||||
(testDir / "a" / "nested.txt").writeText("nested")
|
||||
(testDir / "a" / "b" / "deep.txt").writeText("deep")
|
||||
var allTxt = testDir.rglob("*.txt")
|
||||
System.print("All text files (recursive):")
|
||||
for (f in allTxt) {
|
||||
System.print(" %(f.relativeTo(testDir))")
|
||||
}
|
||||
|
||||
System.print("\n--- Walk ---")
|
||||
System.print("Directory tree:")
|
||||
for (entry in testDir.walk()) {
|
||||
var dir = entry[0]
|
||||
var dirs = entry[1]
|
||||
var files = entry[2]
|
||||
var indent = dir == testDir ? "" : " "
|
||||
System.print("%(indent)%(dir.relativeTo(testDir))/ (%(dirs.count) dirs, %(files.count) files)")
|
||||
}
|
||||
|
||||
System.print("\n--- Cleanup ---")
|
||||
testDir.rmtree()
|
||||
System.print("Cleaned up: %(testDir) (exists: %(testDir.exists()))")
|
||||
|
||||
System.print("\n=== Demo Complete ===")
|
||||
Reference in New Issue
Block a user