multilingualprogramming 0.2.0__tar.gz → 0.4.0__tar.gz

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.
Files changed (74) hide show
  1. {multilingualprogramming-0.2.0/multilingualprogramming.egg-info → multilingualprogramming-0.4.0}/PKG-INFO +68 -5
  2. multilingualprogramming-0.2.0/PKG-INFO → multilingualprogramming-0.4.0/README.md +58 -31
  3. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/__init__.py +2 -0
  4. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/__main__.py +51 -2
  5. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/codegen/repl.py +43 -5
  6. multilingualprogramming-0.4.0/multilingualprogramming/codegen/wasm_generator.py +247 -0
  7. multilingualprogramming-0.4.0/multilingualprogramming/codegen/wat_generator.py +762 -0
  8. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/parser/parser.py +31 -2
  9. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/parser/error_messages.json +19 -0
  10. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/repl/commands.json +82 -0
  11. multilingualprogramming-0.4.0/multilingualprogramming/runtime/backend_selector.py +335 -0
  12. multilingualprogramming-0.4.0/multilingualprogramming/runtime/python_fallbacks.py +476 -0
  13. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/version.py +1 -1
  14. multilingualprogramming-0.4.0/multilingualprogramming/wasm/loader.py +262 -0
  15. multilingualprogramming-0.2.0/README.md → multilingualprogramming-0.4.0/multilingualprogramming.egg-info/PKG-INFO +94 -2
  16. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming.egg-info/SOURCES.txt +5 -0
  17. multilingualprogramming-0.4.0/multilingualprogramming.egg-info/requires.txt +14 -0
  18. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/pyproject.toml +31 -2
  19. multilingualprogramming-0.2.0/multilingualprogramming.egg-info/requires.txt +0 -7
  20. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/LICENSE +0 -0
  21. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/codegen/__init__.py +0 -0
  22. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/codegen/executor.py +0 -0
  23. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/codegen/python_generator.py +0 -0
  24. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/codegen/runtime_builtins.py +0 -0
  25. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/core/__init__.py +0 -0
  26. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/core/ir.py +0 -0
  27. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/core/lowering.py +0 -0
  28. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/datetime/__init__.py +0 -0
  29. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/datetime/date_parser.py +0 -0
  30. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/datetime/mp_date.py +0 -0
  31. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/datetime/mp_datetime.py +0 -0
  32. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/datetime/mp_time.py +0 -0
  33. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/datetime/resource_loader.py +0 -0
  34. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/exceptions.py +0 -0
  35. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/imports.py +0 -0
  36. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/keyword/__init__.py +0 -0
  37. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/keyword/keyword_registry.py +0 -0
  38. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/keyword/keyword_validator.py +0 -0
  39. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/keyword/language_pack_validator.py +0 -0
  40. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/lexer/__init__.py +0 -0
  41. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/lexer/lexer.py +0 -0
  42. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/lexer/source_reader.py +0 -0
  43. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/lexer/token.py +0 -0
  44. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/lexer/token_types.py +0 -0
  45. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/numeral/__init__.py +0 -0
  46. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/numeral/abstract_numeral.py +0 -0
  47. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/numeral/complex_numeral.py +0 -0
  48. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/numeral/fraction_numeral.py +0 -0
  49. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/numeral/mp_numeral.py +0 -0
  50. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/numeral/numeral_converter.py +0 -0
  51. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/numeral/roman_numeral.py +0 -0
  52. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/numeral/unicode_numeral.py +0 -0
  53. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/parser/__init__.py +0 -0
  54. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/parser/ast_nodes.py +0 -0
  55. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/parser/ast_printer.py +0 -0
  56. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/parser/error_messages.py +0 -0
  57. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/parser/semantic_analyzer.py +0 -0
  58. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/parser/surface_normalizer.py +0 -0
  59. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/datetime/eras.json +0 -0
  60. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/datetime/formats.json +0 -0
  61. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/datetime/months.json +0 -0
  62. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/datetime/weekdays.json +0 -0
  63. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/usm/builtins_aliases.json +0 -0
  64. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/usm/keywords.json +0 -0
  65. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/usm/operators.json +0 -0
  66. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/usm/schema.json +0 -0
  67. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/resources/usm/surface_patterns.json +0 -0
  68. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming/unicode_string.py +0 -0
  69. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming.egg-info/dependency_links.txt +0 -0
  70. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming.egg-info/entry_points.txt +0 -0
  71. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/multilingualprogramming.egg-info/top_level.txt +0 -0
  72. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/setup.cfg +0 -0
  73. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/setup.py +0 -0
  74. {multilingualprogramming-0.2.0 → multilingualprogramming-0.4.0}/tests/tests.py +0 -0
@@ -1,21 +1,23 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multilingualprogramming
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: Python application for multilingual programming
5
5
  Author-email: John Samuel <johnsamuelwrites@example.com>
6
6
  License: GPL-3.0-or-later
7
7
  Project-URL: Homepage, https://github.com/johnsamuelwrites/multilingual
8
- Project-URL: Documentation, https://johnsamuelwrites.github.io/multilingual/
8
+ Project-URL: Documentation, https://johnsamuel.info/multilingual/
9
9
  Project-URL: Repository, https://github.com/johnsamuelwrites/multilingual
10
10
  Project-URL: Issues, https://github.com/johnsamuelwrites/multilingual/issues
11
11
  Project-URL: Changelog, https://github.com/johnsamuelwrites/multilingual/blob/main/CHANGELOG.md
12
12
  Keywords: programming-language,multilingual,compiler,transpiler,education
13
- Classifier: Programming Language :: Python :: 3
14
13
  Classifier: Programming Language :: Python :: 3.12
15
14
  Classifier: Programming Language :: Python :: 3.13
16
15
  Classifier: Programming Language :: Python :: 3.14
17
16
  Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
18
17
  Classifier: Operating System :: OS Independent
18
+ Classifier: Topic :: Software Development :: Compilers
19
+ Classifier: Topic :: Software Development :: Interpreters
20
+ Classifier: Development Status :: 4 - Beta
19
21
  Requires-Python: >=3.12
20
22
  Description-Content-Type: text/markdown
21
23
  License-File: LICENSE
@@ -25,6 +27,11 @@ Provides-Extra: dev
25
27
  Requires-Dist: pytest; extra == "dev"
26
28
  Requires-Dist: pytest-cov; extra == "dev"
27
29
  Requires-Dist: pylint; extra == "dev"
30
+ Provides-Extra: wasm
31
+ Requires-Dist: wasmtime>=1.0.0; extra == "wasm"
32
+ Provides-Extra: performance
33
+ Requires-Dist: wasmtime>=1.0.0; extra == "performance"
34
+ Requires-Dist: numpy>=1.20.0; extra == "performance"
28
35
  Dynamic: license-file
29
36
 
30
37
  # multilingual
@@ -89,11 +96,47 @@ Details:
89
96
  Source files for this language use the `.ml` extension (for example: `hello.ml`).
90
97
  Requires Python 3.12 or newer.
91
98
 
99
+ ### Try The Playground (No Install Required)
100
+
101
+ You can try `multilingual` directly in your browser:
102
+
103
+ - Playground: https://johnsamuel.info/multilingual/playground.html
104
+
105
+ The playground lets you:
106
+
107
+ - Write code in supported human languages
108
+ - Run full execution in Pyodide
109
+ - Inspect generated Python
110
+ - Inspect generated WAT/WASM output
111
+ - Inspect generated Rust bridge code (Wasmtime workflow)
112
+
113
+ If you are evaluating the project, please test the playground with your language and open an issue with feedback:
114
+
115
+ - Issues: https://github.com/johnsamuelwrites/multilingual/issues
116
+
92
117
  ### 1. Install
93
118
 
119
+ PyPI package: https://pypi.org/project/multilingualprogramming/
120
+
121
+ Option 1 (recommended): install in a virtual environment.
122
+
123
+ ```bash
124
+ python3 -m venv .venv
125
+ source .venv/bin/activate
126
+ python -m pip install --upgrade pip
127
+ python -m pip install multilingualprogramming
128
+ ```
129
+
130
+ Option 2: install with `pipx` (isolated CLI install).
131
+
132
+ ```bash
133
+ pipx install multilingualprogramming
134
+ ```
135
+
136
+ For local development from source, use:
137
+
94
138
  ```bash
95
139
  pip install -r requirements.txt
96
- # or
97
140
  pip install .
98
141
  ```
99
142
 
@@ -119,7 +162,10 @@ imprimir("Hola mundo")
119
162
  Start REPL:
120
163
 
121
164
  ```bash
122
- # 1) Default mode (English keywords)
165
+ # 0) Direct interactive mode (like `python`)
166
+ multilingual
167
+
168
+ # 1) Explicit REPL command (same behavior as above)
123
169
  multilingual repl
124
170
 
125
171
  # 2) French mode
@@ -127,9 +173,16 @@ multilingual repl --lang fr
127
173
 
128
174
  # Optional: show generated Python while executing
129
175
  multilingual repl --show-python
176
+
177
+ # Optional: show generated WAT (WebAssembly Text) code while executing
178
+ multilingual repl --show-wat
179
+
180
+ # Optional: show generated Rust/Wasmtime bridge code while executing
181
+ multilingual repl --show-rust
130
182
  ```
131
183
 
132
184
  Inside the REPL, type code and press Enter to execute.
185
+ Both `multilingual` and `multilingual repl` start the same REPL.
133
186
 
134
187
  Default mode example (English):
135
188
 
@@ -170,6 +223,8 @@ REPL commands:
170
223
  - `:help` show commands
171
224
  - `:language <code>` switch language
172
225
  - `:python` toggle generated Python display
226
+ - `:wat` toggle generated WAT (WebAssembly Text) display
227
+ - `:rust` toggle generated Rust/Wasmtime bridge code display
173
228
  - `:reset` clear session state
174
229
  - `:kw [XX]` show language keywords
175
230
  - `:ops [XX]` show operators and symbols
@@ -191,6 +246,12 @@ print("Hello world")
191
246
 
192
247
  Run it:
193
248
 
249
+ ```bash
250
+ multilingual hello.ml
251
+ ```
252
+
253
+ Equivalent explicit form:
254
+
194
255
  ```bash
195
256
  multilingual run hello.ml
196
257
  ```
@@ -198,6 +259,7 @@ multilingual run hello.ml
198
259
  Optional (force language instead of auto-detect):
199
260
 
200
261
  ```bash
262
+ multilingual hello.ml --lang fr
201
263
  multilingual run hello.ml --lang fr
202
264
  ```
203
265
 
@@ -316,6 +378,7 @@ afficher("a + b =", a + b)
316
378
 
317
379
  Use this README for setup and workflow; use `docs/` for design rationale and policy details.
318
380
 
381
+ - Browser playground (interactive): https://johnsamuel.info/multilingual/playground.html
319
382
  - Usage guide: [USAGE.md](USAGE.md)
320
383
  - Examples guide: [examples/README.md](examples/README.md)
321
384
  - Detailed reference: [docs/reference.md](docs/reference.md)
@@ -1,32 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: multilingualprogramming
3
- Version: 0.2.0
4
- Summary: Python application for multilingual programming
5
- Author-email: John Samuel <johnsamuelwrites@example.com>
6
- License: GPL-3.0-or-later
7
- Project-URL: Homepage, https://github.com/johnsamuelwrites/multilingual
8
- Project-URL: Documentation, https://johnsamuelwrites.github.io/multilingual/
9
- Project-URL: Repository, https://github.com/johnsamuelwrites/multilingual
10
- Project-URL: Issues, https://github.com/johnsamuelwrites/multilingual/issues
11
- Project-URL: Changelog, https://github.com/johnsamuelwrites/multilingual/blob/main/CHANGELOG.md
12
- Keywords: programming-language,multilingual,compiler,transpiler,education
13
- Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.12
15
- Classifier: Programming Language :: Python :: 3.13
16
- Classifier: Programming Language :: Python :: 3.14
17
- Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
18
- Classifier: Operating System :: OS Independent
19
- Requires-Python: >=3.12
20
- Description-Content-Type: text/markdown
21
- License-File: LICENSE
22
- Requires-Dist: roman>=3.3
23
- Requires-Dist: python-dateutil>=2.8
24
- Provides-Extra: dev
25
- Requires-Dist: pytest; extra == "dev"
26
- Requires-Dist: pytest-cov; extra == "dev"
27
- Requires-Dist: pylint; extra == "dev"
28
- Dynamic: license-file
29
-
30
1
  # multilingual
31
2
  Not yet another programming language. A multilingual one.
32
3
 
@@ -89,11 +60,47 @@ Details:
89
60
  Source files for this language use the `.ml` extension (for example: `hello.ml`).
90
61
  Requires Python 3.12 or newer.
91
62
 
63
+ ### Try The Playground (No Install Required)
64
+
65
+ You can try `multilingual` directly in your browser:
66
+
67
+ - Playground: https://johnsamuel.info/multilingual/playground.html
68
+
69
+ The playground lets you:
70
+
71
+ - Write code in supported human languages
72
+ - Run full execution in Pyodide
73
+ - Inspect generated Python
74
+ - Inspect generated WAT/WASM output
75
+ - Inspect generated Rust bridge code (Wasmtime workflow)
76
+
77
+ If you are evaluating the project, please test the playground with your language and open an issue with feedback:
78
+
79
+ - Issues: https://github.com/johnsamuelwrites/multilingual/issues
80
+
92
81
  ### 1. Install
93
82
 
83
+ PyPI package: https://pypi.org/project/multilingualprogramming/
84
+
85
+ Option 1 (recommended): install in a virtual environment.
86
+
87
+ ```bash
88
+ python3 -m venv .venv
89
+ source .venv/bin/activate
90
+ python -m pip install --upgrade pip
91
+ python -m pip install multilingualprogramming
92
+ ```
93
+
94
+ Option 2: install with `pipx` (isolated CLI install).
95
+
96
+ ```bash
97
+ pipx install multilingualprogramming
98
+ ```
99
+
100
+ For local development from source, use:
101
+
94
102
  ```bash
95
103
  pip install -r requirements.txt
96
- # or
97
104
  pip install .
98
105
  ```
99
106
 
@@ -119,7 +126,10 @@ imprimir("Hola mundo")
119
126
  Start REPL:
120
127
 
121
128
  ```bash
122
- # 1) Default mode (English keywords)
129
+ # 0) Direct interactive mode (like `python`)
130
+ multilingual
131
+
132
+ # 1) Explicit REPL command (same behavior as above)
123
133
  multilingual repl
124
134
 
125
135
  # 2) French mode
@@ -127,9 +137,16 @@ multilingual repl --lang fr
127
137
 
128
138
  # Optional: show generated Python while executing
129
139
  multilingual repl --show-python
140
+
141
+ # Optional: show generated WAT (WebAssembly Text) code while executing
142
+ multilingual repl --show-wat
143
+
144
+ # Optional: show generated Rust/Wasmtime bridge code while executing
145
+ multilingual repl --show-rust
130
146
  ```
131
147
 
132
148
  Inside the REPL, type code and press Enter to execute.
149
+ Both `multilingual` and `multilingual repl` start the same REPL.
133
150
 
134
151
  Default mode example (English):
135
152
 
@@ -170,6 +187,8 @@ REPL commands:
170
187
  - `:help` show commands
171
188
  - `:language <code>` switch language
172
189
  - `:python` toggle generated Python display
190
+ - `:wat` toggle generated WAT (WebAssembly Text) display
191
+ - `:rust` toggle generated Rust/Wasmtime bridge code display
173
192
  - `:reset` clear session state
174
193
  - `:kw [XX]` show language keywords
175
194
  - `:ops [XX]` show operators and symbols
@@ -191,6 +210,12 @@ print("Hello world")
191
210
 
192
211
  Run it:
193
212
 
213
+ ```bash
214
+ multilingual hello.ml
215
+ ```
216
+
217
+ Equivalent explicit form:
218
+
194
219
  ```bash
195
220
  multilingual run hello.ml
196
221
  ```
@@ -198,6 +223,7 @@ multilingual run hello.ml
198
223
  Optional (force language instead of auto-detect):
199
224
 
200
225
  ```bash
226
+ multilingual hello.ml --lang fr
201
227
  multilingual run hello.ml --lang fr
202
228
  ```
203
229
 
@@ -316,6 +342,7 @@ afficher("a + b =", a + b)
316
342
 
317
343
  Use this README for setup and workflow; use `docs/` for design rationale and policy details.
318
344
 
345
+ - Browser playground (interactive): https://johnsamuel.info/multilingual/playground.html
319
346
  - Usage guide: [USAGE.md](USAGE.md)
320
347
  - Examples guide: [examples/README.md](examples/README.md)
321
348
  - Detailed reference: [docs/reference.md](docs/reference.md)
@@ -30,6 +30,7 @@ from multilingualprogramming.parser.semantic_analyzer import (
30
30
  )
31
31
  from multilingualprogramming.parser.error_messages import ErrorMessageRegistry
32
32
  from multilingualprogramming.codegen.python_generator import PythonCodeGenerator
33
+ from multilingualprogramming.codegen.wat_generator import WATCodeGenerator
33
34
  from multilingualprogramming.codegen.runtime_builtins import RuntimeBuiltins
34
35
  from multilingualprogramming.codegen.executor import ProgramExecutor, ExecutionResult
35
36
  from multilingualprogramming.codegen.repl import REPL
@@ -63,6 +64,7 @@ __all__ = [
63
64
  "SemanticAnalyzer",
64
65
  "ErrorMessageRegistry",
65
66
  "PythonCodeGenerator",
67
+ "WATCodeGenerator",
66
68
  "RuntimeBuiltins",
67
69
  "ProgramExecutor",
68
70
  "ExecutionResult",
@@ -9,6 +9,7 @@ CLI entry point for the multilingual programming language.
9
9
 
10
10
  Usage:
11
11
  python -m multilingualprogramming # Start REPL
12
+ python -m multilingualprogramming <file>.ml # Execute a source file
12
13
  python -m multilingualprogramming run <file> # Execute a file
13
14
  python -m multilingualprogramming repl [--lang XX] # Start REPL
14
15
  python -m multilingualprogramming compile <file> # Show generated Python
@@ -58,7 +59,12 @@ def cmd_run(args):
58
59
 
59
60
  def cmd_repl(args):
60
61
  """Start the interactive REPL."""
61
- repl = REPL(language=args.lang, show_python=args.show_python)
62
+ repl = REPL(
63
+ language=args.lang,
64
+ show_python=args.show_python,
65
+ show_wat=args.show_wat,
66
+ show_rust=args.show_rust,
67
+ )
62
68
  repl.run()
63
69
 
64
70
 
@@ -118,11 +124,44 @@ def cmd_smoke(args):
118
124
  sys.exit(1)
119
125
 
120
126
 
127
+ def _maybe_dispatch_direct_file_run(argv):
128
+ """Dispatch `multilingual <file>.ml [--lang XX]` to `cmd_run`."""
129
+ if not argv:
130
+ return False
131
+
132
+ first = argv[0]
133
+ if first.startswith("-"):
134
+ return False
135
+ if not first.lower().endswith(".ml"):
136
+ return False
137
+
138
+ parser = argparse.ArgumentParser(
139
+ prog="multilingual",
140
+ description="Execute a multilingual source file",
141
+ )
142
+ parser.add_argument("file", help="Path to the source file")
143
+ parser.add_argument(
144
+ "--lang", default=None,
145
+ help="Source language code (e.g., en, fr, hi). Auto-detect if omitted.",
146
+ )
147
+ args = parser.parse_args(argv)
148
+ cmd_run(args)
149
+ return True
150
+
151
+
121
152
  def main():
122
153
  """Run the CLI entry point and dispatch subcommands."""
154
+ argv = sys.argv[1:]
155
+ if _maybe_dispatch_direct_file_run(argv):
156
+ return
157
+
123
158
  parser = argparse.ArgumentParser(
124
159
  prog="multilingual",
125
- description="Multilingual Programming Language CLI",
160
+ description=(
161
+ "Multilingual Programming Language CLI "
162
+ "(default command starts interactive REPL; "
163
+ "pass <file>.ml to run directly)"
164
+ ),
126
165
  )
127
166
  parser.add_argument(
128
167
  "--version", action="version",
@@ -149,6 +188,14 @@ def main():
149
188
  "--show-python", action="store_true",
150
189
  help="Display generated Python code before execution",
151
190
  )
191
+ repl_parser.add_argument(
192
+ "--show-wat", action="store_true",
193
+ help="Display generated WAT (WebAssembly Text) code before execution",
194
+ )
195
+ repl_parser.add_argument(
196
+ "--show-rust", action="store_true",
197
+ help="Display generated Rust/Wasmtime bridge code before execution",
198
+ )
152
199
 
153
200
  # compile subcommand
154
201
  compile_parser = subparsers.add_parser(
@@ -187,6 +234,8 @@ def main():
187
234
  # Default: start REPL
188
235
  args.lang = None
189
236
  args.show_python = False
237
+ args.show_wat = False
238
+ args.show_rust = False
190
239
  cmd_repl(args)
191
240
 
192
241
 
@@ -46,7 +46,8 @@ class REPL:
46
46
  _COMMAND_CATALOG = None
47
47
  _OPERATOR_CATALOG = None
48
48
 
49
- def __init__(self, language=None, show_python=False):
49
+ def __init__(self, language=None, show_python=False, show_wat=False,
50
+ show_rust=False):
50
51
  """
51
52
  Initialize the REPL.
52
53
 
@@ -54,9 +55,13 @@ class REPL:
54
55
  language: Source language code (e.g., "en", "fr").
55
56
  If None, auto-detect from input.
56
57
  show_python: If True, display generated Python before execution.
58
+ show_wat: If True, display generated WAT code before execution.
59
+ show_rust: If True, display generated Rust/Wasmtime code before execution.
57
60
  """
58
61
  self.language = language
59
62
  self.show_python = show_python
63
+ self.show_wat = show_wat
64
+ self.show_rust = show_rust
60
65
  self._globals = {}
61
66
  self._init_globals()
62
67
 
@@ -258,12 +263,34 @@ class REPL:
258
263
  generator = PythonCodeGenerator()
259
264
  python_source = generator.generate(program)
260
265
 
266
+ prefix = ""
267
+
268
+ if self.show_wat:
269
+ try:
270
+ # pylint: disable-next=import-outside-toplevel
271
+ from multilingualprogramming.codegen.wat_generator import (
272
+ WATCodeGenerator,
273
+ )
274
+ wat_source = WATCodeGenerator().generate(program)
275
+ prefix += f"[WAT]\n{wat_source.strip()}\n"
276
+ except Exception as wat_exc:
277
+ prefix += f"[WAT error] {wat_exc}\n"
278
+
279
+ if self.show_rust:
280
+ try:
281
+ # pylint: disable-next=import-outside-toplevel
282
+ from multilingualprogramming.codegen.wasm_generator import (
283
+ WasmCodeGenerator,
284
+ )
285
+ rust_source = WasmCodeGenerator().generate(program)
286
+ prefix += f"[Rust/Wasmtime]\n{rust_source.strip()}\n"
287
+ except Exception as rust_exc:
288
+ prefix += f"[Rust/Wasmtime error] {rust_exc}\n"
289
+
261
290
  if self.show_python:
262
- return f"[Python] {python_source.strip()}\n" + self._exec(
263
- python_source
264
- )
291
+ prefix += f"[Python] {python_source.strip()}\n"
265
292
 
266
- return self._exec(python_source)
293
+ return prefix + self._exec(python_source)
267
294
 
268
295
  except Exception as exc:
269
296
  return f"Error: {exc}\n"
@@ -399,6 +426,16 @@ class REPL:
399
426
  state = "on" if self.show_python else "off"
400
427
  print(f"Show Python: {state}")
401
428
  return True
429
+ if cmd == "wat":
430
+ self.show_wat = not self.show_wat
431
+ state = "on" if self.show_wat else "off"
432
+ print(f"Show WAT: {state}")
433
+ return True
434
+ if cmd == "rust":
435
+ self.show_rust = not self.show_rust
436
+ state = "on" if self.show_rust else "off"
437
+ print(f"Show Rust/Wasmtime: {state}")
438
+ return True
402
439
  if cmd == "reset":
403
440
  self._globals.clear()
404
441
  self._init_globals()
@@ -428,6 +465,7 @@ class REPL:
428
465
  print(f"Multilingual Programming REPL v{__version__} "
429
466
  f"[language={lang_label}]")
430
467
  print(
468
+ "Start with 'multilingual' (default) or 'multilingual repl'.\n"
431
469
  f"Type ':help' for commands. Use ':quit' (or Ctrl+C) to exit. "
432
470
  f"EOF key is terminal-dependent ({eof_hint}).\n"
433
471
  )