so-arrow-operator-meme
The complete solution is in ~/main.go (767 lines, Go 1.26). It demonstrates the "arrow operator" meme in three parts:
Part 1 — The Meme: while(x-->0) is NOT while(x --> 0) with a special --> operator. It parses as while((x--) > 0) — postfix decrement x-- binds tighter than >, and no whitespace is needed between -- and >. The program shows:
- Go's AST parser errors on x-- > 0 because Go treats -- as a statement, not an expression (a difference from C)
- A live simulation of C's post-decrement loop behavior: x=5; while(x-->0) runs 5 iterations, ends with x=-1 because the post-decrement fires even on the final failed comparison
Part 2 — All Precedence Edge Cases: A table of 15 precedence traps in Go/C, with deep dives on the most surprising:
| # | Expression | Problem |
|---|-----------|---------|
| 1 | x-->0 | Not arrow, it's (x--)>0 |
| 2 | *p++ | *(p++), not (*p)++ |
| 3 | *p.f | *(p.f), not (*p).f |
| 4 | 1<<2+3 | Go: (1<<2)+3=7 vs C: 1<<(2+3)=32 ← precedence flips! |
| 5 | x&y==0 | Go: (x&y)==0 vs C: x&(y==0) ← precedence flips! |
| 6 | a&&b\|\|c&&d | (a&&b) \|\| (c&&d) |
| 7 | a\|\|b&&c | a \|\| (b&&c) |
| 8-15 | See code | Pointer, shift, bitwise, channel, type assertion cases |
Part 3 — Toy Lexer: A handwritten lexer that tokenizes expressions and emits warnings for ambiguous token sequences. It catches:
- --> → warns '--' followed by '>' looks like '-->' (arrow operator meme)
- *p++ → warns '*p++' parses as '*(p++)' not '(*p)++'
- 1<<2+3 → warns about Go vs C precedence difference
- x&y==0 → warns about Go vs C precedence difference
The code also uses Go's go/parser and go/ast packages to verify actual parse trees.
``` $ go run main.go ✓ Part 1: x-->0 correctly identified as (x--)>0 - Go AST confirms: "x-- > 0" cannot be an expression in Go (statement-only) - C simulation: x=5, body ran 5 times, final x=-1 (post-decrement on exit) ✓ Part 2: 15 precedence edge cases documented with live examples - Go: 1<<(2+3) = 32 vs (1<<2)+3 = 7 — verified numerically - Go: (x&y)==0 vs x&(y==0) — verified with x=3,y=1 → false vs 0 - All verified against go/parser AST output ✓ Part 3: Toy lexer tested on 7 ambiguous expressions - "x-->0" → 2 warnings about arrow illusion - "*p++" → 1 warning about pointer/increment precedence - "1<<2+3" → 1 warning about shift/add precedence - "x&y==0" → 1 warning about bitwise/compare precedence - "a||b&&c" → no warning (standard precedence, no ambiguity) - "x-- > 0" → 2 warnings about arrow illusion - "*p.f" → no warning (unambiguous, but documented in table) ``` **Edge cases tested:** - `x-->0` (no spaces) — correctly emits arrow meme warning - `x-- > 0` (with space) — still warns about the visual illusion - `1<<2+3` — correctly notes **different precedence** between Go (`(1<<2)+3=7`) and C (`1<<(2+3)=32`) - `x&y==0` — correctly notes **different precedence** between Go (`(x&y)==0`) and C (`x&(y==0)`) - Go's `--` not being an expression (vs C) — caught by AST parser error - Post-decrement in loop exit — C decrements to -1, Go for-loop leaves x=0
{"model": "claude-sonnet-4-20250514", "problem_class": "so-arrow-operator-meme", "result": "passed", "tests": 3}The complete solution is in ~/main.go (767 lines, Go 1.26). It demonstrates the "arrow operator" meme in three parts:
Part 1 — The Meme: while(x-->0) is NOT while(x --> 0) with a special --> operator. It parses as while((x--) > 0) — postfix decrement x-- binds tighter than >, and no whitespace is needed between -- and >. The program shows:
- Go's AST parser errors on x-- > 0 because Go treats -- as a statement, not an expression (a difference from C)
- A live simulation of C's post-decrement loop behavior: x=5; while(x-->0) runs 5 iterations, ends with x=-1 because the post-decrement fires even on the final failed comparison
Part 2 — All Precedence Edge Cases: A table of 15 precedence traps in Go/C, with deep dives on the most surprising:
| # | Expression | Problem |
|---|-----------|---------|
| 1 | x-->0 | Not arrow, it's (x--)>0 |
| 2 | *p++ | *(p++), not (*p)++ |
| 3 | *p.f | *(p.f), not (*p).f |
| 4 | 1<<2+3 | Go: (1<<2)+3=7 vs C: 1<<(2+3)=32 ← precedence flips! |
| 5 | x&y==0 | Go: (x&y)==0 vs C: x&(y==0) ← precedence flips! |
| 6 | a&&b\|\|c&&d | (a&&b) \|\| (c&&d) |
| 7 | a\|\|b&&c | a \|\| (b&&c) |
| 8-15 | See code | Pointer, shift, bitwise, channel, type assertion cases |
Part 3 — Toy Lexer: A handwritten lexer that tokenizes expressions and emits warnings for ambiguous token sequences. It catches:
- --> → warns '--' followed by '>' looks like '-->' (arrow operator meme)
- *p++ → warns '*p++' parses as '*(p++)' not '(*p)++'
- 1<<2+3 → warns about Go vs C precedence difference
- x&y==0 → warns about Go vs C precedence difference
The code also uses Go's go/parser and go/ast packages to verify actual parse trees.
``` $ go run main.go ✓ Part 1: x-->0 correctly identified as (x--)>0 - Go AST confirms: "x-- > 0" cannot be an expression in Go (statement-only) - C simulation: x=5, body ran 5 times, final x=-1 (post-decrement on exit) ✓ Part 2: 15 precedence edge cases documented with live examples - Go: 1<<(2+3) = 32 vs (1<<2)+3 = 7 — verified numerically - Go: (x&y)==0 vs x&(y==0) — verified with x=3,y=1 → false vs 0 - All verified against go/parser AST output ✓ Part 3: Toy lexer tested on 7 ambiguous expressions - "x-->0" → 2 warnings about arrow illusion - "*p++" → 1 warning about pointer/increment precedence - "1<<2+3" → 1 warning about shift/add precedence - "x&y==0" → 1 warning about bitwise/compare precedence - "a||b&&c" → no warning (standard precedence, no ambiguity) - "x-- > 0" → 2 warnings about arrow illusion - "*p.f" → no warning (unambiguous, but documented in table) ``` **Edge cases tested:** - `x-->0` (no spaces) — correctly emits arrow meme warning - `x-- > 0` (with space) — still warns about the visual illusion - `1<<2+3` — correctly notes **different precedence** between Go (`(1<<2)+3=7`) and C (`1<<(2+3)=32`) - `x&y==0` — correctly notes **different precedence** between Go (`(x&y)==0`) and C (`x&(y==0)`) - Go's `--` not being an expression (vs C) — caught by AST parser error - Post-decrement in loop exit — C decrements to -1, Go for-loop leaves x=0
{"model": "claude-sonnet-4-20250514", "problem_class": "so-arrow-operator-meme", "result": "passed", "tests": 3}