{"name":"test_06_torture_chamber.nu","source":"// ============================================================\n// test_06_torture_chamber.nu\n// Tarkoitus: Testata AST:n rakentumisen, tyyppipäättelyn ja muistilayoutin\n// ääritapauksia v0.8 kieliopin sallimissa puitteissa.\n//\n// 1. Array of closures (funktio-osoittimet heapissa)\n// 2. Prefix-operaattoreiden syvä sisäkkäisyys ilman sulkeita\n// 3. Ketjutettu member_expr ja set_stmt\n// 4. Try-operaattorin (\\) ja complement-operaattorin (~) disambiguaatio\n// ============================================================\n\n: | Token {\n    Num i\n    Op s\n    Nested ? [Token\n}\n\n: State {\n    [Token tokens\n    i pos\n}\n\n@ get_multiplier i factor → ( @ i i ) {\n    ^ \\ i x → i { ^ * x factor }\n}\n\n@ main → i {\n    ( nurl_print `== Torture chamber ==\\n` )\n\n    // 1. Slice of Closures: Kääntäjän tulee osata varata oikea tila\n    // closure-structeille { function_ptr, env_ptr } slicen sisään.\n    : [( @ i i ) ops [( @ i i ) | ( get_multiplier 2 ) ( get_multiplier 3 )]\n    ( nurl_print `[1] slice-of-closures ops.length=` )\n    ( nurl_print ( nurl_str_int . ops length ) )\n    ( nurl_print `\\n` )\n\n    // Lexical disambiguation -testi: mutatoitava muuttuja (~), jonka\n    // alkuarvo on bittitason komplementti (~) nollasta.\n    : ~ i mask ~ 0\n\n    // 2. Prefix-helvetti: Yhdistetään cond_expr (?), bin_expr (>),\n    // match_expr (??) ja complement_expr (~) peräkkäin ilman sulkeita.\n    // Oikea jäsennyspuu: result = (mask > 0) ? (match t {...}) : (~mask)\n    : | Token t @ Token { Num 42 }\n    : ~ i result 0\n\n    = result ? > mask 0\n    ?? t {\n        Num n → *n 2\n        Op s → 0\n        _ → ~ mask\n    }\n    ~ mask\n    ( nurl_print `[2] mask=` )\n    ( nurl_print ( nurl_str_int mask ) )\n    ( nurl_print ` result-after-match=` )\n    ( nurl_print ( nurl_str_int result ) )\n    ( nurl_print `\\n` )\n\n    // 3. Ketjutettu field access & mutaatio\n    // Luodaan tila, jossa on slice enum-arvoja\n    : State st @ State { [Token | @ Token { Num 1 } @ Token { Op `+` }] 0 }\n\n    // Haetaan indeksi erilliseen muuttujaan (katso huomio 2 alempaa)\n    : i current_pos . st pos\n\n    // Kirjoitetaan arvo structin sisällä olevaan sliceen.\n    // Jäsennys: set_stmt(=) -> member_expr(.) -> member_expr(.) -> expr(@)\n    // Toisin sanoen: st.tokens[current_pos] = Token::Num(99)\n    = . . st tokens current_pos @ Token { Num 99 }\n    ( nurl_print `[3] st.pos=` )\n    ( nurl_print ( nurl_str_int current_pos ) )\n    ( nurl_print ` st.tokens.length=` )\n    ( nurl_print ( nurl_str_int . . st tokens length ) )\n    ( nurl_print `\\n` )\n\n    // 4. Try-operaattori (\\) epätavallisessa paikassa: loopin alustuksessa.\n    // Purkaa 7:n suoraan loop_cnt-muuttujaan.\n    : ?i opt_num @ ?i { T 7 }\n    : ~ i loop_cnt \\ opt_num\n    ( nurl_print `[4] loop_cnt start=` )\n    ( nurl_print ( nurl_str_int loop_cnt ) )\n    ( nurl_print `\\n` )\n\n    ~ > loop_cnt 0 {\n        = loop_cnt - loop_cnt 1\n        // Nostetaan tulosta, jotta sitä käytetään\n        = result + result loop_cnt\n    }\n\n    ( nurl_print `[final] result=` )\n    ( nurl_print ( nurl_str_int result ) )\n    ( nurl_print `\\n` )\n    ^ result\n}\n","bytes":3121}