diff --git a/index.html b/index.html index 650d95d..14f7868 100644 --- a/index.html +++ b/index.html @@ -105,10 +105,28 @@ version = 1.1 // Assignment ## The Block: A Unified Structure -The \`{}\` syntax creates a **Block**, the foundational structure in Hi. A Block can be used as a function or an object. +The \`{}\` syntax creates a **Block**, the single most foundational structure in Hi. A Block is a sequence of expressions that can represent data structures (like objects), executable code (like functions), or both simultaneously. -### Function Block -A Block with executable code is a function. Parameters are defined with \`()\`. +### As a Data Structure +When a Block contains named declarations (\`key: value\`), it behaves like an object. A \`#\` prefix denotes a private property. To support code golfing, expression separators are flexible: + +- **Newlines** act as separators. Commas or semicolons are optional. +- **Commas (\`,\`) or semicolons (\`;\`)** must be used to separate expressions on the same line. + +\`\`\`javascript +// Multi-line: separators are optional +player: { + name: "Orion" + #hp: 100 +} + +// Single-line: separators are required +player: { name: "Orion", #hp: 100 } +point: { x: 10; y: 20 } +\`\`\` + +### As Executable Code +A Block containing executable statements can be invoked like a function. Parameters are defined using \`()\` before the block. \`\`\`javascript sayHi: { _("Hi") } @@ -118,27 +136,14 @@ greet: (name) { _("Hi, " + name) } greet("Orion") \`\`\` -### Object Block -A Block with named properties is an object. A \`#\` prefix denotes a private property. Commas are optional between properties on separate lines. - -\`\`\`javascript -// Properties on separate lines (commas optional) -player: { - name: "Orion" - #hp: 100 -} - -// Properties on the same line (commas required) -player: { name: "Orion", #hp: 100 } -\`\`\` - -An object's properties can be functions (other blocks). Inner blocks inherit the parent's scope, allowing them to access private state. This provides encapsulation without classes. +### Unification: Data and Behavior +Since a Block is just a sequence of expressions, data and behavior can be combined seamlessly. This provides natural encapsulation without classes. Inner blocks inherit the parent's scope, allowing access to its state. \`\`\`javascript counter: { - #value: 0 - inc: { value = value + 1 } - get: { value } + #value: 0 // Data declaration + inc: { #value = #value + 1 } // Behavior + get: { #value } // Behavior } counter.inc() @@ -423,4 +428,3 @@ To create the initial Hi-to-JS transpiler, the following primitives and built-in -