Skip to content

Commit 8c653c7

Browse files
committed
docs: update playground with metamethod examples, fix import syntax, and add build tasks
1 parent a47db74 commit 8c653c7

File tree

10 files changed

+844
-608
lines changed

10 files changed

+844
-608
lines changed

Cargo.lock

Lines changed: 323 additions & 136 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Taskfile.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,14 @@ tasks:
1313
test-cov:
1414
cmds:
1515
- cargo tarpaulin --config tarpaulin.toml
16+
17+
wasm-build:
18+
desc: Build the WASM package
19+
cmds:
20+
- wasm-pack build --target web --out-dir docs/pkg
21+
22+
23+
wasm-test:
24+
desc: Run WASM tests
25+
cmds:
26+
- wasm-pack test --headless --firefox

docs/index.html

Lines changed: 85 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,92 @@
1-
<!DOCTYPE html>
1+
<!doctype html>
22
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>Chen Lang Playground</title>
7+
<link rel="preconnect" href="https://fonts.googleapis.com" />
8+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9+
<link
10+
href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500&family=Inter:wght@400;600;700&display=swap"
11+
rel="stylesheet"
12+
/>
13+
<link rel="stylesheet" href="style.css" />
14+
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
15+
</head>
316

4-
<head>
5-
<meta charset="utf-8">
6-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7-
<title>Chen Lang Playground</title>
8-
<link rel="preconnect" href="https://fonts.googleapis.com">
9-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10-
<link
11-
href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500&family=Inter:wght@400;600;700&display=swap"
12-
rel="stylesheet">
13-
<link rel="stylesheet" href="style.css">
14-
<link rel="icon" type="image/svg+xml" href="favicon.svg">
15-
</head>
17+
<body>
18+
<div class="playground">
19+
<header>
20+
<div class="logo-area">
21+
<h1>Chen Lang <span>Playground</span></h1>
22+
</div>
23+
<div class="action-area">
24+
<div class="example-picker">
25+
<span>Example</span>
26+
<select id="example-select">
27+
<option value="hello">Hello World</option>
28+
<option value="if_else_if">Else If Chain</option>
29+
<option value="multiplication_table">9x9 Table</option>
30+
<option value="fib">Fibonacci</option>
31+
<option value="objects">Objects & Methods</option>
32+
<option value="metamethod_funcs">Metamethod Functions</option>
33+
<option value="point_objects">Custom Point</option>
34+
<option value="inheritance">Inheritance</option>
35+
<option value="date">Date & Time</option>
36+
<option value="json">JSON</option>
37+
<option value="arrays">Arrays</option>
38+
<option value="closures">Closures</option>
39+
<option value="async_task">Coroutines</option>
40+
<option value="async_http">Async HTTP Request</option>
41+
<option value="concurrent_http">Concurrent HTTP</option>
42+
<option value="christmas_tree">Christmas Tree</option>
43+
</select>
44+
</div>
45+
<button id="run">
46+
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
47+
<path d="M8 5v14l11-7z" />
48+
</svg>
49+
Run
50+
</button>
51+
</div>
52+
</header>
1653

17-
<body>
18-
<div class="playground">
19-
<header>
20-
<div class="logo-area">
21-
<h1>Chen Lang <span>Playground</span></h1>
22-
</div>
23-
<div class="action-area">
24-
<div class="example-picker">
25-
<span>Example</span>
26-
<select id="example-select">
27-
<option value="hello">Hello World</option>
28-
<option value="if_else_if">Else If Chain</option>
29-
<option value="multiplication_table">9x9 Table</option>
30-
<option value="fib">Fibonacci</option>
31-
<option value="objects">Objects & Methods</option>
32-
<option value="point_objects">Custom Point</option>
33-
<option value="inheritance">Inheritance</option>
34-
<option value="date">Date & Time</option>
35-
<option value="json">JSON</option>
36-
<option value="arrays">Arrays</option>
37-
<option value="closures">Closures</option>
38-
<option value="async_task">Coroutines</option>
39-
<option value="async_http">Async HTTP Request</option>
40-
<option value="concurrent_http">Concurrent HTTP</option>
41-
<option value="christmas_tree">Christmas Tree</option>
42-
</select>
43-
</div>
44-
<button id="run">
45-
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
46-
<path d="M8 5v14l11-7z" />
47-
</svg>
48-
Run
49-
</button>
50-
</div>
51-
</header>
54+
<main class="workspace">
55+
<section class="pane">
56+
<div class="pane-header">Editor</div>
57+
<div class="editor-wrapper">
58+
<div id="line-numbers" class="line-numbers"></div>
59+
<div class="editor-view">
60+
<pre id="highlighting" aria-hidden="true"></pre>
61+
<textarea
62+
id="code"
63+
spellcheck="false"
64+
autocomplete="off"
65+
autocapitalize="off"
66+
data-gramm="false"
67+
></textarea>
68+
</div>
69+
</div>
70+
</section>
5271

53-
<main class="workspace">
54-
<section class="pane">
55-
<div class="pane-header">
56-
Editor
57-
</div>
58-
<div class="editor-wrapper">
59-
<div id="line-numbers" class="line-numbers"></div>
60-
<div class="editor-view">
61-
<pre id="highlighting" aria-hidden="true"></pre>
62-
<textarea id="code" spellcheck="false" autocomplete="off" autocapitalize="off"
63-
data-gramm="false"></textarea>
64-
</div>
65-
</div>
66-
</section>
72+
<div class="pane-border"></div>
6773

68-
<div class="pane-border"></div>
74+
<section class="pane">
75+
<div class="pane-header">
76+
Output
77+
<button id="clear-output" class="clear-btn">Clear</button>
78+
</div>
79+
<div class="output-container">
80+
<pre id="output"></pre>
81+
</div>
82+
</section>
83+
</main>
6984

70-
<section class="pane">
71-
<div class="pane-header">
72-
Output
73-
<button id="clear-output" class="clear-btn">Clear</button>
85+
<footer>
86+
<div class="status-dot"></div>
87+
WASM Runtime Ready
88+
</footer>
7489
</div>
75-
<div class="output-container">
76-
<pre id="output"></pre>
77-
</div>
78-
</section>
79-
</main>
80-
81-
<footer>
82-
<div class="status-dot"></div>
83-
WASM Runtime Ready
84-
</footer>
85-
</div>
86-
<script type="module" src="index.js"></script>
87-
</body>
88-
89-
</html>
90+
<script type="module" src="index.js"></script>
91+
</body>
92+
</html>

docs/index.js

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import init, { run_wasm } from './pkg/chen_lang.js';
22

33
const examples = {
44
hello: `# Basic: Hello World
5-
let io = import "stdlib/io"
5+
let io = import("stdlib/io")
66
let print = io.print
77
let println = io.println
88
@@ -14,7 +14,7 @@ if a > 5 {
1414
}
1515
`,
1616
if_else_if: `# Feature: Else If Chain
17-
let io = import "stdlib/io"
17+
let io = import("stdlib/io")
1818
let println = io.println
1919
2020
let score = 85
@@ -34,7 +34,7 @@ let grade = if score >= 90 { "A" } else if score >= 60 { "P" } else { "F" }
3434
println("Grade result: " + grade)
3535
`,
3636
multiplication_table: `# Feature: for loop (9x9 Table)
37-
let io = import "stdlib/io"
37+
let io = import("stdlib/io")
3838
let print = io.print
3939
let println = io.println
4040
@@ -50,7 +50,7 @@ for i <= 9 {
5050
}
5151
`,
5252
fib: `# Algorithm: Fibonacci
53-
let io = import "stdlib/io"
53+
let io = import("stdlib/io")
5454
let println = io.println
5555
5656
def fib(n) {
@@ -64,7 +64,7 @@ println("Fibonacci of 10 is:")
6464
println(fib(10))
6565
`,
6666
objects: `# Pattern: Objects & Methods (Lua-style)
67-
let io = import "stdlib/io"
67+
let io = import("stdlib/io")
6868
let println = io.println
6969
7070
def Person(name) {
@@ -83,9 +83,37 @@ def Person(name) {
8383
8484
let chen = Person("Chen")
8585
chen:greet()
86+
`,
87+
metamethod_funcs: `# Advanced: Metamethod Functions
88+
let io = import("stdlib/io")
89+
let println = io.println
90+
91+
# Implement a "Strict Object" that throws on unknown access
92+
def create_strict_model(data) {
93+
let meta = \${
94+
# Intercept missing property lookup
95+
__index: def(obj, key) {
96+
println("Warning: Accessing undefined property '" + key + "'")
97+
return null
98+
},
99+
# Intercept new property assignment
100+
__newindex: def(obj, key, value) {
101+
println("Blocked: Settng new property '" + key + "' to " + value)
102+
}
103+
}
104+
set_meta(data, meta)
105+
return data
106+
}
107+
108+
let user = create_strict_model(\${ name: "Chen" })
109+
110+
println("Name: " + user.name)
111+
println("Age: " + user.age) # Triggers __index
112+
113+
user.score = 100 # Triggers __newindex
86114
`,
87115
inheritance: `# Pattern: Prototype Inheritance
88-
let io = import "stdlib/io"
116+
let io = import("stdlib/io")
89117
let println = io.println
90118
91119
# Base "Class"
@@ -127,7 +155,7 @@ dog:speak() # Inherited from Animal
127155
dog:bark() # Defined in Dog
128156
`,
129157
point_objects: `# Pattern: Custom Objects (Point with methods and operators)
130-
let io = import "stdlib/io"
158+
let io = import("stdlib/io")
131159
let println = io.println
132160
133161
@@ -199,9 +227,9 @@ println("p5_mul (overloaded *):")
199227
println(p5_mul:to_string())
200228
`,
201229
date: `# StdLib: Date & Time
202-
let io = import "stdlib/io"
203-
let Date = import "stdlib/date"
204-
let JSON = import "stdlib/json"
230+
let io = import("stdlib/io")
231+
let Date = import("stdlib/date")
232+
let JSON = import("stdlib/json")
205233
let println = io.println
206234
207235
let now = Date:new()
@@ -211,8 +239,8 @@ println("Current time (ISO): " + now:format("%Y-%m-%d %H:%M:%S"))
211239
println("As JSON: " + JSON.stringify(now))
212240
`,
213241
json: `# StdLib: JSON Processing
214-
let io = import "stdlib/io"
215-
let JSON = import "stdlib/json"
242+
let io = import("stdlib/io")
243+
let JSON = import("stdlib/json")
216244
let println = io.println
217245
218246
let data = \${
@@ -229,8 +257,8 @@ let parsed = JSON.parse(jsonStr)
229257
println("Parsed JSON Name: " + parsed.name)
230258
`,
231259
arrays: `# StdLib: Arrays
232-
let io = import "stdlib/io"
233-
let JSON = import "stdlib/json"
260+
let io = import("stdlib/io")
261+
let JSON = import("stdlib/json")
234262
let println = io.println
235263
236264
# Arrays are dynamic list-like objects
@@ -247,7 +275,7 @@ arr:push("Mixed")
247275
println(JSON.stringify(arr))
248276
`,
249277
closures: `# Feature: Closures
250-
let io = import "stdlib/io"
278+
let io = import("stdlib/io")
251279
let println = io.println
252280
253281
def make_counter(start) {
@@ -278,7 +306,7 @@ println("Counter 2: " + c2()) # 12
278306
println("Counter 1 again: " + c1()) # 4
279307
`,
280308
async_task: `# Feature: Async/Await (Coroutines)
281-
let io = import "stdlib/io"
309+
let io = import("stdlib/io")
282310
let println = io.println
283311
284312
# Coroutines using 'coroutine.create' and 'coroutine.yield'.
@@ -316,9 +344,9 @@ println("Main result: " + result)
316344
println("Generator status: " + coroutine.status(gen))
317345
`,
318346
async_http: `# Feature: Async HTTP Request
319-
let http = import "stdlib/http"
320-
let json = import "stdlib/json"
321-
let println = import "stdlib/io".println
347+
let http = import("stdlib/http")
348+
let json = import("stdlib/json")
349+
let println = import("stdlib/io").println
322350
323351
println("Sending request to httpbin.org...")
324352
let url = "https://httpbin.org/anything"
@@ -329,9 +357,9 @@ let data = json.parse(resp.body)
329357
println("Response JSON origin: " + data.origin)
330358
`,
331359
concurrent_http: `# Feature: Concurrent HTTP Requests
332-
let http = import "stdlib/http"
333-
let json = import "stdlib/json"
334-
let println = import "stdlib/io".println
360+
let http = import("stdlib/http")
361+
let json = import("stdlib/json")
362+
let println = import("stdlib/io").println
335363
336364
println("Starting concurrent HTTP requests...")
337365
@@ -366,7 +394,7 @@ println("Request 2 status: " + results[1])
366394
println("Request 3 UUID: " + results[2])
367395
`,
368396
christmas_tree: `# Merry Christmas!
369-
let println = import "stdlib/io".println
397+
let println = import("stdlib/io").println
370398
371399
# Simple string repeat function
372400
def repeat(str, count) {

docs/pkg/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
#### 1. Hello World & String Operations
2828
```python
29-
let io = import "stdlib/io"
29+
let io = import("stdlib/io")
3030
let name = "Chen Lang"
3131
io.println("Hello, " + name + "!")
3232
# Output: Hello, Chen Lang!
@@ -138,7 +138,7 @@ println(person[key]) # Output: Alice
138138
* [x] **Object System**: Object literals, property access, indexing, metatables (can be used as arrays)
139139
* [x] **Standard Library**: File I/O, Math functions
140140
* [x] **Error Handling**: Try/Catch or Result type
141-
* [ ] **Closures**: Capture variables from outer scopes
141+
* [x] **Closures**: Capture variables from outer scopes
142142
143143
144144
---

0 commit comments

Comments
 (0)