Refactor: Improve explanation of Block return behavior

This commit is contained in:
2025-09-22 12:54:55 -07:00
parent 6ebd87099b
commit be903939eb

View File

@@ -339,17 +339,41 @@ user.log() // Prints "ID is: 101" (@ is 'user')
item.log() // Prints "ID is: abc-789" (@ is 'item')
\`\`\`
## Expression Blocks and Fluent Chaining
## Method Chaining
Hi adopts an expression-oriented design, similar to Rust. Every **Block** is an expression that yields a value.
A Block's return behavior is designed for fluency. It implicitly returns the value of its last expression. If the last expression does not yield a value (such as an assignment), the Block returns its context (\`@\`) by default, enabling method chaining. The \`^\` symbol is used for an explicit or early return from any point in the Block.
- The value of the *last expression* in a Block is implicitly returned.
- To return early or explicitly, use the return symbol \`^\`.
This makes code more concise by eliminating the need for explicit \`return\` keywords in most cases.
\`\`\`javascript
// The last expression, \`a + b\`, is returned.
add: (a, b) {
_("adding...") // Side-effect
a + b // Return value
}
result: add(2, 3) // result is 5
// An early, explicit return
check: (n) {
(n < 0) ? { ^ "Negative" }
"Positive"
}
\`\`\`
### Fluent Chaining
To enable fluent method chaining, Hi adds one special rule: if the last expression in a block produces no value (e.g., an assignment), the block returns its own context (\`@\`) by default. This allows subsequent method calls on the same object.
\`\`\`javascript
calculator: {
#total: 0
add: (n) { total = total + n } // Implicitly returns '@'
sub: (n) { total = total - n } // Implicitly returns '@'
get: { ^ total } // Explicitly returns the total
add: (n) { total = total + n } // Assignment has no value, returns '@'
sub: (n) { total = total - n } // Also returns '@'
get: { ^ total } // Explicitly returns the final value
}
// .add() and .sub() return the calculator, allowing the chain
@@ -441,4 +465,3 @@ To create the initial Hi-to-JS transpiler, the following primitives and built-in
</script>
</body>
</html>