rip-lang 3.7.3 → 3.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/parser.js CHANGED
@@ -251,11 +251,12 @@ const parserInstance = {
251
251
  [TERROR, EOF] = [2, 1];
252
252
  lexer = Object.create(this.lexer);
253
253
  sharedState = { ctx: {} };
254
- for (const k in this.ctx)
255
- if (Object.hasOwn(this.ctx, k)) {
256
- const v = this.ctx[k];
257
- sharedState.ctx[k] = v;
258
- }
254
+ for (const k in this.ctx) {
255
+ if (!Object.hasOwn(this.ctx, k))
256
+ continue;
257
+ const v = this.ctx[k];
258
+ sharedState.ctx[k] = v;
259
+ }
259
260
  lexer.setInput(input, sharedState.ctx);
260
261
  [sharedState.ctx.lexer, sharedState.ctx.parser] = [lexer, this];
261
262
  if (lexer.loc == null)
package/src/repl.js CHANGED
@@ -370,11 +370,30 @@ export class RipREPL {
370
370
  // Extract last expression for result capture
371
371
  const lines = js.trim().split('\n');
372
372
  let lastLine = lines[lines.length - 1];
373
-
374
- if (lastLine && !lastLine.startsWith('import ') && !lastLine.startsWith('export ') &&
375
- !lastLine.startsWith('let ') && !lastLine.startsWith('const ')) {
376
- if (lastLine.endsWith(';')) lastLine = lastLine.slice(0, -1);
377
- lines[lines.length - 1] = '__result = ' + lastLine + ';';
373
+ const STMT_RE = /^\s*(import |export |let |const |var |for |while |if |else |switch |try |class |function )/;
374
+
375
+ if (lastLine && !STMT_RE.test(lastLine)) {
376
+ // If the last line is a continuation of a multi-line expression
377
+ // (e.g., })(); from a comprehension IIFE), scan backwards to find
378
+ // where the expression actually starts by tracking delimiter depth
379
+ if (/^\s*[}\)]/.test(lastLine)) {
380
+ let depth = 0;
381
+ for (let i = lines.length - 1; i >= 0; i--) {
382
+ for (const ch of lines[i]) {
383
+ if (ch === '(' || ch === '{' || ch === '[') depth--;
384
+ if (ch === ')' || ch === '}' || ch === ']') depth++;
385
+ }
386
+ if (depth <= 0 && !STMT_RE.test(lines[i])) {
387
+ if (lines[lines.length - 1].endsWith(';'))
388
+ lines[lines.length - 1] = lines[lines.length - 1].slice(0, -1);
389
+ lines[i] = '__result = ' + lines[i];
390
+ break;
391
+ }
392
+ }
393
+ } else {
394
+ if (lastLine.endsWith(';')) lastLine = lastLine.slice(0, -1);
395
+ lines[lines.length - 1] = '__result = ' + lastLine + ';';
396
+ }
378
397
  }
379
398
 
380
399
  // Build module code
package/docs/NOTES.md DELETED
@@ -1,93 +0,0 @@
1
- <img src="https://raw.githubusercontent.com/shreeve/rip-lang/main/docs/rip.png" style="width:50px" /> <br>
2
-
3
- # Rip — Notes
4
-
5
- Ideas, future plans, and design thoughts for Rip.
6
-
7
- ---
8
-
9
- ## Standard Library (`stdlib`)
10
-
11
- Rip is a zero-dependency language, but a small standard library of useful
12
- utilities would save users from writing the same one-liners in every project.
13
- These are **not** language features — they're plain functions that could ship
14
- as a prelude or optional import.
15
-
16
- ### Candidates
17
-
18
- ```coffee
19
- # Printing (Ruby's p)
20
- p = console.log
21
-
22
- # Exit with optional code (uses implicit `it`)
23
- exit = -> process.exit(it)
24
-
25
- # Tap — call a function for side effects, return the original value
26
- # Useful in pipe chains: data |> tap(console.log) |> process
27
- tap = (v, fn) -> fn(v); v
28
-
29
- # Identity — returns its argument unchanged
30
- # Useful as a default callback: items.filter(id)
31
- id = -> it
32
-
33
- # No-op — does nothing
34
- # Useful as a default handler: onClick ?= noop
35
- noop = ->
36
-
37
- # String method aliases (shorter names for common checks)
38
- String::starts = String::startsWith
39
- String::ends = String::endsWith
40
- String::has = String::includes
41
-
42
- # Clamp a value to a range
43
- clamp = (v, lo, hi) -> Math.min(Math.max(v, lo), hi)
44
-
45
- # Sleep for N milliseconds (returns a Promise)
46
- sleep = (ms) -> new Promise (resolve) -> setTimeout resolve, ms
47
-
48
- # Times helper — call a function N times, collect results
49
- times = (n, fn) -> (fn(i) for i in [0...n])
50
- ```
51
-
52
- ### Design Questions
53
-
54
- - **Prelude vs import?** Should these be injected automatically (like Go's
55
- `fmt` or Rip's reactive runtime), or explicitly imported (`import { p, tap }
56
- from '@rip-lang/std'`)? Leaning toward explicit — Rip's philosophy is zero
57
- magic in the output.
58
-
59
- - **Scope?** Keep it tiny. A stdlib that grows to 500 functions defeats the
60
- purpose. Each entry should save real keystrokes on something people do
61
- constantly.
62
-
63
- - **Node vs Browser?** Some helpers (like `exit`) are Node-only. Others (like
64
- `p`, `tap`, `sleep`) work everywhere. May want to split into `std` (universal)
65
- and `std/node` (server-only).
66
-
67
- ---
68
-
69
- ## Future Syntax Ideas
70
-
71
- Ideas that have been discussed but not yet implemented. Each would need
72
- design discussion before building.
73
-
74
- - **`defer`** — Go-style cleanup that runs when the function exits. Compiles
75
- to try/finally. `defer file.close()`.
76
-
77
- - **`is a` / `isnt a`** — Readable instanceof. `x is a String` →
78
- `x instanceof String`.
79
-
80
- - **`.starts?` / `.ends?` / `.has?`** — Ruby-style question-mark methods.
81
- `url.starts? "https"` → `url.startsWith("https")`.
82
-
83
- - **Pattern matching** — `match value` with destructuring arms. Big feature,
84
- needs careful design.
85
-
86
- - **Reactive resource operator (`~>?`)** — Language-level `createResource`.
87
- `user ~>? fetch!("/api/users/#{id}").json!` gives `user.loading`,
88
- `user.error`, `user.data`. Park until real-world usage shows demand.
89
-
90
- - **Pipe operator (`|>`) — Hack-style placeholder** — Currently Rip uses
91
- Elixir-style first-arg insertion. A `%` placeholder for arbitrary position
92
- (`data |> fn(1, %, 3)`) could be added later if needed. Current design
93
- covers 95%+ of cases.