freelang-editor 11.7.4

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 (1473) hide show
  1. package/.config/jest.config.js +47 -0
  2. package/.config/jest.fast.config.js +9 -0
  3. package/.config/openapi.yaml +457 -0
  4. package/.config/tsconfig.json +30 -0
  5. package/.github/CODE_OF_CONDUCT.md +176 -0
  6. package/.github/CONTRIBUTING.md +296 -0
  7. package/.github/DISCUSSIONS.md +179 -0
  8. package/.github/ISSUE_TEMPLATE/bug-report.md +44 -0
  9. package/.github/ISSUE_TEMPLATE/feature-request.md +39 -0
  10. package/.github/pull_request_template.md +87 -0
  11. package/.github/workflows/phase-3c-l2-proof.yml +101 -0
  12. package/.github/workflows/phase-c-full-slack.yml +409 -0
  13. package/.github/workflows/phase-c-full.yml +241 -0
  14. package/.github/workflows/phase-c-scan.yml +64 -0
  15. package/.gitmodules +3 -0
  16. package/.tmp.js +3 -0
  17. package/CHANGELOG.md +1182 -0
  18. package/CLAUDE.md +633 -0
  19. package/Dockerfile +3 -0
  20. package/LICENSE +21 -0
  21. package/MISTAKES-COVERAGE.json +115 -0
  22. package/Makefile +95 -0
  23. package/PHASE-F-ROADMAP.md +554 -0
  24. package/README.md +459 -0
  25. package/SELF_HOSTING_CHECKLIST.md +155 -0
  26. package/benchmark-freelang.fl +47 -0
  27. package/benchmark-results.json +37 -0
  28. package/benchmark-simple.fl +38 -0
  29. package/bin/freelang-migrate +310 -0
  30. package/bin/freelang-smart +258 -0
  31. package/bootstrap.js +1134 -0
  32. package/docker-compose.yml +3 -0
  33. package/docs/AI_FRIENDLINESS.md +181 -0
  34. package/docs/AI_LEARNING_PATH.md +542 -0
  35. package/docs/AI_MAINTENANCE.md +153 -0
  36. package/docs/AI_QUICKSTART.md +380 -0
  37. package/docs/AI_REFERENCE.md +559 -0
  38. package/docs/AI_RELIABILITY_GUIDE.md +597 -0
  39. package/docs/AKL_ARCHITECTURE.md +228 -0
  40. package/docs/AKL_P0_KIMDB.md +215 -0
  41. package/docs/API.md +380 -0
  42. package/docs/ARCHITECTURE.md +208 -0
  43. package/docs/CHANGELOG.md +1014 -0
  44. package/docs/CLAUDE.md +991 -0
  45. package/docs/CLAUDE_AI.md +210 -0
  46. package/docs/CODEGEN_IMPROVEMENTS.md +158 -0
  47. package/docs/CODE_OF_CONDUCT.md +337 -0
  48. package/docs/CONTRIBUTING.md +437 -0
  49. package/docs/CRON_AUTOMATION.md +97 -0
  50. package/docs/DEPLOYMENT.md +357 -0
  51. package/docs/DETERMINISM_GUIDE.md +174 -0
  52. package/docs/HUMAN_GUIDE.md +599 -0
  53. package/docs/INDEX.md +199 -0
  54. package/docs/INLINE_TEST_GUIDE.md +231 -0
  55. package/docs/LANGUAGE-FAULTS.md +583 -0
  56. package/docs/LANGUAGE_IMPROVEMENT_REQUESTS.md +187 -0
  57. package/docs/LEARNING.md +257 -0
  58. package/docs/MISTAKES-100.md +52 -0
  59. package/docs/MISTAKES.md +131 -0
  60. package/docs/NAMING_CONVENTIONS.md +158 -0
  61. package/docs/NIGHTLY-MONITORING.md +222 -0
  62. package/docs/OFFICIAL_LANGUAGE.md +249 -0
  63. package/docs/ONBOARDING_1HOUR.md +210 -0
  64. package/docs/PERFORMANCE.md +329 -0
  65. package/docs/PHASE-3C-L2-PROOF-PLAN.md +282 -0
  66. package/docs/PHASE-3C-L2-RESULTS.md +183 -0
  67. package/docs/PHASE-3D-AI-LIBRARY.md +170 -0
  68. package/docs/PHASE-3E-VM-OPTIMIZATION.md +192 -0
  69. package/docs/PHASE-C-CI.md +242 -0
  70. package/docs/PHASE-C-PR-CHECKLIST.md +267 -0
  71. package/docs/PHASE-C-ROADMAP.md +141 -0
  72. package/docs/PHASE-C-SCAN.md +205 -0
  73. package/docs/PHASE-G-ROADMAP.md +228 -0
  74. package/docs/PHASE-X-V11.5-ROADMAP.md +267 -0
  75. package/docs/PHASE4_IMPLEMENTATION_PLAN.md +290 -0
  76. package/docs/PHASE5-COMPLETION.md +186 -0
  77. package/docs/PHASE5-SUMMARY.md +82 -0
  78. package/docs/PLUGIN_GUIDE.md +241 -0
  79. package/docs/PROJECT_OVERVIEW_KO.md +66 -0
  80. package/docs/QUICKSTART.md +160 -0
  81. package/docs/README.md +192 -0
  82. package/docs/RESERVED.md +125 -0
  83. package/docs/ROADMAP.md +191 -0
  84. package/docs/SECURITY.md +518 -0
  85. package/docs/SETUP.md +127 -0
  86. package/docs/SLACK-SETUP.md +190 -0
  87. package/docs/STATE_OF_V11.md +74 -0
  88. package/docs/STDLIB_NAMING_AUDIT.md +154 -0
  89. package/docs/STDLIB_REFERENCE.md +2722 -0
  90. package/docs/STYLE_GUIDE.md +559 -0
  91. package/docs/TASK5-MAP-DESTRUCTURE-DESIGN.md +136 -0
  92. package/docs/TOOLS.md +357 -0
  93. package/docs/TYPE_SYSTEM_GUIDE.md +201 -0
  94. package/docs/UI-PATTERN.md +265 -0
  95. package/docs/V11.5-RULES.md +416 -0
  96. package/docs/V11.6-HARNESS-RULES.md +222 -0
  97. package/docs/V11.6-MULTI-AGENT-PLAN.md +265 -0
  98. package/docs/V11.6-STABILIZATION-PLAN.md +290 -0
  99. package/docs/Y4-2B_DRY_RUN.md +142 -0
  100. package/docs/_classifications.json +882 -0
  101. package/docs/api/stdlib.md +134 -0
  102. package/docs/blog/2026-04-17-v11-ai-first-evolution.md +223 -0
  103. package/docs/blog/2026-04-20-self-hosting-fixedpoint.md +269 -0
  104. package/docs/blog/2026-05-04-mistakes-are-language-faults.md +267 -0
  105. package/docs/blog/2026-05-04-mistakes-coverage-honest.md +170 -0
  106. package/docs/blog/2026-05-04-phase-g-followup-smart-wrapper.md +188 -0
  107. package/docs/blog/2026-05-04-phase-g-mistakes-100.md +269 -0
  108. package/docs/blog/2026-05-04-phase-x-v11.5-launch.md +224 -0
  109. package/docs/blog/2026-05-04-v11.5.0-real-language-change.md +252 -0
  110. package/docs/blog-demo/README.md +44 -0
  111. package/docs/examples/index.md +78 -0
  112. package/docs/examples/todo-app.md +99 -0
  113. package/docs/guide/ai-blocks.md +335 -0
  114. package/docs/guide/basics.md +235 -0
  115. package/docs/guide/frameworks.md +319 -0
  116. package/docs/homepage/README.md +164 -0
  117. package/docs/index.md +183 -0
  118. package/docs/v12-DESIGN.md +214 -0
  119. package/examples/README.md +26 -0
  120. package/examples/browser-test.html +149 -0
  121. package/examples/csv-tool/analyze.fl +222 -0
  122. package/examples/csv-tool/employees.csv +16 -0
  123. package/examples/csv-tool/products.csv +21 -0
  124. package/examples/factorial.fl +9 -0
  125. package/examples/fib30.fl +4 -0
  126. package/examples/hello.fl +2 -0
  127. package/examples/hello.fl.js +3 -0
  128. package/examples/learning-session/01-grade-stats.fl +49 -0
  129. package/examples/learning-session/02-class-stats.fl +52 -0
  130. package/examples/learning-session/03-cart.fl +61 -0
  131. package/examples/learning-session/04-word-freq.fl +57 -0
  132. package/examples/learning-session/05-todo.fl +69 -0
  133. package/examples/learning-session/06-library.fl +76 -0
  134. package/examples/learning-session/07-currency.fl +99 -0
  135. package/examples/learning-session/08-csv-grades.fl +104 -0
  136. package/examples/learning-session/09-calc-repl.fl +92 -0
  137. package/examples/learning-session/10-contacts.fl +109 -0
  138. package/examples/learning-session/11-markdown.fl +107 -0
  139. package/examples/learning-session/12-calendar.fl +87 -0
  140. package/examples/learning-session/13-statistics.fl +123 -0
  141. package/examples/learning-session/14-primes.fl +107 -0
  142. package/examples/learning-session/15-statistics.fl +123 -0
  143. package/examples/learning-session/16-calendar.fl +87 -0
  144. package/examples/learning-session/17-markdown.fl +107 -0
  145. package/examples/learning-session/18-contacts.fl +109 -0
  146. package/examples/learning-session/19-json-serializer.fl +86 -0
  147. package/examples/learning-session/20-template.fl +201 -0
  148. package/examples/learning-session/21-calc-parser.fl +148 -0
  149. package/examples/learning-session/22-table.fl +96 -0
  150. package/examples/patterns/01-map-filter-reduce.fl +50 -0
  151. package/examples/patterns/02-error-handling.fl +51 -0
  152. package/examples/patterns/03-type-validation.fl +57 -0
  153. package/examples/patterns/04-state-management.fl +44 -0
  154. package/examples/patterns/05-api-integration.fl +95 -0
  155. package/examples/patterns/06-database-operations.fl +113 -0
  156. package/examples/patterns/07-string-processing.fl +86 -0
  157. package/examples/patterns/08-data-transformation.fl +92 -0
  158. package/examples/patterns/09-decision-logic.fl +122 -0
  159. package/examples/patterns/10-agent-orchestration.fl +184 -0
  160. package/examples/patterns/README.md +344 -0
  161. package/examples/simple-server.fl +29 -0
  162. package/examples/tables-app.fl +219 -0
  163. package/examples/test-libs.fl +272 -0
  164. package/jest.config.js +4 -0
  165. package/lib/datetime.fl +123 -0
  166. package/lib/http-client.fl +129 -0
  167. package/lib/pipeline.fl +150 -0
  168. package/lib/query.fl +160 -0
  169. package/lib/result.fl +124 -0
  170. package/lib/template.fl +161 -0
  171. package/lib/validate.fl +136 -0
  172. package/package.json +58 -0
  173. package/scripts/ai-eval.js +318 -0
  174. package/scripts/ai-self-verify.js +200 -0
  175. package/scripts/ai-validate.js +302 -0
  176. package/scripts/bench.sh +71 -0
  177. package/scripts/benchmark.js +258 -0
  178. package/scripts/benchmark.sh +99 -0
  179. package/scripts/build-binary.sh +68 -0
  180. package/scripts/build-runtime.sh +46 -0
  181. package/scripts/build-stage1-final.sh +58 -0
  182. package/scripts/build-stage1.sh +119 -0
  183. package/scripts/build-standalone.sh +17 -0
  184. package/scripts/build.js +130 -0
  185. package/scripts/check-let-regressions.js +95 -0
  186. package/scripts/check-parens.py +117 -0
  187. package/scripts/check-ports.sh +49 -0
  188. package/scripts/check-syntax.js +30 -0
  189. package/scripts/cli-extras.js +135 -0
  190. package/scripts/cron-daily-verify.sh +101 -0
  191. package/scripts/deploy.sh +91 -0
  192. package/scripts/dev.sh +37 -0
  193. package/scripts/extract-fl-examples.js +29 -0
  194. package/scripts/extract-runtime-helpers.js +122 -0
  195. package/scripts/fl-compile.sh +14 -0
  196. package/scripts/fl-fixpoint.sh +28 -0
  197. package/scripts/fl-repl.sh +21 -0
  198. package/scripts/fl-run.sh +41 -0
  199. package/scripts/fl-serve.sh +25 -0
  200. package/scripts/fuzz-compiler.js +92 -0
  201. package/scripts/gen-ai-prompt.js +340 -0
  202. package/scripts/gen-fixtures.js +166 -0
  203. package/scripts/gen-mistakes-split.js +199 -0
  204. package/scripts/gen-stdlib-docs.js +69 -0
  205. package/scripts/lint-stdlib-aliases.js +166 -0
  206. package/scripts/measure-baseline.sh +43 -0
  207. package/scripts/property-test.js +885 -0
  208. package/scripts/push-to-gogs.sh +60 -0
  209. package/scripts/regression-scan.js +132 -0
  210. package/scripts/run-jest-shard.sh +85 -0
  211. package/scripts/safe-push.sh +37 -0
  212. package/scripts/scan-fl-tokens.js +170 -0
  213. package/scripts/scan-for-fl-tokens.sh +17 -0
  214. package/scripts/self-diff.sh +95 -0
  215. package/scripts/snapshot-v0.sh +35 -0
  216. package/scripts/test-l2-fixpoint.sh +54 -0
  217. package/scripts/verify-all.sh +130 -0
  218. package/scripts/verify-build-deterministic.sh +110 -0
  219. package/scripts/verify-c7-bootstrap.sh +150 -0
  220. package/scripts/verify-c8-fixed-point-simple.sh +121 -0
  221. package/scripts/verify-c8-fixed-point.sh +133 -0
  222. package/scripts/verify-c9-fuzzing.sh +214 -0
  223. package/scripts/verify-fixed-point-deep.sh +133 -0
  224. package/scripts/verify-fixed-point.sh +65 -0
  225. package/scripts/verify-l2-proof.sh +153 -0
  226. package/scripts/verify-l3-proof.sh +40 -0
  227. package/scripts/verify-mistakes-coverage.js +120 -0
  228. package/scripts/verify-self-host.sh +509 -0
  229. package/self/CHANGELOG.md +964 -0
  230. package/self/COMPILER_REDESIGN_FAILURES.md +59 -0
  231. package/self/INTEGRATION-CHECKLIST.md +113 -0
  232. package/self/README.md +34 -0
  233. package/self/all.fl +1353 -0
  234. package/self/ast.fl +219 -0
  235. package/self/ast.self.js +47 -0
  236. package/self/bench/_bi_json-parse.js +46 -0
  237. package/self/bench/_bi_json-str.js +60 -0
  238. package/self/bench/_bi_list-distinct.js +37 -0
  239. package/self/bench/_bi_list-filter-even.js +56 -0
  240. package/self/bench/_bi_list-first.js +29 -0
  241. package/self/bench/_bi_list-last.js +28 -0
  242. package/self/bench/_bi_list-map-inc.js +41 -0
  243. package/self/bench/_bi_list-range.js +22 -0
  244. package/self/bench/_bi_list-reduce-sum.js +50 -0
  245. package/self/bench/_bi_list-reverse.js +28 -0
  246. package/self/bench/_bi_list-sort.js +35 -0
  247. package/self/bench/_bi_list-take.js +36 -0
  248. package/self/bench/_bi_m-abs.js +24 -0
  249. package/self/bench/_bi_m-floor.js +22 -0
  250. package/self/bench/_bi_m-max.js +26 -0
  251. package/self/bench/_bi_m-min.js +26 -0
  252. package/self/bench/_bi_m-mod.js +21 -0
  253. package/self/bench/_bi_map-has.js +50 -0
  254. package/self/bench/_bi_map-keys.js +50 -0
  255. package/self/bench/_bi_map-values.js +52 -0
  256. package/self/bench/_bi_str-concat.js +36 -0
  257. package/self/bench/_bi_str-contains.js +43 -0
  258. package/self/bench/_bi_str-ends.js +45 -0
  259. package/self/bench/_bi_str-index.js +34 -0
  260. package/self/bench/_bi_str-lower.js +23 -0
  261. package/self/bench/_bi_str-repeat.js +26 -0
  262. package/self/bench/_bi_str-split.js +41 -0
  263. package/self/bench/_bi_str-starts.js +47 -0
  264. package/self/bench/_bi_str-trim.js +26 -0
  265. package/self/bench/_bi_str-upper.js +23 -0
  266. package/self/bench/_bi_t-list.js +24 -0
  267. package/self/bench/_bi_t-null.js +23 -0
  268. package/self/bench/_bi_t-number.js +23 -0
  269. package/self/bench/_bi_t-string.js +25 -0
  270. package/self/bench/_bi_t-typeof.js +25 -0
  271. package/self/bench/_c_parse_probe.fl +426 -0
  272. package/self/bench/_c_parse_probe.js +67 -0
  273. package/self/bench/_codegen_nodrv.fl +751 -0
  274. package/self/bench/_combined2.fl +423 -0
  275. package/self/bench/_combined_arr.fl +422 -0
  276. package/self/bench/_combined_astprobe.fl +429 -0
  277. package/self/bench/_combined_astprobe.js +69 -0
  278. package/self/bench/_combined_cg.fl +424 -0
  279. package/self/bench/_combined_cg.js +64 -0
  280. package/self/bench/_combined_lex.fl +421 -0
  281. package/self/bench/_combined_trace.fl +435 -0
  282. package/self/bench/_combined_trace.js +75 -0
  283. package/self/bench/_ext_abs-neg.js +2 -0
  284. package/self/bench/_ext_and.js +2 -0
  285. package/self/bench/_ext_cond-1.js +2 -0
  286. package/self/bench/_ext_cond-2.js +2 -0
  287. package/self/bench/_ext_do-seq.js +2 -0
  288. package/self/bench/_ext_fact20.js +3 -0
  289. package/self/bench/_ext_fib25.js +3 -0
  290. package/self/bench/_ext_length.js +2 -0
  291. package/self/bench/_ext_let-1d.js +18 -0
  292. package/self/bench/_ext_let-2d.js +2 -0
  293. package/self/bench/_ext_list-sum.js +3 -0
  294. package/self/bench/_ext_math.js +2 -0
  295. package/self/bench/_ext_or.js +2 -0
  296. package/self/bench/_ext_str.js +2 -0
  297. package/self/bench/_fact15.js +2 -0
  298. package/self/bench/_fb_fact15.js +2 -0
  299. package/self/bench/_fb_func-fact.js +2 -0
  300. package/self/bench/_fb_func-multi.js +2 -0
  301. package/self/bench/_fb_func-mutual.js +3 -0
  302. package/self/bench/_fb_func-simple.js +21 -0
  303. package/self/bench/_fib.js +2 -0
  304. package/self/bench/_fn_async-await-seq.js +40 -0
  305. package/self/bench/_fn_async-await.js +3 -0
  306. package/self/bench/_fn_async-print.js +26 -0
  307. package/self/bench/_fn_async-result.js +1 -0
  308. package/self/bench/_fn_call-form.js +24 -0
  309. package/self/bench/_fn_compose.js +37 -0
  310. package/self/bench/_fn_pipe.js +34 -0
  311. package/self/bench/_fn_thread-first-sexpr.js +31 -0
  312. package/self/bench/_fn_thread-first.js +25 -0
  313. package/self/bench/_fn_thread-last.js +31 -0
  314. package/self/bench/_generated.js +35 -0
  315. package/self/bench/_mt_match-default.js +51 -0
  316. package/self/bench/_mt_match-num.js +58 -0
  317. package/self/bench/_mt_match-str.js +56 -0
  318. package/self/bench/_mt_match-var.js +32 -0
  319. package/self/bench/_mt_match-wild.js +36 -0
  320. package/self/bench/_mt_struct-make.js +81 -0
  321. package/self/bench/_mt_struct-tag.js +81 -0
  322. package/self/bench/_probe.fl +1 -0
  323. package/self/bench/_probe2.fl +1 -0
  324. package/self/bench/_probe3.fl +3 -0
  325. package/self/bench/_probe_apply.fl +1 -0
  326. package/self/bench/_probe_args.fl +7 -0
  327. package/self/bench/_probe_arr.fl +7 -0
  328. package/self/bench/_probe_arr2.fl +5 -0
  329. package/self/bench/_probe_block.fl +7 -0
  330. package/self/bench/_probe_call.fl +1 -0
  331. package/self/bench/_probe_cg.fl +27 -0
  332. package/self/bench/_probe_compose.fl +13 -0
  333. package/self/bench/_probe_define.fl +1 -0
  334. package/self/bench/_probe_keys.fl +5 -0
  335. package/self/bench/_probe_length.fl +5 -0
  336. package/self/bench/_probe_lexparse.fl +4 -0
  337. package/self/bench/_probe_loop.fl +12 -0
  338. package/self/bench/_probe_map.fl +8 -0
  339. package/self/bench/_probe_map2.fl +8 -0
  340. package/self/bench/_probe_map3.fl +5 -0
  341. package/self/bench/_probe_mapkeys.fl +5 -0
  342. package/self/bench/_probe_mapv12.fl +1 -0
  343. package/self/bench/_probe_mapv12.js +2 -0
  344. package/self/bench/_probe_match.fl +1 -0
  345. package/self/bench/_probe_match2.fl +1 -0
  346. package/self/bench/_probe_neg.fl +7 -0
  347. package/self/bench/_probe_neg2.fl +3 -0
  348. package/self/bench/_probe_protocol.fl +7 -0
  349. package/self/bench/_probe_self_parse.fl +6 -0
  350. package/self/bench/_probe_struct.fl +1 -0
  351. package/self/bench/_probe_true.fl +3 -0
  352. package/self/bench/_probe_true2.fl +6 -0
  353. package/self/bench/_probe_v12_cg.fl +7 -0
  354. package/self/bench/_probe_v12_extract.fl +8 -0
  355. package/self/bench/_probe_v12_extract.js +7 -0
  356. package/self/bench/_probe_v12_internal.fl +21 -0
  357. package/self/bench/_probe_v12_map_ast.fl +12 -0
  358. package/self/bench/_rs_combo.js +3 -0
  359. package/self/bench/_rs_gcd.js +36 -0
  360. package/self/bench/_rs_grade.js +2 -0
  361. package/self/bench/_rs_mutual-fib.js +2 -0
  362. package/self/bench/_rs_range-sum.js +2 -0
  363. package/self/bench/_rs_sum-10k.js +2 -0
  364. package/self/bench/_rs_sum-5k.js +2 -0
  365. package/self/bench/_sf_loop-fact-10.js +73 -0
  366. package/self/bench/_sf_loop-sum-10k.js +87 -0
  367. package/self/bench/_sf_set-x.js +40 -0
  368. package/self/bench/_sf_throw-catch.js +1 -0
  369. package/self/bench/_sf_while-5.js +62 -0
  370. package/self/bench/_v12_combined.fl +1184 -0
  371. package/self/bench/_v12_extract_test.fl +14 -0
  372. package/self/bench/_v12_extract_test.js +7 -0
  373. package/self/bench/_v12_inspect.js +26 -0
  374. package/self/bench/_v12_inspect_mod.js +137 -0
  375. package/self/bench/_v12_makevartest.fl +8 -0
  376. package/self/bench/_v12_makevartest.js +6 -0
  377. package/self/bench/_v12_parse_probe.fl +9 -0
  378. package/self/bench/_v12_parse_trace.fl +18 -0
  379. package/self/bench/_v12_simple_fn.fl +2 -0
  380. package/self/bench/_v12_simple_fn.js +3 -0
  381. package/self/bench/_v12_trace.fl +2 -0
  382. package/self/bench/_v12_trace.js +3 -0
  383. package/self/bench/collection.js +13 -0
  384. package/self/bench/fib30.fl +4 -0
  385. package/self/bench/final-test.fl +12 -0
  386. package/self/bench/final-test.js +2 -0
  387. package/self/bench/fp1-v12.js +4 -0
  388. package/self/bench/fp1.fl +3 -0
  389. package/self/bench/fp1.fp.js +4 -0
  390. package/self/bench/fp2-v12.js +4 -0
  391. package/self/bench/fp2.fl +3 -0
  392. package/self/bench/fp2.fp.js +4 -0
  393. package/self/bench/fp3-v12.js +8 -0
  394. package/self/bench/fp3.fl +11 -0
  395. package/self/bench/fp3.fp.js +8 -0
  396. package/self/bench/fp4-v12.js +6 -0
  397. package/self/bench/fp4.fl +9 -0
  398. package/self/bench/fp4.fp.js +6 -0
  399. package/self/bench/hello-sample.fl +3 -0
  400. package/self/bench/hello-sample.js +4 -0
  401. package/self/bench/hello.fl +1 -0
  402. package/self/bench/json.js +9 -0
  403. package/self/bench/json1mb.fl +3 -0
  404. package/self/bench/math.js +8 -0
  405. package/self/bench/realworld.fl +17 -0
  406. package/self/bench/realworld.js +8 -0
  407. package/self/bench/regex.js +10 -0
  408. package/self/bench/sample.json +1 -0
  409. package/self/bench/string.js +7 -0
  410. package/self/bench/test-ffi.fl +3 -0
  411. package/self/bench/test-ffi.js +2 -0
  412. package/self/bench/test-hof-advanced.fl +7 -0
  413. package/self/bench/test-hof-advanced.js +2 -0
  414. package/self/bench/test-hof.fl +5 -0
  415. package/self/bench/test-hof.js +2 -0
  416. package/self/bench/test-output.txt +1 -0
  417. package/self/bench/test-phase15-integration.fl +16 -0
  418. package/self/bench/test-phase15-integration.js +3 -0
  419. package/self/bench/test-phase19-complete.fl +24 -0
  420. package/self/bench/test-phase19-complete.js +2 -0
  421. package/self/bench/test-stdlib-codegen.fl +9 -0
  422. package/self/bench/test-stdlib-codegen.js +2 -0
  423. package/self/bench/test-time.fl +8 -0
  424. package/self/bench/test-time.js +2 -0
  425. package/self/bench/time.js +9 -0
  426. package/self/bench/tiny-v12.js +2 -0
  427. package/self/bench/tiny.fl +1 -0
  428. package/self/builtins/core.fl +150 -0
  429. package/self/char-class.fl +45 -0
  430. package/self/codegen-core.fl +733 -0
  431. package/self/codegen-final.fl +135 -0
  432. package/self/codegen.fl +379 -0
  433. package/self/codegen.fl.bak +856 -0
  434. package/self/codegen.self.js +75 -0
  435. package/self/examples/agent-loop.fl +32 -0
  436. package/self/examples/ci-cd-example.fl +114 -0
  437. package/self/examples/cloud-real.fl +134 -0
  438. package/self/examples/docker-example.fl +67 -0
  439. package/self/examples/fullstack-app.fl +330 -0
  440. package/self/examples/k8s-example.fl +91 -0
  441. package/self/examples/microservices.fl +448 -0
  442. package/self/examples/rest-api.fl +253 -0
  443. package/self/examples/style-example.fl +133 -0
  444. package/self/examples/workflow-orchestration.fl +44 -0
  445. package/self/fixtures/eval/add.fl +1 -0
  446. package/self/fixtures/eval/and-sc.fl +1 -0
  447. package/self/fixtures/eval/bool-false.fl +1 -0
  448. package/self/fixtures/eval/bool-true.fl +1 -0
  449. package/self/fixtures/eval/closure.fl +1 -0
  450. package/self/fixtures/eval/cmp-eq.fl +1 -0
  451. package/self/fixtures/eval/cmp-lt.fl +1 -0
  452. package/self/fixtures/eval/cond-first.fl +1 -0
  453. package/self/fixtures/eval/define-fn3.fl +1 -0
  454. package/self/fixtures/eval/define-var.fl +1 -0
  455. package/self/fixtures/eval/defn-bare.fl +1 -0
  456. package/self/fixtures/eval/defn-call.fl +1 -0
  457. package/self/fixtures/eval/div.fl +1 -0
  458. package/self/fixtures/eval/filter-hof.fl +1 -0
  459. package/self/fixtures/eval/floor.fl +1 -0
  460. package/self/fixtures/eval/fn-apply.fl +1 -0
  461. package/self/fixtures/eval/get-idx.fl +1 -0
  462. package/self/fixtures/eval/get-key.fl +1 -0
  463. package/self/fixtures/eval/higher-order.fl +1 -0
  464. package/self/fixtures/eval/let-bare.fl +1 -0
  465. package/self/fixtures/eval/let-flat.fl +1 -0
  466. package/self/fixtures/eval/let-use.fl +1 -0
  467. package/self/fixtures/eval/list-first.fl +1 -0
  468. package/self/fixtures/eval/list-last.fl +1 -0
  469. package/self/fixtures/eval/list-len.fl +1 -0
  470. package/self/fixtures/eval/map-hof.fl +1 -0
  471. package/self/fixtures/eval/mod.fl +1 -0
  472. package/self/fixtures/eval/mul-nested.fl +1 -0
  473. package/self/fixtures/eval/not.fl +1 -0
  474. package/self/fixtures/eval/null-p.fl +1 -0
  475. package/self/fixtures/eval/or-sc.fl +1 -0
  476. package/self/fixtures/eval/pow.fl +1 -0
  477. package/self/fixtures/eval/recursion.fl +1 -0
  478. package/self/fixtures/eval/reduce-hof.fl +1 -0
  479. package/self/fixtures/eval/replace.fl +1 -0
  480. package/self/fixtures/eval/sqrt.fl +1 -0
  481. package/self/fixtures/eval/str-concat.fl +1 -0
  482. package/self/fixtures/eval/str-num.fl +1 -0
  483. package/self/fixtures/eval/sub.fl +1 -0
  484. package/self/fixtures/eval/substring.fl +1 -0
  485. package/self/fixtures/lex/array.fl +1 -0
  486. package/self/fixtures/lex/at-atom.fl +1 -0
  487. package/self/fixtures/lex/block.fl +1 -0
  488. package/self/fixtures/lex/comment.fl +2 -0
  489. package/self/fixtures/lex/deep-array.fl +1 -0
  490. package/self/fixtures/lex/deep-map.fl +1 -0
  491. package/self/fixtures/lex/deep-nest.fl +1 -0
  492. package/self/fixtures/lex/dollar-dot.fl +1 -0
  493. package/self/fixtures/lex/empty-list.fl +1 -0
  494. package/self/fixtures/lex/empty-str.fl +1 -0
  495. package/self/fixtures/lex/empty.fl +1 -0
  496. package/self/fixtures/lex/float.fl +1 -0
  497. package/self/fixtures/lex/hex.fl +1 -0
  498. package/self/fixtures/lex/kebab-sym.fl +1 -0
  499. package/self/fixtures/lex/keyword.fl +1 -0
  500. package/self/fixtures/lex/leading-zero.fl +1 -0
  501. package/self/fixtures/lex/long-num.fl +1 -0
  502. package/self/fixtures/lex/many-args.fl +1 -0
  503. package/self/fixtures/lex/map.fl +1 -0
  504. package/self/fixtures/lex/mixed.fl +1 -0
  505. package/self/fixtures/lex/neg-float.fl +1 -0
  506. package/self/fixtures/lex/negative.fl +1 -0
  507. package/self/fixtures/lex/nested.fl +1 -0
  508. package/self/fixtures/lex/null.fl +1 -0
  509. package/self/fixtures/lex/pipe-op.fl +1 -0
  510. package/self/fixtures/lex/route-like.fl +1 -0
  511. package/self/fixtures/lex/scientific.fl +1 -0
  512. package/self/fixtures/lex/single-num.fl +1 -0
  513. package/self/fixtures/lex/small-sexpr.fl +1 -0
  514. package/self/fixtures/lex/spaces.fl +1 -0
  515. package/self/fixtures/lex/str-quote.fl +1 -0
  516. package/self/fixtures/lex/str-tab.fl +1 -0
  517. package/self/fixtures/lex/string-esc.fl +1 -0
  518. package/self/fixtures/lex/string.fl +1 -0
  519. package/self/fixtures/lex/symbol.fl +1 -0
  520. package/self/fixtures/lex/tabs-nl.fl +3 -0
  521. package/self/fixtures/lex/true-false.fl +1 -0
  522. package/self/fixtures/lex/unicode.fl +1 -0
  523. package/self/fixtures/lex/variable.fl +1 -0
  524. package/self/fixtures/lex/zero.fl +1 -0
  525. package/self/fixtures/parse/and-or.fl +1 -0
  526. package/self/fixtures/parse/array-lit.fl +1 -0
  527. package/self/fixtures/parse/block-func.fl +1 -0
  528. package/self/fixtures/parse/compose.fl +1 -0
  529. package/self/fixtures/parse/cond.fl +1 -0
  530. package/self/fixtures/parse/define-fn.fl +1 -0
  531. package/self/fixtures/parse/define-val.fl +1 -0
  532. package/self/fixtures/parse/defn.fl +1 -0
  533. package/self/fixtures/parse/do-begin.fl +1 -0
  534. package/self/fixtures/parse/dotted.fl +1 -0
  535. package/self/fixtures/parse/empty-fn.fl +1 -0
  536. package/self/fixtures/parse/empty-list.fl +1 -0
  537. package/self/fixtures/parse/fn.fl +1 -0
  538. package/self/fixtures/parse/if-else.fl +1 -0
  539. package/self/fixtures/parse/if-only.fl +1 -0
  540. package/self/fixtures/parse/keyword-arg.fl +1 -0
  541. package/self/fixtures/parse/kw.fl +1 -0
  542. package/self/fixtures/parse/let-1d.fl +1 -0
  543. package/self/fixtures/parse/let-2d.fl +1 -0
  544. package/self/fixtures/parse/let-bare.fl +1 -0
  545. package/self/fixtures/parse/literal-num.fl +1 -0
  546. package/self/fixtures/parse/literal-str.fl +1 -0
  547. package/self/fixtures/parse/loop-recur.fl +1 -0
  548. package/self/fixtures/parse/map-lit.fl +1 -0
  549. package/self/fixtures/parse/match-simple.fl +1 -0
  550. package/self/fixtures/parse/multi-body.fl +1 -0
  551. package/self/fixtures/parse/nested-arr.fl +1 -0
  552. package/self/fixtures/parse/nested-block.fl +1 -0
  553. package/self/fixtures/parse/nested-map.fl +1 -0
  554. package/self/fixtures/parse/nested.fl +1 -0
  555. package/self/fixtures/parse/pipe.fl +1 -0
  556. package/self/fixtures/parse/quote.fl +1 -0
  557. package/self/fixtures/parse/set-bang.fl +1 -0
  558. package/self/fixtures/parse/sexpr.fl +1 -0
  559. package/self/fixtures/parse/str-interp.fl +1 -0
  560. package/self/fixtures/parse/sym.fl +1 -0
  561. package/self/fixtures/parse/thread-first.fl +1 -0
  562. package/self/fixtures/parse/thread-last.fl +1 -0
  563. package/self/fixtures/parse/try-catch.fl +1 -0
  564. package/self/fixtures/parse/var.fl +1 -0
  565. package/self/full-compiler-fixed.fl +1308 -0
  566. package/self/full-compiler-v1-bloated.fl +1298 -0
  567. package/self/full-compiler.fl +1301 -0
  568. package/self/interpreter.fl +351 -0
  569. package/self/lexer.fl +200 -0
  570. package/self/lexer.self.js +30 -0
  571. package/self/main.fl +22 -0
  572. package/self/parser.fl +241 -0
  573. package/self/parser.self.js +33 -0
  574. package/self/runtime/http-server.js +642 -0
  575. package/self/runtime/interpreter.js +30787 -0
  576. package/self/runtime/repl.js +186 -0
  577. package/self/runtime-helpers.ts +282 -0
  578. package/self/scope.fl +80 -0
  579. package/self/scope.self.js +1 -0
  580. package/self/self/bench/_bi_list-distinct.js +2 -0
  581. package/self/self/bench/_bi_list-filter-even.js +2 -0
  582. package/self/self/bench/_bi_list-first.js +2 -0
  583. package/self/self/bench/_bi_list-last.js +2 -0
  584. package/self/self/bench/_bi_list-map-inc.js +2 -0
  585. package/self/self/bench/_bi_list-range.js +2 -0
  586. package/self/self/bench/_bi_list-reduce-sum.js +2 -0
  587. package/self/self/bench/_bi_list-reverse.js +2 -0
  588. package/self/self/bench/_bi_list-sort.js +2 -0
  589. package/self/self/bench/_bi_list-take.js +2 -0
  590. package/self/self/bench/_bi_map-has.js +2 -0
  591. package/self/self/bench/_bi_map-keys.js +2 -0
  592. package/self/self/bench/_bi_map-values.js +2 -0
  593. package/self/self/bench/_bi_str-concat.js +2 -0
  594. package/self/self/bench/_bi_str-contains.js +2 -0
  595. package/self/self/bench/_bi_str-ends.js +2 -0
  596. package/self/self/bench/_bi_str-index.js +2 -0
  597. package/self/self/bench/_bi_str-lower.js +2 -0
  598. package/self/self/bench/_bi_str-repeat.js +2 -0
  599. package/self/self/bench/_bi_str-split.js +2 -0
  600. package/self/self/bench/_bi_str-starts.js +2 -0
  601. package/self/self/bench/_bi_str-trim.js +2 -0
  602. package/self/self/bench/_bi_str-upper.js +2 -0
  603. package/self/self/bench/_ext_abs-neg.js +2 -0
  604. package/self/self/bench/_ext_and.js +2 -0
  605. package/self/self/bench/_ext_cond-1.js +2 -0
  606. package/self/self/bench/_ext_cond-2.js +2 -0
  607. package/self/self/bench/_ext_do-seq.js +2 -0
  608. package/self/self/bench/_ext_fact20.js +3 -0
  609. package/self/self/bench/_ext_fib25.js +3 -0
  610. package/self/self/bench/_ext_length.js +2 -0
  611. package/self/self/bench/_ext_let-1d.js +2 -0
  612. package/self/self/bench/_ext_let-2d.js +2 -0
  613. package/self/self/bench/_ext_list-sum.js +3 -0
  614. package/self/self/bench/_ext_math.js +2 -0
  615. package/self/self/bench/_ext_or.js +2 -0
  616. package/self/self/bench/_ext_str.js +2 -0
  617. package/self/self/bench/_fact15.js +2 -0
  618. package/self/self/bench/_fb_fact15.js +2 -0
  619. package/self/self/bench/_fb_func-fact.js +2 -0
  620. package/self/self/bench/_fb_func-multi.js +2 -0
  621. package/self/self/bench/_fb_func-mutual.js +3 -0
  622. package/self/self/bench/_fb_func-simple.js +2 -0
  623. package/self/self/bench/_fib.js +2 -0
  624. package/self/self/bench/_fn_async-await-seq.js +2 -0
  625. package/self/self/bench/_fn_async-print.js +2 -0
  626. package/self/self/bench/_fn_call-form.js +2 -0
  627. package/self/self/bench/_fn_compose.js +2 -0
  628. package/self/self/bench/_fn_pipe.js +2 -0
  629. package/self/self/bench/_fn_thread-first-sexpr.js +2 -0
  630. package/self/self/bench/_fn_thread-first.js +2 -0
  631. package/self/self/bench/_fn_thread-last.js +2 -0
  632. package/self/self/bench/_generated.js +2 -0
  633. package/self/self/bench/_mt_match-default.js +2 -0
  634. package/self/self/bench/_mt_match-num.js +2 -0
  635. package/self/self/bench/_mt_match-str.js +2 -0
  636. package/self/self/bench/_mt_match-var.js +2 -0
  637. package/self/self/bench/_mt_match-wild.js +2 -0
  638. package/self/self/bench/_mt_struct-make.js +4 -0
  639. package/self/self/bench/_mt_struct-tag.js +4 -0
  640. package/self/self/bench/_rs_combo.js +3 -0
  641. package/self/self/bench/_rs_gcd.js +2 -0
  642. package/self/self/bench/_rs_grade.js +2 -0
  643. package/self/self/bench/_rs_mutual-fib.js +2 -0
  644. package/self/self/bench/_rs_range-sum.js +2 -0
  645. package/self/self/bench/_rs_sum-5k.js +2 -0
  646. package/self/self/bench/_sf_loop-fact-10.js +1 -0
  647. package/self/self/bench/_sf_loop-sum-10k.js +1 -0
  648. package/self/self/bench/_sf_set-x.js +3 -0
  649. package/self/self/bench/_sf_throw-catch.js +1 -0
  650. package/self/self/bench/_sf_while-5.js +3 -0
  651. package/self/stdlib/ai.fl +73 -0
  652. package/self/stdlib/assert.fl +30 -0
  653. package/self/stdlib/async.fl +48 -0
  654. package/self/stdlib/base64.fl +22 -0
  655. package/self/stdlib/binary.fl +30 -0
  656. package/self/stdlib/build.fl +69 -0
  657. package/self/stdlib/collection.fl +37 -0
  658. package/self/stdlib/color.fl +35 -0
  659. package/self/stdlib/crypto-hash.fl +29 -0
  660. package/self/stdlib/crypto.fl +56 -0
  661. package/self/stdlib/data.fl +69 -0
  662. package/self/stdlib/db.fl +53 -0
  663. package/self/stdlib/encoding.fl +49 -0
  664. package/self/stdlib/error.fl +36 -0
  665. package/self/stdlib/feed.fl +86 -0
  666. package/self/stdlib/file.fl +53 -0
  667. package/self/stdlib/format.fl +34 -0
  668. package/self/stdlib/graph.fl +72 -0
  669. package/self/stdlib/hash.fl +32 -0
  670. package/self/stdlib/heap.fl +76 -0
  671. package/self/stdlib/http.fl +47 -0
  672. package/self/stdlib/image.fl +45 -0
  673. package/self/stdlib/json.fl +11 -0
  674. package/self/stdlib/list-extra.fl +32 -0
  675. package/self/stdlib/markdown.fl +59 -0
  676. package/self/stdlib/math-extra.fl +34 -0
  677. package/self/stdlib/math.fl +13 -0
  678. package/self/stdlib/metadata.fl +66 -0
  679. package/self/stdlib/mongodb/bson.fl +21 -0
  680. package/self/stdlib/mongodb/schema.fl +95 -0
  681. package/self/stdlib/mongodb/wire.fl +54 -0
  682. package/self/stdlib/mongodb.fl +172 -0
  683. package/self/stdlib/path.fl +72 -0
  684. package/self/stdlib/plot.fl +56 -0
  685. package/self/stdlib/process.fl +50 -0
  686. package/self/stdlib/queue.fl +65 -0
  687. package/self/stdlib/regex.fl +11 -0
  688. package/self/stdlib/resource.fl +61 -0
  689. package/self/stdlib/search.fl +54 -0
  690. package/self/stdlib/set-extra.fl +35 -0
  691. package/self/stdlib/sort.fl +61 -0
  692. package/self/stdlib/stack.fl +54 -0
  693. package/self/stdlib/stats.fl +110 -0
  694. package/self/stdlib/stream.fl +56 -0
  695. package/self/stdlib/string-extended.fl +25 -0
  696. package/self/stdlib/string-extra.fl +40 -0
  697. package/self/stdlib/string.fl +21 -0
  698. package/self/stdlib/test-helpers.fl +51 -0
  699. package/self/stdlib/test-runner.fl +76 -0
  700. package/self/stdlib/time-extra.fl +27 -0
  701. package/self/stdlib/time.fl +31 -0
  702. package/self/stdlib/tree.fl +57 -0
  703. package/self/stdlib/types.fl +85 -0
  704. package/self/stdlib/url.fl +33 -0
  705. package/self/stdlib/uuid.fl +28 -0
  706. package/self/stdlib/validation.fl +42 -0
  707. package/self/stdlib/vector-math.fl +52 -0
  708. package/self/stdlib/ws.fl +52 -0
  709. package/self/tests/mongodb-phase3.fl +75 -0
  710. package/self/tests/mongodb-wire-phase2.fl +45 -0
  711. package/self/tests/test-ast.fl +36 -0
  712. package/self/tests/test-builtins.fl +340 -0
  713. package/self/tests/test-char-class.fl +29 -0
  714. package/self/tests/test-codegen-builtins.fl +240 -0
  715. package/self/tests/test-codegen-ext.fl +380 -0
  716. package/self/tests/test-codegen-ffi.fl +295 -0
  717. package/self/tests/test-codegen-fn.fl +177 -0
  718. package/self/tests/test-codegen-match.fl +161 -0
  719. package/self/tests/test-codegen-run.fl +252 -0
  720. package/self/tests/test-codegen-sf.fl +262 -0
  721. package/self/tests/test-codegen.fl +260 -0
  722. package/self/tests/test-core-fl.fl +63 -0
  723. package/self/tests/test-forward-decl.fl +5 -0
  724. package/self/tests/test-func-block.fl +4 -0
  725. package/self/tests/test-interp-user-fn.fl +296 -0
  726. package/self/tests/test-interp.fl +225 -0
  727. package/self/tests/test-lexer.fl +162 -0
  728. package/self/tests/test-list-debug.fl +21 -0
  729. package/self/tests/test-mutual-rec.fl +6 -0
  730. package/self/tests/test-parser-debug.fl +35 -0
  731. package/self/tests/test-parser-full-debug.fl +66 -0
  732. package/self/tests/test-parser-lex-debug.fl +107 -0
  733. package/self/tests/test-parser-lex-only.fl +40 -0
  734. package/self/tests/test-parser-simple-debug.fl +35 -0
  735. package/self/tests/test-parser.fl +262 -0
  736. package/self/tests/test-real-stdlib.fl +377 -0
  737. package/self/tests/test-scope.fl +74 -0
  738. package/self/tests/test-selfcompile.fl +325 -0
  739. package/self/tests/test-stdlib.fl +44 -0
  740. package/self/tests/test-tco.fl +16 -0
  741. package/self/tests/test-token.fl +4 -0
  742. package/self/token.fl +38 -0
  743. package/self/token.self.js +8 -0
  744. package/self/v12-driver.fl +16 -0
  745. package/self/verify.fl +39 -0
  746. package/self-evolve/1-observe-ast.fl +28 -0
  747. package/self-evolve/2-inspect-block.fl +35 -0
  748. package/self-evolve/3-full-ast-json.fl +10 -0
  749. package/self-evolve/4-trace-block-fields.fl +23 -0
  750. package/self-evolve/5-analyze-do-ast.fl +29 -0
  751. package/self-evolve/6-test-do-elim-simple.fl +14 -0
  752. package/self-evolve/debug-evaluate.fl +24 -0
  753. package/self-evolve/debug-gen1-const-fold.fl +57 -0
  754. package/self-evolve/debug-map.fl +15 -0
  755. package/self-evolve/debug-optimize-simple.fl +95 -0
  756. package/self-evolve/debug-recursive-map.fl +23 -0
  757. package/self-evolve/logs/gen-0.fl +1658 -0
  758. package/self-evolve/logs/gen-1.fl +1658 -0
  759. package/self-evolve/logs/gen-2.fl +1658 -0
  760. package/self-evolve/logs/speed-gen-0.fl +1423 -0
  761. package/self-evolve/run-semantic-test.js +130 -0
  762. package/self-evolve/test-basic.fl +19 -0
  763. package/self-evolve/test-fold-direct.fl +60 -0
  764. package/self-evolve/test-gen1-simple.fl +67 -0
  765. package/self-evolve/test-optimize-debug.fl +63 -0
  766. package/self-evolve/tmp-test.fl +1 -0
  767. package/self-evolve/v11-analyzer.fl +40 -0
  768. package/self-evolve/v11-benchmark.fl +45 -0
  769. package/self-evolve/v11-evolution-real.fl +45 -0
  770. package/self-evolve/v11-evolution.fl +32 -0
  771. package/self-evolve/v11-gen1-validate.fl +157 -0
  772. package/self-evolve/v11-optimizer-constant-fold.fl +124 -0
  773. package/self-evolve/v11-optimizer-dead-expr.fl +111 -0
  774. package/self-evolve/v11-optimizer-gen1-complete.fl +180 -0
  775. package/self-evolve/v11-optimizer-gen1.fl +68 -0
  776. package/self-evolve/v11-optimizer.fl +56 -0
  777. package/self-evolve/v11-semantic-test.fl +54 -0
  778. package/self-evolve/v11-speed-benchmark.fl +106 -0
  779. package/self-evolve/v11-speed-optimizer.fl +79 -0
  780. package/src/AGENT-DSL.md +527 -0
  781. package/src/CLI-DEPLOYMENT.md +204 -0
  782. package/src/CLI.md +361 -0
  783. package/src/EXPRESS-ADVANCED.md +294 -0
  784. package/src/EXPRESS-AUTH.md +365 -0
  785. package/src/EXPRESS-CACHE.md +409 -0
  786. package/src/EXPRESS-COMPLETE.md +569 -0
  787. package/src/EXPRESS-README.md +121 -0
  788. package/src/EXPRESS-TEST.md +492 -0
  789. package/src/EXPRESS-WEBSOCKET.md +391 -0
  790. package/src/LOGGING-GUIDE.md +354 -0
  791. package/src/STORAGE-GUIDE.md +416 -0
  792. package/src/__tests__/advanced.test.ts +573 -0
  793. package/src/__tests__/ai-library.test.ts +210 -0
  794. package/src/__tests__/build-determinism.test.ts +33 -0
  795. package/src/__tests__/builtins-advanced.test.ts +150 -0
  796. package/src/__tests__/builtins-sanity.test.ts +180 -0
  797. package/src/__tests__/codegen.let.test.ts +81 -0
  798. package/src/__tests__/core.test.ts +188 -0
  799. package/src/__tests__/coverage-boost.test.ts +626 -0
  800. package/src/__tests__/cron-scheduler.test.ts +269 -0
  801. package/src/__tests__/enterprise-blocks.test.ts +63 -0
  802. package/src/__tests__/errors.test.ts +313 -0
  803. package/src/__tests__/integration.test.ts +219 -0
  804. package/src/__tests__/interpreter.test.ts +170 -0
  805. package/src/__tests__/l2-proof.test.ts +78 -0
  806. package/src/__tests__/lexer-parser.test.ts +366 -0
  807. package/src/__tests__/lexer.test.ts +106 -0
  808. package/src/__tests__/mariadb-prepared-statement.test.ts +206 -0
  809. package/src/__tests__/migrate.test.ts +403 -0
  810. package/src/__tests__/mongodb-integration.test.ts.skip +207 -0
  811. package/src/__tests__/mongodb-phase4.test.ts +132 -0
  812. package/src/__tests__/p1-1-parallel-tasks.test.ts +179 -0
  813. package/src/__tests__/p1-2-compensation.test.ts +242 -0
  814. package/src/__tests__/p1-3-distributed.test.ts +160 -0
  815. package/src/__tests__/p1-4-observability.test.ts +161 -0
  816. package/src/__tests__/parser.test.ts +142 -0
  817. package/src/__tests__/phase151-self-evolve.test.ts +161 -0
  818. package/src/__tests__/rate-limiter.test.ts +274 -0
  819. package/src/__tests__/self-hosting.test.ts +174 -0
  820. package/src/__tests__/semantic-preservation.test.ts +207 -0
  821. package/src/__tests__/setup.ts +34 -0
  822. package/src/__tests__/special-forms-advanced.test.ts +106 -0
  823. package/src/__tests__/stdlib-crypto-rsa.test.ts +122 -0
  824. package/src/__tests__/stdlib-f4.test.ts +159 -0
  825. package/src/__tests__/stdlib-helpers.test.ts +128 -0
  826. package/src/__tests__/stdlib-modules.test.ts +161 -0
  827. package/src/__tests__/stdlib-mongodb.test.ts +331 -0
  828. package/src/__tests__/stdlib-new.test.ts +269 -0
  829. package/src/__tests__/stdlib-perf.test.ts +125 -0
  830. package/src/__tests__/stdlib-phase-b.test.ts +249 -0
  831. package/src/__tests__/stdlib.test.ts +163 -0
  832. package/src/__tests__/v12-alpha.test.ts +205 -0
  833. package/src/__tests__/vm-optin.test.ts +141 -0
  834. package/src/__tests__/web-integration.test.ts +1452 -0
  835. package/src/__tests__/weblibs.test.ts +210 -0
  836. package/src/_aliases.json +1123 -0
  837. package/src/_mongodb_helper.js +272 -0
  838. package/src/_stdlib-signatures.json +1 -0
  839. package/src/agent-chain.ts +71 -0
  840. package/src/agent-dsl.fl +168 -0
  841. package/src/agent-example-error-handling.fl +51 -0
  842. package/src/agent-example-sequential.fl +66 -0
  843. package/src/agent-example-state-tracking.fl +70 -0
  844. package/src/agent.ts +393 -0
  845. package/src/align.ts +349 -0
  846. package/src/analogy.ts +78 -0
  847. package/src/ast-helpers.ts +199 -0
  848. package/src/ast.ts +817 -0
  849. package/src/async-runtime.ts +263 -0
  850. package/src/belief.ts +86 -0
  851. package/src/benchmark-self.ts +275 -0
  852. package/src/benchmarks/bench-interpreter.ts +73 -0
  853. package/src/benchmarks/bench-runner.ts +85 -0
  854. package/src/benchmarks/bench-vm.ts +128 -0
  855. package/src/browser-debug-panel.ts +220 -0
  856. package/src/browser-entry.ts +79 -0
  857. package/src/browser-stubs/child-process-stubs.ts +6 -0
  858. package/src/browser-stubs/crypto-stubs.ts +15 -0
  859. package/src/browser-stubs/misc-stubs.ts +4 -0
  860. package/src/browser-stubs/node-stubs.ts +17 -0
  861. package/src/browser-stubs/path-stubs.ts +6 -0
  862. package/src/bytecode.ts +41 -0
  863. package/src/causal.ts +258 -0
  864. package/src/chain-agents.ts +86 -0
  865. package/src/checkpoint.ts +106 -0
  866. package/src/ci-runner.ts +279 -0
  867. package/src/cli.ts +2136 -0
  868. package/src/codegen-js.ts +847 -0
  869. package/src/cognitive.ts +95 -0
  870. package/src/compete.ts +60 -0
  871. package/src/compiler.ts +267 -0
  872. package/src/compose-reason.ts +118 -0
  873. package/src/consensus.ts +109 -0
  874. package/src/context-window.ts +139 -0
  875. package/src/cot.ts +241 -0
  876. package/src/counterfactual.ts +268 -0
  877. package/src/critique.ts +77 -0
  878. package/src/crossover.ts +218 -0
  879. package/src/curiosity.ts +305 -0
  880. package/src/debate.ts +64 -0
  881. package/src/debug-api.ts +92 -0
  882. package/src/debugger.ts +185 -0
  883. package/src/delegate.ts +78 -0
  884. package/src/doc-extractor.ts +255 -0
  885. package/src/doc-renderer.ts +131 -0
  886. package/src/echo-server-demo.fl +17 -0
  887. package/src/error-formatter.ts +369 -0
  888. package/src/error-system.ts +88 -0
  889. package/src/errors.ts +281 -0
  890. package/src/ethics-check.ts +408 -0
  891. package/src/eval-ai-blocks.ts +182 -0
  892. package/src/eval-ai-handlers.ts +132 -0
  893. package/src/eval-builtins-ai.ts +1659 -0
  894. package/src/eval-builtins.ts +5956 -0
  895. package/src/eval-call-function.ts +665 -0
  896. package/src/eval-infra-blocks.ts +450 -0
  897. package/src/eval-module-system.ts +286 -0
  898. package/src/eval-pattern-match.ts +289 -0
  899. package/src/eval-phase150.ts +87 -0
  900. package/src/eval-reasoning-sequence.ts +218 -0
  901. package/src/eval-special-forms.ts +2154 -0
  902. package/src/eval-style-blocks.ts +193 -0
  903. package/src/eval-type-classes.ts +148 -0
  904. package/src/evolve.ts +276 -0
  905. package/src/explain.ts +345 -0
  906. package/src/express-advanced.fl +78 -0
  907. package/src/express-auth.fl +118 -0
  908. package/src/express-cache.fl +118 -0
  909. package/src/express-chat.fl +81 -0
  910. package/src/express-example.fl +67 -0
  911. package/src/express-test.fl +331 -0
  912. package/src/express.fl +92 -0
  913. package/src/fitness.ts +238 -0
  914. package/src/fl-app-demo.fl +19 -0
  915. package/src/fl-files/fl-fmt.fl +29 -0
  916. package/src/fl-files/fl-lint.fl +61 -0
  917. package/src/fl-files/fl-test.fl +52 -0
  918. package/src/fl-http-demo.fl +19 -0
  919. package/src/fl-list-utils.fl +108 -0
  920. package/src/fl-math-lib.fl +14 -0
  921. package/src/fl-sdk.ts +154 -0
  922. package/src/fl-server-demo.fl +74 -0
  923. package/src/fl-str-utils.fl +29 -0
  924. package/src/fl-tutor.ts +126 -0
  925. package/src/formatter.ts +581 -0
  926. package/src/freelang-codegen.fl +904 -0
  927. package/src/freelang-interpreter.fl +483 -0
  928. package/src/freelang-lexer.fl +337 -0
  929. package/src/freelang-parser.fl +349 -0
  930. package/src/freelang-stdlib.fl +246 -0
  931. package/src/freelang-typechecker.fl +422 -0
  932. package/src/freelang-v9-complete.ts +474 -0
  933. package/src/generation.ts +201 -0
  934. package/src/gpt-mini-p3.fl +316 -0
  935. package/src/hot-reload.ts +235 -0
  936. package/src/http-server-runner.ts +89 -0
  937. package/src/hypothesis.ts +62 -0
  938. package/src/immutable.ts +140 -0
  939. package/src/interpreter-context.ts +87 -0
  940. package/src/interpreter-scope.ts +140 -0
  941. package/src/interpreter.ts +2351 -0
  942. package/src/lazy-seq.ts +134 -0
  943. package/src/learned-facts-store.ts +306 -0
  944. package/src/lexer.ts +359 -0
  945. package/src/lint-rules.ts +584 -0
  946. package/src/linter.ts +237 -0
  947. package/src/logger.ts +128 -0
  948. package/src/logging-deterministic.fl +138 -0
  949. package/src/lsp-server.ts +379 -0
  950. package/src/macro-expander.ts +195 -0
  951. package/src/maybe-chain.ts +108 -0
  952. package/src/maybe-type.ts +163 -0
  953. package/src/memory-system.ts +142 -0
  954. package/src/meta-reason.ts +93 -0
  955. package/src/multi-agent-hub.ts +247 -0
  956. package/src/multi-agent.ts +101 -0
  957. package/src/mutate.ts +226 -0
  958. package/src/negotiate.ts +55 -0
  959. package/src/optimizer.ts +277 -0
  960. package/src/orchestrate.ts +154 -0
  961. package/src/package-manager.ts +375 -0
  962. package/src/parser.ts +2722 -0
  963. package/src/peer-review.ts +53 -0
  964. package/src/predict.ts +365 -0
  965. package/src/profiler.ts +150 -0
  966. package/src/prompt-compiler.ts +123 -0
  967. package/src/protocol.ts +114 -0
  968. package/src/prune.ts +195 -0
  969. package/src/quality-loop.ts +105 -0
  970. package/src/rag.ts +81 -0
  971. package/src/reasoning-debugger.ts +122 -0
  972. package/src/refactor-self.ts +362 -0
  973. package/src/reflect.ts +186 -0
  974. package/src/repl.ts +323 -0
  975. package/src/result-type.ts +126 -0
  976. package/src/return-signal.ts +10 -0
  977. package/src/runtime-entry.ts +8 -0
  978. package/src/runtime-helpers.ts +234 -0
  979. package/src/self-evolution-hub.ts +431 -0
  980. package/src/self-improve.ts +107 -0
  981. package/src/source-map.ts +114 -0
  982. package/src/stdlib-agent.js +164 -0
  983. package/src/stdlib-agent.ts +225 -0
  984. package/src/stdlib-ai-native.ts +176 -0
  985. package/src/stdlib-ai-workflow.ts +308 -0
  986. package/src/stdlib-ai.ts +180 -0
  987. package/src/stdlib-async.ts +179 -0
  988. package/src/stdlib-audit.ts +94 -0
  989. package/src/stdlib-auth.ts +196 -0
  990. package/src/stdlib-bits.ts +86 -0
  991. package/src/stdlib-blog.ts +127 -0
  992. package/src/stdlib-browser.ts +239 -0
  993. package/src/stdlib-cache.ts +147 -0
  994. package/src/stdlib-capture-error.ts +183 -0
  995. package/src/stdlib-channel.ts +96 -0
  996. package/src/stdlib-checkpoint.js +109 -0
  997. package/src/stdlib-checkpoint.ts +97 -0
  998. package/src/stdlib-cloud.ts +317 -0
  999. package/src/stdlib-collection.ts +227 -0
  1000. package/src/stdlib-compile.ts +111 -0
  1001. package/src/stdlib-cron.ts +219 -0
  1002. package/src/stdlib-crypto-rsa.ts +82 -0
  1003. package/src/stdlib-crypto.js +203 -0
  1004. package/src/stdlib-crypto.ts +208 -0
  1005. package/src/stdlib-data.ts +614 -0
  1006. package/src/stdlib-db-query.ts +198 -0
  1007. package/src/stdlib-db.ts +185 -0
  1008. package/src/stdlib-distributed.ts +292 -0
  1009. package/src/stdlib-error.ts +90 -0
  1010. package/src/stdlib-fd.ts +130 -0
  1011. package/src/stdlib-feed.ts +171 -0
  1012. package/src/stdlib-file.ts +182 -0
  1013. package/src/stdlib-helpers.ts +273 -0
  1014. package/src/stdlib-http-macro.ts +178 -0
  1015. package/src/stdlib-http-server.ts +1229 -0
  1016. package/src/stdlib-http.ts +405 -0
  1017. package/src/stdlib-image.ts +92 -0
  1018. package/src/stdlib-kebab-aliases.ts +131 -0
  1019. package/src/stdlib-lazy-registry.ts +106 -0
  1020. package/src/stdlib-loader.ts +810 -0
  1021. package/src/stdlib-mail.ts +251 -0
  1022. package/src/stdlib-mariadb.ts +467 -0
  1023. package/src/stdlib-markdown.ts +227 -0
  1024. package/src/stdlib-matrix.ts +170 -0
  1025. package/src/stdlib-middleware.ts +221 -0
  1026. package/src/stdlib-module.ts +178 -0
  1027. package/src/stdlib-mongodb.ts +174 -0
  1028. package/src/stdlib-oci.ts +321 -0
  1029. package/src/stdlib-optional.ts +56 -0
  1030. package/src/stdlib-orm.ts +241 -0
  1031. package/src/stdlib-perf.ts +140 -0
  1032. package/src/stdlib-pg.ts +181 -0
  1033. package/src/stdlib-plot.ts +196 -0
  1034. package/src/stdlib-process.ts +120 -0
  1035. package/src/stdlib-property.ts +157 -0
  1036. package/src/stdlib-pubsub.ts +93 -0
  1037. package/src/stdlib-queue-helpers.ts +92 -0
  1038. package/src/stdlib-registry.ts +78 -0
  1039. package/src/stdlib-resource.ts +553 -0
  1040. package/src/stdlib-rest-crud.ts +146 -0
  1041. package/src/stdlib-service.ts +206 -0
  1042. package/src/stdlib-shell.ts +76 -0
  1043. package/src/stdlib-stats.ts +172 -0
  1044. package/src/stdlib-table.ts +200 -0
  1045. package/src/stdlib-test-enhanced.ts +76 -0
  1046. package/src/stdlib-test.ts +153 -0
  1047. package/src/stdlib-time.js +217 -0
  1048. package/src/stdlib-time.ts +282 -0
  1049. package/src/stdlib-timer.ts +134 -0
  1050. package/src/stdlib-totp.ts +110 -0
  1051. package/src/stdlib-type-predicates.ts +136 -0
  1052. package/src/stdlib-types.ts +107 -0
  1053. package/src/stdlib-validation.ts +248 -0
  1054. package/src/stdlib-verify.ts +181 -0
  1055. package/src/stdlib-webauthn.ts +192 -0
  1056. package/src/stdlib-workflow.js +715 -0
  1057. package/src/stdlib-workflow.ts +950 -0
  1058. package/src/stdlib-ws.ts +333 -0
  1059. package/src/stdlib-wsc.test.ts +122 -0
  1060. package/src/stdlib-wsc.ts +243 -0
  1061. package/src/storage-unified.fl +279 -0
  1062. package/src/streaming.ts +101 -0
  1063. package/src/struct-system.ts +104 -0
  1064. package/src/style-registry.ts +54 -0
  1065. package/src/swarm.ts +89 -0
  1066. package/src/tco.ts +31 -0
  1067. package/src/test-advanced-patterns.ts +211 -0
  1068. package/src/test-ast-debug.ts +20 -0
  1069. package/src/test-ast-helpers.ts +208 -0
  1070. package/src/test-async.ts +406 -0
  1071. package/src/test-bootstrap-self-compile.ts +449 -0
  1072. package/src/test-bootstrap-verification.ts +336 -0
  1073. package/src/test-composition.ts +206 -0
  1074. package/src/test-errors-phase6.ts +166 -0
  1075. package/src/test-extended-monads.ts +313 -0
  1076. package/src/test-field-parsing.ts +135 -0
  1077. package/src/test-first-class-functions.ts +257 -0
  1078. package/src/test-freelang-interpreter.ts +320 -0
  1079. package/src/test-freelang-lexer.ts +306 -0
  1080. package/src/test-freelang-parser.ts +268 -0
  1081. package/src/test-fullstack-core.ts +258 -0
  1082. package/src/test-fullstack-phase7-12.ts +305 -0
  1083. package/src/test-fullstack-practical.ts +338 -0
  1084. package/src/test-integration-stdlib.ts +195 -0
  1085. package/src/test-interpreter-phase6.ts +305 -0
  1086. package/src/test-lexer-comparison.ts +108 -0
  1087. package/src/test-lexer-phase6.ts +271 -0
  1088. package/src/test-modules.ts +325 -0
  1089. package/src/test-monad-laws.ts +383 -0
  1090. package/src/test-monads.ts +197 -0
  1091. package/src/test-p0-checkpoint.ts +304 -0
  1092. package/src/test-p0-conditional.ts +284 -0
  1093. package/src/test-p0-error-handling.ts +231 -0
  1094. package/src/test-p0-error-messages.ts +220 -0
  1095. package/src/test-p1-1-parallel-tasks.js +214 -0
  1096. package/src/test-parser-phase6.ts +222 -0
  1097. package/src/test-performance.ts +206 -0
  1098. package/src/test-phase10-data.ts +259 -0
  1099. package/src/test-phase10-file.ts +216 -0
  1100. package/src/test-phase100-stdlib-ai.ts +343 -0
  1101. package/src/test-phase101-memory.ts +309 -0
  1102. package/src/test-phase102-rag.ts +296 -0
  1103. package/src/test-phase103-multi-agent.ts +418 -0
  1104. package/src/test-phase104-try-reason.ts +459 -0
  1105. package/src/test-phase105-streaming.ts +287 -0
  1106. package/src/test-phase106-quality.ts +397 -0
  1107. package/src/test-phase107-tutor.ts +305 -0
  1108. package/src/test-phase108-debugger.ts +316 -0
  1109. package/src/test-phase109-prompt-compiler.ts +333 -0
  1110. package/src/test-phase11-12-complete.ts +275 -0
  1111. package/src/test-phase11-error.ts +192 -0
  1112. package/src/test-phase110-sdk.ts +320 -0
  1113. package/src/test-phase111-hypothesis.ts +380 -0
  1114. package/src/test-phase112-maybe-chain.ts +313 -0
  1115. package/src/test-phase113-debate.ts +364 -0
  1116. package/src/test-phase114-checkpoint.ts +348 -0
  1117. package/src/test-phase115-meta-reason.ts +277 -0
  1118. package/src/test-phase116-belief.ts +275 -0
  1119. package/src/test-phase117-analogy.ts +325 -0
  1120. package/src/test-phase118-critique.ts +308 -0
  1121. package/src/test-phase119-compose.ts +434 -0
  1122. package/src/test-phase12-http-shell.ts +120 -0
  1123. package/src/test-phase120-cognitive.ts +297 -0
  1124. package/src/test-phase121-consensus.ts +404 -0
  1125. package/src/test-phase122-delegate.ts +411 -0
  1126. package/src/test-phase123-vote.ts +339 -0
  1127. package/src/test-phase124-negotiate.ts +403 -0
  1128. package/src/test-phase125-swarm.ts +321 -0
  1129. package/src/test-phase126-orchestrate.ts +343 -0
  1130. package/src/test-phase127-peer-review.ts +279 -0
  1131. package/src/test-phase128-chain-agents.ts +456 -0
  1132. package/src/test-phase129-compete.ts +256 -0
  1133. package/src/test-phase13-data.ts +223 -0
  1134. package/src/test-phase130-hub.ts +390 -0
  1135. package/src/test-phase131-evolve.ts +536 -0
  1136. package/src/test-phase132-mutate.ts +268 -0
  1137. package/src/test-phase133-crossover.ts +289 -0
  1138. package/src/test-phase134-fitness.ts +306 -0
  1139. package/src/test-phase135-generation.ts +328 -0
  1140. package/src/test-phase136-prune.ts +228 -0
  1141. package/src/test-phase137-refactor-self.ts +354 -0
  1142. package/src/test-phase138-benchmark-self.ts +325 -0
  1143. package/src/test-phase139-version-self.ts +278 -0
  1144. package/src/test-phase14-collection.ts +254 -0
  1145. package/src/test-phase140-self-evolution.ts +410 -0
  1146. package/src/test-phase141-world-model.ts +387 -0
  1147. package/src/test-phase142-causal.ts +384 -0
  1148. package/src/test-phase143-counterfactual.ts +280 -0
  1149. package/src/test-phase144-predict.ts +312 -0
  1150. package/src/test-phase145-explain.ts +287 -0
  1151. package/src/test-phase146-align.ts +439 -0
  1152. package/src/test-phase147-ethics-check.ts +399 -0
  1153. package/src/test-phase148-curiosity.ts +247 -0
  1154. package/src/test-phase149-wisdom.ts +758 -0
  1155. package/src/test-phase15-agent.ts +320 -0
  1156. package/src/test-phase150-complete.ts +481 -0
  1157. package/src/test-phase16-time.ts +292 -0
  1158. package/src/test-phase17-crypto.ts +312 -0
  1159. package/src/test-phase18-integration.ts +429 -0
  1160. package/src/test-phase19-resource.ts +214 -0
  1161. package/src/test-phase20-server-db.ts +160 -0
  1162. package/src/test-phase21-ws-auth-cache-pubsub.ts +212 -0
  1163. package/src/test-phase22-process.ts +166 -0
  1164. package/src/test-phase23-selfhosting.ts +383 -0
  1165. package/src/test-phase24-codegen.ts +236 -0
  1166. package/src/test-phase25-bootstrap.ts +227 -0
  1167. package/src/test-phase26-map-filter-reduce.ts +282 -0
  1168. package/src/test-phase27-stdlib-codegen.ts +325 -0
  1169. package/src/test-phase28-loop-recur.ts +182 -0
  1170. package/src/test-phase29-import.ts +165 -0
  1171. package/src/test-phase3-web-server.ts +234 -0
  1172. package/src/test-phase30-selfcompile.ts +254 -0
  1173. package/src/test-phase31-gen2-lexer.ts +251 -0
  1174. package/src/test-phase33-gen3-bootstrap.ts +323 -0
  1175. package/src/test-phase34-parser-tco.ts +268 -0
  1176. package/src/test-phase35-error-messages.ts +280 -0
  1177. package/src/test-phase36-sourcemap.ts +240 -0
  1178. package/src/test-phase37-variadic.ts +228 -0
  1179. package/src/test-phase38-destructuring.ts +261 -0
  1180. package/src/test-phase39-do-block.ts +288 -0
  1181. package/src/test-phase40-const-fold.ts +249 -0
  1182. package/src/test-phase41-repl.ts +312 -0
  1183. package/src/test-phase42-watch.ts +314 -0
  1184. package/src/test-phase43-format.ts +377 -0
  1185. package/src/test-phase44-check.ts +505 -0
  1186. package/src/test-phase45-interpreter.ts +367 -0
  1187. package/src/test-phase46-match.ts +390 -0
  1188. package/src/test-phase47-file-io.ts +338 -0
  1189. package/src/test-phase48-types.ts +308 -0
  1190. package/src/test-phase49-stdlib.ts +365 -0
  1191. package/src/test-phase5-week1.ts +160 -0
  1192. package/src/test-phase50-fl-server.ts +159 -0
  1193. package/src/test-phase51-transformer.ts +152 -0
  1194. package/src/test-phase52-import.ts +161 -0
  1195. package/src/test-phase53-training.ts +122 -0
  1196. package/src/test-phase54-fl-utils.ts +122 -0
  1197. package/src/test-phase55-http-client.ts +182 -0
  1198. package/src/test-phase56-lexical-scope.ts +230 -0
  1199. package/src/test-phase58-module-refactor.ts +298 -0
  1200. package/src/test-phase59-errors.ts +226 -0
  1201. package/src/test-phase6-compile.ts +227 -0
  1202. package/src/test-phase60-types.ts +457 -0
  1203. package/src/test-phase61-tco.ts +209 -0
  1204. package/src/test-phase63-macros.ts +191 -0
  1205. package/src/test-phase64-protocols.ts +451 -0
  1206. package/src/test-phase65-patterns.ts +301 -0
  1207. package/src/test-phase66-structs.ts +215 -0
  1208. package/src/test-phase67-concurrency.ts +348 -0
  1209. package/src/test-phase68-pipeline.ts +209 -0
  1210. package/src/test-phase69-lazy.ts +237 -0
  1211. package/src/test-phase7-registry.ts +236 -0
  1212. package/src/test-phase70-immutable.ts +488 -0
  1213. package/src/test-phase71-ai-native.ts +252 -0
  1214. package/src/test-phase72-integration.ts +533 -0
  1215. package/src/test-phase73-formatter.ts +361 -0
  1216. package/src/test-phase74-linter.ts +565 -0
  1217. package/src/test-phase75-repl.ts +227 -0
  1218. package/src/test-phase76-testrunner.ts +439 -0
  1219. package/src/test-phase77-doc.ts +416 -0
  1220. package/src/test-phase78-debugger.ts +370 -0
  1221. package/src/test-phase79-watch.ts +224 -0
  1222. package/src/test-phase8-oci.ts +264 -0
  1223. package/src/test-phase80-ci.ts +282 -0
  1224. package/src/test-phase81-pkg.ts +383 -0
  1225. package/src/test-phase82-profiler.ts +336 -0
  1226. package/src/test-phase83-vm.ts +318 -0
  1227. package/src/test-phase84-optimizer.ts +424 -0
  1228. package/src/test-phase85-codegen.ts +380 -0
  1229. package/src/test-phase86-lsp.ts +533 -0
  1230. package/src/test-phase87-packages.ts +277 -0
  1231. package/src/test-phase88-selfhost.ts +412 -0
  1232. package/src/test-phase89-bench.ts +361 -0
  1233. package/src/test-phase9-flnext-v2.ts +372 -0
  1234. package/src/test-phase9-learn.ts +241 -0
  1235. package/src/test-phase9-reasoning.ts +312 -0
  1236. package/src/test-phase9-search.ts +212 -0
  1237. package/src/test-phase90-release.ts +365 -0
  1238. package/src/test-phase91-maybe.ts +257 -0
  1239. package/src/test-phase92-cot.ts +438 -0
  1240. package/src/test-phase93-tot.ts +462 -0
  1241. package/src/test-phase94-reflect.ts +498 -0
  1242. package/src/test-phase95-context.ts +268 -0
  1243. package/src/test-phase96-errors.ts +296 -0
  1244. package/src/test-phase97-tools.ts +344 -0
  1245. package/src/test-phase98-agent.ts +370 -0
  1246. package/src/test-phase99-self-improve.ts +394 -0
  1247. package/src/test-phase9a-websearch.ts +283 -0
  1248. package/src/test-phase9ab-integration.ts +140 -0
  1249. package/src/test-phase9b-persistence.ts +448 -0
  1250. package/src/test-phase9c-conditional.ts +251 -0
  1251. package/src/test-phase9c-extension.ts +270 -0
  1252. package/src/test-phase9c-feedback.ts +263 -0
  1253. package/src/test-phase9c-loop.ts +239 -0
  1254. package/src/test-selfhosting-sh1.ts +41 -0
  1255. package/src/test-selfhosting-sh2.ts +84 -0
  1256. package/src/test-selfhosting-sh3.ts +61 -0
  1257. package/src/test-selfhosting-sh4.ts +65 -0
  1258. package/src/test-type-classes-dispatch.ts +202 -0
  1259. package/src/test-type-classes.ts +320 -0
  1260. package/src/test-type-inference.ts +464 -0
  1261. package/src/test-typeclass-parsing-final.ts +218 -0
  1262. package/src/test-typeclass-parsing.ts +264 -0
  1263. package/src/todo-server-30116.ts +53 -0
  1264. package/src/token.ts +130 -0
  1265. package/src/tool-registry.ts +195 -0
  1266. package/src/tot.ts +258 -0
  1267. package/src/try-reason.ts +109 -0
  1268. package/src/type-check-static.ts +417 -0
  1269. package/src/type-checker.ts +245 -0
  1270. package/src/type-inference.ts +271 -0
  1271. package/src/type-system.ts +169 -0
  1272. package/src/version-self.ts +219 -0
  1273. package/src/vm-eligible.ts +106 -0
  1274. package/src/vm.ts +219 -0
  1275. package/src/vote.ts +127 -0
  1276. package/src/vpm/checksum-test.fl +193 -0
  1277. package/src/vpm/checksum.fl +219 -0
  1278. package/src/vpm/error-test.fl +211 -0
  1279. package/src/vpm/error.fl +218 -0
  1280. package/src/vpm/lock-file.fl +380 -0
  1281. package/src/vpm/logging-test.fl +194 -0
  1282. package/src/vpm/logging.fl +294 -0
  1283. package/src/vpm/resolver-test.fl +117 -0
  1284. package/src/vpm/resolver.fl +618 -0
  1285. package/src/vpm/semver-test.fl +180 -0
  1286. package/src/vpm/semver.fl +143 -0
  1287. package/src/vpm-cli.ts +1955 -0
  1288. package/src/web/app-router.ts +286 -0
  1289. package/src/web/fl-executor.ts +655 -0
  1290. package/src/web/image-optimizer.ts +206 -0
  1291. package/src/web/index.ts +14 -0
  1292. package/src/web/page-renderer.ts +287 -0
  1293. package/src/web/server.ts +553 -0
  1294. package/src/web-search-adapter.ts +348 -0
  1295. package/src/wisdom.ts +441 -0
  1296. package/src/world-model.ts +348 -0
  1297. package/stdlib/cache.fl +42 -0
  1298. package/stdlib/csv.fl +38 -0
  1299. package/stdlib/date-ext.fl +68 -0
  1300. package/stdlib/log.fl +44 -0
  1301. package/stdlib/math-ext.fl +57 -0
  1302. package/stdlib/number-ext.fl +47 -0
  1303. package/stdlib/queue.fl +57 -0
  1304. package/stdlib/string-ext.fl +45 -0
  1305. package/stdlib/validate.fl +123 -0
  1306. package/stdlib/web/components.fl +125 -0
  1307. package/stdlib/web/csrf.fl +61 -0
  1308. package/stdlib/web/format.fl +75 -0
  1309. package/stdlib/web/forms.fl +94 -0
  1310. package/stdlib/web/image.fl +77 -0
  1311. package/stdlib/web/metadata.fl +85 -0
  1312. package/stdlib/web/pagination.fl +62 -0
  1313. package/stdlib/web/state.fl +167 -0
  1314. package/stdlib/web/styles.fl +68 -0
  1315. package/stdlib/web/toast.fl +62 -0
  1316. package/stdlib/web/v9-stdlib-dom.fl +92 -0
  1317. package/stdlib/web/v9-stdlib-fetch.fl +90 -0
  1318. package/stdlib/web/v9-stdlib-storage.fl +70 -0
  1319. package/stdlib/web/v9-stdlib-ui.fl +115 -0
  1320. package/stdlib/web/ws-client.fl +125 -0
  1321. package/tests/.v11-backup/test-migrate-sample.fl +22 -0
  1322. package/tests/PHASE-C-VERIFICATION-REPORT.md +125 -0
  1323. package/tests/benchmark-v11.1.js +103 -0
  1324. package/tests/evidence/01-about.html +1 -0
  1325. package/tests/evidence/02-post-hello.html +1 -0
  1326. package/tests/evidence/02-post-world.html +1 -0
  1327. package/tests/evidence/03-home.html +1 -0
  1328. package/tests/evidence/04-dist/404.html +1 -0
  1329. package/tests/evidence/04-dist/about/index.html +1 -0
  1330. package/tests/evidence/04-dist/index.html +1 -0
  1331. package/tests/evidence/04-dist/post/hello/index.html +1 -0
  1332. package/tests/evidence/04-dist/post/world/index.html +1 -0
  1333. package/tests/evidence/05-dist/404.html +1 -0
  1334. package/tests/evidence/05-dist/about/index.html +1 -0
  1335. package/tests/evidence/05-dist/index.html +1 -0
  1336. package/tests/evidence/05-dist/post/hello/index.html +1 -0
  1337. package/tests/evidence/05-dist/post/world/index.html +1 -0
  1338. package/tests/evidence/06-dist/404.html +1 -0
  1339. package/tests/evidence/06-dist/about/index.html +1 -0
  1340. package/tests/evidence/06-dist/index.html +1 -0
  1341. package/tests/evidence/06-dist/post/hello/index.html +1 -0
  1342. package/tests/evidence/06-dist/post/world/index.html +1 -0
  1343. package/tests/evidence/07-markdown.html +1 -0
  1344. package/tests/evidence/08-rss.xml +25 -0
  1345. package/tests/evidence/09-robots.txt +4 -0
  1346. package/tests/evidence/09-sitemap.xml +12 -0
  1347. package/tests/evidence/10-jsonld.html +1 -0
  1348. package/tests/evidence/_results.txt +11 -0
  1349. package/tests/evidence/about.html +1 -0
  1350. package/tests/evidence/home.html +1 -0
  1351. package/tests/evidence/missing.html +42 -0
  1352. package/tests/evidence/post-hello.html +1 -0
  1353. package/tests/evidence/post-world.html +1 -0
  1354. package/tests/fixtures/basic-app/about/page.fl +1 -0
  1355. package/tests/fixtures/basic-app/api/echo/route.fl +5 -0
  1356. package/tests/fixtures/basic-app/layout.fl +1 -0
  1357. package/tests/fixtures/basic-app/not-found.fl +1 -0
  1358. package/tests/fixtures/basic-app/page.fl +1 -0
  1359. package/tests/fixtures/basic-app/post/[slug]/generate-static-params.fl +1 -0
  1360. package/tests/fixtures/basic-app/post/[slug]/page.fl +1 -0
  1361. package/tests/fixtures/stdlib-probes/blog.fl +6 -0
  1362. package/tests/fixtures/stdlib-probes/jsonld.fl +1 -0
  1363. package/tests/fixtures/stdlib-probes/map-probe.fl +3 -0
  1364. package/tests/fixtures/stdlib-probes/map-shape.fl +2 -0
  1365. package/tests/fixtures/stdlib-probes/md.fl +1 -0
  1366. package/tests/fixtures/stdlib-probes/robots.fl +1 -0
  1367. package/tests/fixtures/stdlib-probes/rss.fl +4 -0
  1368. package/tests/fixtures/stdlib-probes/sitemap.fl +1 -0
  1369. package/tests/l2/case-01-arithmetic.fl +6 -0
  1370. package/tests/l2/case-02-comparisons.fl +15 -0
  1371. package/tests/l2/case-03-logic.fl +15 -0
  1372. package/tests/l2/case-04-control-flow.fl +15 -0
  1373. package/tests/l2/case-05-functions.fl +13 -0
  1374. package/tests/l2/case-06-collections.fl +14 -0
  1375. package/tests/l2/case-07-pattern-matching.fl +14 -0
  1376. package/tests/l2/case-08-recursion.fl +19 -0
  1377. package/tests/l2/case-09-strings.fl +13 -0
  1378. package/tests/l2/case-10-loops.fl +17 -0
  1379. package/tests/l2/case-11-higher-order.fl +13 -0
  1380. package/tests/l2/case-12-edge-cases.fl +14 -0
  1381. package/tests/l2/case-13-ai-vector.fl +22 -0
  1382. package/tests/l2/case-14-ai-cosine.fl +25 -0
  1383. package/tests/l2/case-15-ai-template.fl +22 -0
  1384. package/tests/l2/case-16-ai-ranking.fl +20 -0
  1385. package/tests/l2/case-17-stdlib-extended.fl +32 -0
  1386. package/tests/l2-proof/01-arithmetic.bootstrap.js +141 -0
  1387. package/tests/l2-proof/01-arithmetic.fl +15 -0
  1388. package/tests/l2-proof/01-arithmetic.stage1.js +141 -0
  1389. package/tests/l2-proof/02-comparisons.bootstrap.js +141 -0
  1390. package/tests/l2-proof/02-comparisons.fl +17 -0
  1391. package/tests/l2-proof/03-logic.bootstrap.js +141 -0
  1392. package/tests/l2-proof/03-logic.fl +15 -0
  1393. package/tests/l2-proof/04-control-flow.bootstrap.js +146 -0
  1394. package/tests/l2-proof/04-control-flow.fl +24 -0
  1395. package/tests/l2-proof/05-functions.bootstrap.js +143 -0
  1396. package/tests/l2-proof/05-functions.fl +16 -0
  1397. package/tests/l2-proof/06-collections.bootstrap.js +146 -0
  1398. package/tests/l2-proof/06-collections.fl +27 -0
  1399. package/tests/l2-proof/07-pattern-matching.bootstrap.js +142 -0
  1400. package/tests/l2-proof/07-pattern-matching.fl +23 -0
  1401. package/tests/l2-proof/08-async-errors.bootstrap.js +142 -0
  1402. package/tests/l2-proof/08-async-errors.fl +17 -0
  1403. package/tests/l2-proof/09-strings.bootstrap.js +141 -0
  1404. package/tests/l2-proof/09-strings.fl +13 -0
  1405. package/tests/l2-proof/10-type-checks.bootstrap.js +141 -0
  1406. package/tests/l2-proof/10-type-checks.fl +17 -0
  1407. package/tests/l2-proof/11-recursion.bootstrap.js +143 -0
  1408. package/tests/l2-proof/11-recursion.fl +21 -0
  1409. package/tests/l2-proof/12-edge-cases.bootstrap.js +141 -0
  1410. package/tests/l2-proof/12-edge-cases.fl +17 -0
  1411. package/tests/parity/01-app-router-static.sh +18 -0
  1412. package/tests/parity/02-app-router-dynamic.sh +18 -0
  1413. package/tests/parity/03-layout-children.sh +17 -0
  1414. package/tests/parity/04-not-found.sh +22 -0
  1415. package/tests/parity/05-ssg.sh +21 -0
  1416. package/tests/parity/06-parallel-render.sh +21 -0
  1417. package/tests/parity/07-markdown.sh +16 -0
  1418. package/tests/parity/08-rss-atom.sh +18 -0
  1419. package/tests/parity/09-sitemap-robots.sh +23 -0
  1420. package/tests/parity/10-jsonld.sh +16 -0
  1421. package/tests/parity/11-blog-helpers.sh +28 -0
  1422. package/tests/parity/12-api-routes.sh +25 -0
  1423. package/tests/parity/_lib.sh +53 -0
  1424. package/tests/parity/run-all.sh +89 -0
  1425. package/tests/parity/score.sh +20 -0
  1426. package/tests/phase-c-fuzzing.fl +89 -0
  1427. package/tests/phase-c-property-testing.fl +137 -0
  1428. package/tests/phase-c-sha-verification.fl +117 -0
  1429. package/tests/phase-c-validation.fl +194 -0
  1430. package/tests/property-testing.sh +47 -0
  1431. package/tests/regen/let-in-expr-01.fl +5 -0
  1432. package/tests/regen/let-in-expr-02.fl +6 -0
  1433. package/tests/regen/let-in-expr-03.fl +4 -0
  1434. package/tests/regen/let-in-expr-04.fl +6 -0
  1435. package/tests/regen/let-in-expr-05.fl +5 -0
  1436. package/tests/test-ai-library.fl +36 -0
  1437. package/tests/test-andor.fl +2 -0
  1438. package/tests/test-bootstrap-match.fl +5 -0
  1439. package/tests/test-cg-final.fl +5 -0
  1440. package/tests/test-cli.fl +19 -0
  1441. package/tests/test-codegen.fl +4 -0
  1442. package/tests/test-cond-flat.fl +1 -0
  1443. package/tests/test-fl-exec-op.fl +1 -0
  1444. package/tests/test-fp.fl +10 -0
  1445. package/tests/test-funcs.fl +11 -0
  1446. package/tests/test-fuzz-crash.fl +3 -0
  1447. package/tests/test-http-get.fl +3 -0
  1448. package/tests/test-json-load.fl +32 -0
  1449. package/tests/test-let-flat.fl +2 -0
  1450. package/tests/test-let-order.fl +3 -0
  1451. package/tests/test-let-simple.fl +3 -0
  1452. package/tests/test-let-syntax.fl +2 -0
  1453. package/tests/test-let.fl +3 -0
  1454. package/tests/test-lex-debug.fl +75 -0
  1455. package/tests/test-loop-bug.fl +5 -0
  1456. package/tests/test-map-entries.fl +1 -0
  1457. package/tests/test-map-pattern.fl +3 -0
  1458. package/tests/test-match-syntax.fl +5 -0
  1459. package/tests/test-migrate-sample.fl +22 -0
  1460. package/tests/test-neg.fl +1 -0
  1461. package/tests/test-nested-let.fl +4 -0
  1462. package/tests/test-node-to-pattern.fl +8 -0
  1463. package/tests/test-quant-lib.fl +114 -0
  1464. package/tests/test-reduce.fl +10 -0
  1465. package/tests/test-server.fl +3 -0
  1466. package/tests/test-simple-map.fl +4 -0
  1467. package/tests/test-simple-match.fl +3 -0
  1468. package/tests/test-simple.fl +1 -0
  1469. package/tests/test-try-bootstrap.fl +7 -0
  1470. package/tests/test-try-catch.fl +3 -0
  1471. package/tests/test-watchdog-lib.fl +69 -0
  1472. package/tests/test-which-lex.fl +4 -0
  1473. package/tsconfig.json +39 -0
@@ -0,0 +1,1423 @@
1
+ ; self/all.fl — Phase 28 (AUTO-GENERATED)
2
+ ; $(date)
3
+
4
+ ;; self/lexer.fl — FL 로 작성된 Lexer (Phase 01, [FUNC] 블록 버전)
5
+ ;;
6
+ ;; v11 defn 이 forward-ref 를 지원하지 않아 [FUNC] 블록 사용.
7
+ ;; [FUNC] 는 2-pass 등록이라 상호재귀 허용.
8
+ ;;
9
+ ;; 입력: source string
10
+ ;; 출력: tokens list. 각 토큰 = {:kind :value :line :col}
11
+ ;;
12
+ ;; 토큰 종류: LParen / RParen / LBracket / RBracket / LBrace / RBrace
13
+ ;; / Number / String / Symbol / Variable / Keyword
14
+ ;; / Unknown / (comment 는 drop)
15
+ ;; ──────────────────────────────────────
16
+ ;; char predicates
17
+ ;; ──────────────────────────────────────
18
+ [FUNC is-digit? :params [c]
19
+ :body (if (null? c) false (and (>= c "0") (<= c "9")))]
20
+ [FUNC is-alpha? :params [c]
21
+ :body (if (null? c) false
22
+ (or (and (>= c "a") (<= c "z"))
23
+ (and (>= c "A") (<= c "Z"))))]
24
+ [FUNC is-alnum? :params [c] :body (or (is-digit? c) (is-alpha? c))]
25
+ [FUNC is-space? :params [c]
26
+ :body (or (= c " ") (= c "\t") (= c "\n") (= c "\r"))]
27
+ [FUNC is-symbol-char? :params [c]
28
+ :body (if (null? c) false
29
+ (or (is-alnum? c)
30
+ (= c "-") (= c "_") (= c "?") (= c "!")
31
+ (= c "/") (= c ".") (= c "<") (= c ">")
32
+ (= c "=") (= c "+") (= c "*") (= c "%")
33
+ (= c "&") (= c "|") (= c "^") (= c "~")))]
34
+ ;; ──────────────────────────────────────
35
+ ;; state = {:src :idx :line :col :tokens}
36
+ ;; ──────────────────────────────────────
37
+ [FUNC make-state :params [src]
38
+ :body {:src src :idx 0 :line 1 :col 1 :tokens []}]
39
+ [FUNC peek-at :params [st offset]
40
+ :body (let [[src (get st :src)]
41
+ [i (+ (get st :idx) offset)]]
42
+ (if (>= i (length src)) null (char-at src i)))]
43
+ [FUNC peek :params [st] :body (peek-at st 0)]
44
+ [FUNC at-end? :params [st]
45
+ :body (>= (get st :idx) (length (get st :src)))]
46
+ [FUNC advance :params [st]
47
+ :body (let [[c (peek st)]]
48
+ (if (= c "\n")
49
+ {:src (get st :src) :idx (+ (get st :idx) 1)
50
+ :line (+ (get st :line) 1) :col 1
51
+ :tokens (get st :tokens)}
52
+ {:src (get st :src) :idx (+ (get st :idx) 1)
53
+ :line (get st :line) :col (+ (get st :col) 1)
54
+ :tokens (get st :tokens)}))]
55
+ [FUNC emit :params [st kind value sl sc]
56
+ :body {:src (get st :src) :idx (get st :idx)
57
+ :line (get st :line) :col (get st :col)
58
+ :tokens (append (get st :tokens)
59
+ (list {:kind kind :type kind :value value :line sl :col sc}))}]
60
+ ;; ──────────────────────────────────────
61
+ ;; 스킵 (whitespace + ; line comment)
62
+ ;; ──────────────────────────────────────
63
+ [FUNC skip-comment :params [st]
64
+ :body (if (at-end? st) st
65
+ (let [[c (peek st)]]
66
+ (if (= c "\n") (advance st) (skip-comment (advance st)))))]
67
+ [FUNC skip-ws :params [st]
68
+ :body (if (at-end? st) st
69
+ (let [[c (peek st)]]
70
+ (cond
71
+ [(is-space? c) (skip-ws (advance st))]
72
+ [(= c ";") (skip-ws (skip-comment st))]
73
+ [true st])))]
74
+ ;; ──────────────────────────────────────
75
+ ;; 숫자 (정수/실수/음수)
76
+ ;; ──────────────────────────────────────
77
+ [FUNC read-number-body :params [st acc has-dot line col]
78
+ :body (if (at-end? st) (emit st "Number" acc line col)
79
+ (let [[c (peek st)]]
80
+ (cond
81
+ [(is-digit? c)
82
+ (read-number-body (advance st) (str acc c) has-dot line col)]
83
+ [(and (= c ".") (not has-dot))
84
+ (read-number-body (advance st) (str acc c) true line col)]
85
+ [true (emit st "Number" acc line col)])))]
86
+ [FUNC read-number :params [st]
87
+ :body (read-number-body st "" false (get st :line) (get st :col))]
88
+ ;; ──────────────────────────────────────
89
+ ;; 문자열 (escape \n \t \r \" \\)
90
+ ;; ──────────────────────────────────────
91
+ [FUNC translate-esc :params [c]
92
+ :body (cond
93
+ [(= c "n") "\n"] [(= c "t") "\t"] [(= c "r") "\r"]
94
+ [(= c "\"") "\""] [(= c "\\") "\\"] [true c])]
95
+ [FUNC read-string-body :params [st acc line col]
96
+ :body (if (at-end? st) (emit st "String" acc line col)
97
+ (let [[c (peek st)]]
98
+ (cond
99
+ [(= c "\"") (emit (advance st) "String" acc line col)]
100
+ [(= c "\\")
101
+ (let [[st2 (advance st)] [c2 (peek st2)]]
102
+ (read-string-body (advance st2) (str acc (translate-esc c2)) line col))]
103
+ [true (read-string-body (advance st) (str acc c) line col)])))]
104
+ [FUNC read-string :params [st]
105
+ :body (let [[line (get st :line)] [col (get st :col)]
106
+ [st1 (advance st)]]
107
+ (read-string-body st1 "" line col))]
108
+ ;; ──────────────────────────────────────
109
+ ;; 심볼 / 변수 / 키워드 (모두 symbol-char 연속)
110
+ ;; ──────────────────────────────────────
111
+ [FUNC read-symbol-body-kind :params [st acc line col kind]
112
+ :body (if (at-end? st) (emit st kind acc line col)
113
+ (let [[c (peek st)]]
114
+ (if (is-symbol-char? c)
115
+ (read-symbol-body-kind (advance st) (str acc c) line col kind)
116
+ (emit st kind acc line col))))]
117
+ [FUNC read-symbol :params [st]
118
+ :body (read-symbol-body-kind st "" (get st :line) (get st :col) "Symbol")]
119
+ [FUNC read-variable :params [st]
120
+ :body (let [[line (get st :line)] [col (get st :col)]
121
+ [st1 (advance st)]]
122
+ (read-symbol-body-kind st1 "" line col "Variable"))]
123
+ [FUNC read-keyword :params [st]
124
+ :body (let [[line (get st :line)] [col (get st :col)]
125
+ [st1 (advance st)]]
126
+ (read-symbol-body-kind st1 "" line col "Keyword"))]
127
+ ;; ──────────────────────────────────────
128
+ ;; 토큰 하나 읽기
129
+ ;; ──────────────────────────────────────
130
+ [FUNC read-token :params [st]
131
+ :body (let [[st1 (skip-ws st)]]
132
+ (if (at-end? st1) st1
133
+ (let [[c (peek st1)] [line (get st1 :line)] [col (get st1 :col)]]
134
+ (cond
135
+ [(= c "(") (emit (advance st1) "LParen" c line col)]
136
+ [(= c ")") (emit (advance st1) "RParen" c line col)]
137
+ [(= c "[") (emit (advance st1) "LBracket" c line col)]
138
+ [(= c "]") (emit (advance st1) "RBracket" c line col)]
139
+ [(= c "{") (emit (advance st1) "LBrace" c line col)]
140
+ [(= c "}") (emit (advance st1) "RBrace" c line col)]
141
+ [(= c "\"") (read-string st1)]
142
+ [(= c "$") (read-variable st1)]
143
+ [(= c ":") (read-keyword st1)]
144
+ [(is-digit? c) (read-number st1)]
145
+ [(and (= c "-") (is-digit? (peek-at st1 1)))
146
+ (read-number-body (advance st1) "-" false line col)]
147
+ [(is-symbol-char? c) (read-symbol st1)]
148
+ [true (emit (advance st1) "Unknown" c line col)]))))]
149
+ ;; ──────────────────────────────────────
150
+ ;; 메인 루프 — 모든 토큰 수집
151
+ ;; ──────────────────────────────────────
152
+ [FUNC lex-loop :params [st]
153
+ :body (let [[st1 (skip-ws st)]]
154
+ (if (at-end? st1)
155
+ (get st1 :tokens)
156
+ (lex-loop (read-token st1))))]
157
+ [FUNC lex :params [src] :body (lex-loop (make-state src))]
158
+ ;; self/ast.fl — AST 노드 생성자 (Phase 02/21-30)
159
+ ;;
160
+ ;; v11 src/ast.ts (806 줄, 25+ 노드) 의 FL 재작성.
161
+ ;; 모든 노드는 plain map: {:kind "..." ...필드}
162
+ ;; 생성자는 [FUNC make-xxx :params [...] :body {:kind ...}]
163
+ ;; ──────────────────────────────────────
164
+ ;; 21 기본 원자 (Literal/Variable/Keyword/SExpr)
165
+ ;; ──────────────────────────────────────
166
+ [FUNC make-literal :params [type value line]
167
+ :body {:kind "literal" :type type :value value :line line}]
168
+ [FUNC make-variable :params [name line]
169
+ :body {:kind "variable" :name name :line line}]
170
+ [FUNC make-keyword :params [name line]
171
+ :body {:kind "keyword" :name name :line line}]
172
+ [FUNC make-sexpr :params [op args line]
173
+ :body {:kind "sexpr" :op op :args args :line line}]
174
+ ;; ──────────────────────────────────────
175
+ ;; 22 SExpr 편의 + 원시값 래퍼
176
+ ;; ──────────────────────────────────────
177
+ [FUNC make-number :params [v line]
178
+ :body (make-literal "number" v line)]
179
+ [FUNC make-string :params [v line]
180
+ :body (make-literal "string" v line)]
181
+ [FUNC make-bool :params [v line]
182
+ :body (make-literal "boolean" v line)]
183
+ [FUNC make-null :params [line]
184
+ :body (make-literal "null" null line)]
185
+ [FUNC make-symbol :params [v line]
186
+ :body (make-literal "symbol" v line)]
187
+ ;; ──────────────────────────────────────
188
+ ;; 23 Block (Array/Map/Named)
189
+ ;; fields 는 items(list) 또는 named map. block 의 type 으로 구분.
190
+ ;; ──────────────────────────────────────
191
+ [FUNC make-block :params [type name fields line]
192
+ :body {:kind "block" :type type :name name :fields fields :line line}]
193
+ [FUNC make-array-block :params [items line]
194
+ :body (make-block "Array" null {:items items} line)]
195
+ [FUNC make-map-block :params [items line]
196
+ :body (make-block "Map" null {:items items} line)]
197
+ ;; ──────────────────────────────────────
198
+ ;; 24 Pattern 7종
199
+ ;; ──────────────────────────────────────
200
+ [FUNC make-pattern-literal :params [value line]
201
+ :body {:kind "pattern-literal" :value value :line line}]
202
+ [FUNC make-pattern-variable :params [name line]
203
+ :body {:kind "pattern-variable" :name name :line line}]
204
+ [FUNC make-pattern-wildcard :params [line]
205
+ :body {:kind "pattern-wildcard" :line line}]
206
+ [FUNC make-pattern-list :params [items rest line]
207
+ :body {:kind "pattern-list" :items items :rest rest :line line}]
208
+ [FUNC make-pattern-struct :params [type-name fields line]
209
+ :body {:kind "pattern-struct" :type type-name :fields fields :line line}]
210
+ [FUNC make-pattern-or :params [alternatives line]
211
+ :body {:kind "pattern-or" :alternatives alternatives :line line}]
212
+ [FUNC make-pattern-range :params [start end line]
213
+ :body {:kind "pattern-range" :start start :end end :line line}]
214
+ ;; ──────────────────────────────────────
215
+ ;; 25 Pattern matching
216
+ ;; ──────────────────────────────────────
217
+ [FUNC make-pattern-match :params [value cases line]
218
+ :body {:kind "pattern-match" :value value :cases cases :line line}]
219
+ [FUNC make-match-case :params [pattern guard body line]
220
+ :body {:kind "match-case" :pattern pattern :guard guard :body body :line line}]
221
+ ;; ──────────────────────────────────────
222
+ ;; 26 함수/타입
223
+ ;; ──────────────────────────────────────
224
+ [FUNC make-function-value :params [params body captured-env name]
225
+ :body {:kind "function-value" :params params :body body
226
+ :capturedEnv captured-env :name name}]
227
+ [FUNC make-type-class :params [name generics methods line]
228
+ :body {:kind "type-class" :name name :generics generics
229
+ :methods methods :line line}]
230
+ [FUNC make-type-class-instance :params [class-name type-name impls line]
231
+ :body {:kind "type-class-instance" :class class-name :type type-name
232
+ :impls impls :line line}]
233
+ ;; ──────────────────────────────────────
234
+ ;; 27 Module / Import
235
+ ;; ──────────────────────────────────────
236
+ [FUNC make-module-block :params [name exports body line]
237
+ :body {:kind "module" :name name :exports exports :body body :line line}]
238
+ [FUNC make-import-block :params [path alias names line]
239
+ :body {:kind "import" :path path :alias alias :names names :line line}]
240
+ [FUNC make-open-block :params [module-name line]
241
+ :body {:kind "open" :module module-name :line line}]
242
+ ;; ──────────────────────────────────────
243
+ ;; 28 AI 블록 (SearchBlock / LearnBlock / ReasoningBlock)
244
+ ;; ──────────────────────────────────────
245
+ [FUNC make-search-block :params [query fields line]
246
+ :body {:kind "search-block" :query query :fields fields :line line}]
247
+ [FUNC make-learn-block :params [topic fields line]
248
+ :body {:kind "learn-block" :topic topic :fields fields :line line}]
249
+ [FUNC make-reasoning-block :params [name fields line]
250
+ :body {:kind "reasoning-block" :name name :fields fields :line line}]
251
+ ;; ──────────────────────────────────────
252
+ ;; 29 Async / Try
253
+ ;; ──────────────────────────────────────
254
+ [FUNC make-async-function :params [name params body line]
255
+ :body {:kind "async-function" :name name :params params :body body :line line}]
256
+ [FUNC make-await :params [expr line]
257
+ :body {:kind "await" :expr expr :line line}]
258
+ [FUNC make-try :params [body catch finally line]
259
+ :body {:kind "try" :body body :catch catch :finally finally :line line}]
260
+ [FUNC make-catch :params [param body line]
261
+ :body {:kind "catch" :param param :body body :line line}]
262
+ [FUNC make-throw :params [expr line]
263
+ :body {:kind "throw" :expr expr :line line}]
264
+ [FUNC make-template-string :params [parts expressions line]
265
+ :body {:kind "template-string" :parts parts :expressions expressions :line line}]
266
+ ;; ──────────────────────────────────────
267
+ ;; 30 웹 노드 + deep-equal?
268
+ ;; ──────────────────────────────────────
269
+ [FUNC make-page :params [name path fields line]
270
+ :body {:kind "page" :name name :path path :fields fields :line line}]
271
+ [FUNC make-route :params [method path handler line]
272
+ :body {:kind "route" :method method :path path :handler handler :line line}]
273
+ [FUNC make-component :params [name fields line]
274
+ :body {:kind "component" :name name :fields fields :line line}]
275
+ [FUNC make-form :params [name fields line]
276
+ :body {:kind "form" :name name :fields fields :line line}]
277
+ ;; deep-equal? — 노드 비교 (line 무시)
278
+ ;; Map 이면 모든 키를 순회, list 면 원소별, 원시값은 =.
279
+ [FUNC deep-equal? :params [a b]
280
+ :body (cond
281
+ [(and (null? a) (null? b)) true]
282
+ [(or (null? a) (null? b)) false]
283
+ [(and (list? a) (list? b)) (deep-equal-list? a b 0)]
284
+ [(and (map? a) (map? b)) (deep-equal-map? a b)]
285
+ [true (= a b)])]
286
+ [FUNC deep-equal-list? :params [a b i]
287
+ :body (cond
288
+ [(not (= (length a) (length b))) false]
289
+ [(>= i (length a)) true]
290
+ [(not (deep-equal? (get a i) (get b i))) false]
291
+ [true (deep-equal-list? a b (+ i 1))])]
292
+ ;; Map 비교: :line 은 무시. keys 정렬 후 각 키의 값 비교.
293
+ [FUNC deep-equal-map? :params [a b]
294
+ :body (let [[ka (keys-no-line a)]
295
+ [kb (keys-no-line b)]]
296
+ (if (not (= (length ka) (length kb))) false
297
+ (deep-equal-map-keys? a b ka 0)))]
298
+ [FUNC keys-no-line :params [m]
299
+ :body (filter (fn [k] (not (= k "line"))) (json_keys m))]
300
+ [FUNC deep-equal-map-keys? :params [a b ks i]
301
+ :body (cond
302
+ [(>= i (length ks)) true]
303
+ [(let [[k (get ks i)]]
304
+ (not (deep-equal? (get a k) (get b k)))) false]
305
+ [true (deep-equal-map-keys? a b ks (+ i 1))])]
306
+ ;; 타입 감지 헬퍼 (FL 에 list?/map? 기본 없으면 대체)
307
+ [FUNC list? :params [v]
308
+ :body (if (null? v) false
309
+ (= (str-to-num (str "[" v)) null))] ;; 플레이스홀더. 실제로는 런타임이 Array 타입 제공 필요.
310
+ [FUNC map? :params [v]
311
+ :body (if (null? v) false
312
+ (not (null? (get v :kind))))] ;; kind 키가 있으면 AST map 으로 간주
313
+ ;; NOTE: list?/map? 의 robust 한 구현은 FL 런타임 지원 필요 (Phase 07 builtins/type 에서 교체).
314
+ ;; 현재는 AST 비교에 사용될 때만 동작하는 placeholder.
315
+ ;; self/parser.fl — FL 로 작성된 Parser (Phase 03/31-45)
316
+ ;;
317
+ ;; 입력: tokens (lexer 출력)
318
+ ;; 출력: AST nodes (list of ast nodes)
319
+ ;;
320
+ ;; 모든 함수 [FUNC] 블록. 파서 상태 = {:tokens :idx}.
321
+ ;; node 생성자는 self/ast.fl 정의 재사용. 테스트 단독 실행 위해 여기에도 복제.
322
+ ;; ──────────────────────────────────────
323
+ ;; AST 생성자 — self/ast.fl 에서 정의됨
324
+ ;; (모든 make-* 함수는 ast.fl 표준 정의 참조)
325
+ ;; ──────────────────────────────────────
326
+ ;; ──────────────────────────────────────
327
+ ;; 31 파서 상태 + peek/advance/expect
328
+ ;; ──────────────────────────────────────
329
+ [FUNC p-make :params [tokens]
330
+ :body {:tokens tokens :idx 0 :ast []}]
331
+ [FUNC p-peek :params [p]
332
+ :body (let [[i (get p :idx)] [t (get p :tokens)]]
333
+ (if (>= i (length t)) null (get t i)))]
334
+ [FUNC p-peek-at :params [p offset]
335
+ :body (let [[i (+ (get p :idx) offset)] [t (get p :tokens)]]
336
+ (if (>= i (length t)) null (get t i)))]
337
+ [FUNC p-end? :params [p]
338
+ :body (>= (get p :idx) (length (get p :tokens)))]
339
+ [FUNC p-advance :params [p]
340
+ :body {:tokens (get p :tokens) :idx (+ (get p :idx) 1) :ast (get p :ast)}]
341
+ [FUNC p-with-ast :params [p ast]
342
+ :body {:tokens (get p :tokens) :idx (get p :idx) :ast ast}]
343
+ [FUNC p-append-ast :params [p node]
344
+ :body (p-with-ast p (append (get p :ast) (list node)))]
345
+ ;; 2-tuple 반환용 map {:p p' :node n}
346
+ [FUNC r-pair :params [p node]
347
+ :body {:p p :node node}]
348
+ ;; ──────────────────────────────────────
349
+ ;; 32 parseAtom — number/string/symbol/keyword/variable
350
+ ;; ──────────────────────────────────────
351
+ [FUNC string-contains? :params [s substr]
352
+ :body (not (= -1 (str-index-of s substr)))]
353
+ [FUNC parse-atom :params [p]
354
+ :body (let [[t (p-peek p)] [k (get t :kind)] [v (get t :value)] [line (get t :line)]]
355
+ (cond
356
+ [(= k "Number")
357
+ (r-pair (p-advance p) (make-literal "number" v line))]
358
+ [(= k "String")
359
+ (if (string-contains? v "${")
360
+ (r-pair (p-advance p) (make-template-string v (list) line))
361
+ (r-pair (p-advance p) (make-literal "string" v line)))]
362
+ [(= k "Symbol")
363
+ (r-pair (p-advance p) (make-literal "symbol" v line))]
364
+ [(= k "Variable")
365
+ (r-pair (p-advance p) (make-variable v line))]
366
+ [(= k "Keyword")
367
+ (r-pair (p-advance p) (make-keyword v line))]
368
+ [true (r-pair (p-advance p) (make-literal "unknown" v line))]))]
369
+ ;; ──────────────────────────────────────
370
+ ;; 33 parse-expr — 단일 표현식 (atom 또는 S-expr/array/map/block)
371
+ ;; ──────────────────────────────────────
372
+ [FUNC parse-expr :params [p]
373
+ :body (let [[t (p-peek p)] [k (get t :kind)]]
374
+ (cond
375
+ [(= k "LParen") (parse-sexpr p)]
376
+ [(= k "LBracket") (parse-bracket p)]
377
+ [(= k "LBrace") (parse-map p)]
378
+ [true (parse-atom p)]))]
379
+ ;; ──────────────────────────────────────
380
+ ;; 33 parse-sexpr (parens)
381
+ ;; ──────────────────────────────────────
382
+ [FUNC parse-sexpr :params [p]
383
+ :body (let [[start-tok (p-peek p)] [line (get start-tok :line)]
384
+ [p1 (p-advance p)] ;; consume (
385
+ [first (parse-args p1 [])] ;; collect until )
386
+ [p2 (get first :p)] [args (get first :node)]]
387
+ (if (= (length args) 0)
388
+ (r-pair (parse-consume-rparen p2) (make-sexpr "" (list) line))
389
+ (let [[op-node (get args 0)]
390
+ [op (if (= (get op-node :kind) "literal")
391
+ (get op-node :value)
392
+ (if (= (get op-node :kind) "variable")
393
+ (str "$" (get op-node :name))
394
+ "unknown"))]
395
+ [rest (slice args 1 (length args))]]
396
+ (if (= op "try")
397
+ ;; try-catch-finally: (try body (catch param body) (finally body))
398
+ (let [[body (if (> (length rest) 0) (get rest 0) null)]
399
+ [catch-clause (if (> (length rest) 1) (get rest 1) null)]
400
+ [finally-clause (if (> (length rest) 2) (get rest 2) null)]]
401
+ (r-pair (parse-consume-rparen p2)
402
+ (make-try body catch-clause finally-clause line)))
403
+ (r-pair (parse-consume-rparen p2)
404
+ (make-sexpr op rest line))))))]
405
+ [FUNC parse-consume-rparen :params [p]
406
+ :body (let [[t (p-peek p)]]
407
+ (if (and (not (null? t)) (= (get t :kind) "RParen"))
408
+ (p-advance p)
409
+ p))]
410
+ ;; args 수집 (재귀): RParen 만나면 중단
411
+ [FUNC parse-args :params [p acc]
412
+ :body (let [[t (p-peek p)]]
413
+ (cond
414
+ [(null? t) (r-pair p acc)]
415
+ [(= (get t :kind) "RParen") (r-pair p acc)]
416
+ [(= (get t :kind) "RBracket") (r-pair p acc)]
417
+ [(= (get t :kind) "RBrace") (r-pair p acc)]
418
+ [true
419
+ (let [[one (parse-expr p)]]
420
+ (parse-args (get one :p) (append acc (list (get one :node)))))]))]
421
+ ;; ──────────────────────────────────────
422
+ ;; 34 parse-bracket — [a b c] 또는 [FUNC ...] 블록
423
+ ;; ──────────────────────────────────────
424
+ [FUNC parse-bracket :params [p]
425
+ :body (let [[tok (p-peek p)] [line (get tok :line)]
426
+ [p1 (p-advance p)] ;; consume [
427
+ [next (p-peek p1)]]
428
+ (if (and (not (null? next))
429
+ (= (get next :kind) "Symbol")
430
+ (is-block-type? (get next :value))
431
+ (= (get next :value) (upper-case (get next :value))))
432
+ (parse-named-block p1 line)
433
+ (parse-array p1 line)))]
434
+ [FUNC is-block-type? :params [s]
435
+ :body (let [[c (char-at s 0)]]
436
+ (and (>= c "A") (<= c "Z")))]
437
+ [FUNC upper-case :params [s] :body s] ;; FL stdlib 기본 upper-case 가 없으면 identity. 판별엔 첫글자만 본다.
438
+ [FUNC parse-array :params [p line]
439
+ :body (let [[collected (parse-args p [])]
440
+ [p2 (get collected :p)] [items (get collected :node)]]
441
+ (r-pair (parse-consume-rbracket p2) (make-array-block items line)))]
442
+ [FUNC parse-consume-rbracket :params [p]
443
+ :body (let [[t (p-peek p)]]
444
+ (if (and (not (null? t)) (= (get t :kind) "RBracket"))
445
+ (p-advance p)
446
+ p))]
447
+ ;; [TYPE name? :k v :k v ...] Named block (FUNC/ROUTE/PAGE 등)
448
+ [FUNC parse-named-block :params [p line]
449
+ :body (let [[type-tok (p-peek p)] [type (get type-tok :value)]
450
+ [p1 (p-advance p)]
451
+ [name-info (parse-optional-name p1)]
452
+ [p2 (get name-info :p)] [name (get name-info :node)]
453
+ [fields-info (parse-block-fields p2 {})]
454
+ [p3 (get fields-info :p)] [fields (get fields-info :node)]]
455
+ (r-pair (parse-consume-rbracket p3)
456
+ (make-block type name fields line)))]
457
+ [FUNC parse-optional-name :params [p]
458
+ :body (let [[t (p-peek p)]]
459
+ (if (and (not (null? t))
460
+ (= (get t :kind) "Symbol")
461
+ (not (= (char-at (get t :value) 0) ":")))
462
+ (r-pair (p-advance p) (get t :value))
463
+ (r-pair p null)))]
464
+ ;; :k v :k v ... 반복. RBracket 만나면 중단.
465
+ [FUNC parse-block-fields :params [p acc]
466
+ :body (let [[t (p-peek p)]]
467
+ (cond
468
+ [(null? t) (r-pair p acc)]
469
+ [(= (get t :kind) "RBracket") (r-pair p acc)]
470
+ [(= (get t :kind) "Keyword")
471
+ (let [[key (get t :value)]
472
+ [p1 (p-advance p)]
473
+ [val (parse-expr p1)]
474
+ [p2 (get val :p)] [v (get val :node)]]
475
+ (parse-block-fields p2 (json_set acc key v)))]
476
+ [true (r-pair (p-advance p) acc)]))]
477
+ ;; ──────────────────────────────────────
478
+ ;; 35 parse-map — {:k v :k v ...}
479
+ ;; ──────────────────────────────────────
480
+ [FUNC parse-map :params [p]
481
+ :body (let [[tok (p-peek p)] [line (get tok :line)]
482
+ [p1 (p-advance p)]
483
+ [collected (parse-args p1 [])]
484
+ [p2 (get collected :p)] [items (get collected :node)]]
485
+ (r-pair (parse-consume-rbrace p2) (make-map-block items line)))]
486
+ [FUNC parse-consume-rbrace :params [p]
487
+ :body (let [[t (p-peek p)]]
488
+ (if (and (not (null? t)) (= (get t :kind) "RBrace"))
489
+ (p-advance p)
490
+ p))]
491
+ ;; ──────────────────────────────────────
492
+ ;; 40/44 공개 API: parse(tokens) → ast list
493
+ ;; ──────────────────────────────────────
494
+ [FUNC parse-all :params [p]
495
+ :body (if (p-end? p)
496
+ (get p :ast)
497
+ (let [[one (parse-expr p)]
498
+ [p2 (p-append-ast (get one :p) (get one :node))]]
499
+ (parse-all p2)))]
500
+ [FUNC parse :params [tokens] :body (parse-all (p-make tokens))]
501
+ ;; self/codegen.fl — FL AST → JS source (v2, Phase 10 확장)
502
+ ;;
503
+ ;; 새로 추가:
504
+ ;; 특수폼: let (1D/2D), cond, do, and, or, quote
505
+ ;; native stdlib: str, length, substring, char-at, replace
506
+ ;; first, last, rest, append, get, slice
507
+ ;; list, println, print, min, max, abs
508
+ ;; null?, not, empty?, mod
509
+ ;;
510
+ ;; 생성된 JS 는 runtime prelude 함수 (_fl_*) 가 선두에 포함됨.
511
+ ;; ═══════ 유틸 ═══════
512
+ ;; map_entries: native 또는 runtime prelude 제공 (FL에서 정의 불필요)
513
+ [FUNC esc-1 :params [s] :body (replace s "\\" "\\\\")]
514
+ [FUNC esc-2 :params [s] :body (replace s "\"" "\\\"")]
515
+ [FUNC esc-3 :params [s] :body (replace s "\n" "\\n")]
516
+ [FUNC esc-4 :params [s] :body (replace s "\r" "\\r")]
517
+ [FUNC esc-5 :params [s] :body (replace s "\t" "\\t")]
518
+ [FUNC js-esc-inner :params [s]
519
+ :body (esc-5 (esc-4 (esc-3 (esc-2 (esc-1 s)))))]
520
+ [FUNC js-esc :params [s]
521
+ :body (str "\"" (js-esc-inner s) "\"")]
522
+ ;; FL 예약 특수폼 (defn에서 검증)
523
+ [FUNC fl-reserved? :params [n]
524
+ :body (or (= n "loop") (= n "recur") (= n "fn") (= n "defn") (= n "defun")
525
+ (= n "if") (= n "cond") (= n "do") (= n "begin") (= n "progn")
526
+ (= n "while") (= n "and") (= n "or") (= n "let") (= n "set!")
527
+ (= n "define") (= n "async") (= n "await") (= n "try")
528
+ (= n "catch") (= n "finally") (= n "throw") (= n "quote")
529
+ (= n "compose") (= n "pipe") (= n "->") (= n "->>") (= n "|>"))]
530
+ ;; JS 예약어 회피: let/const/default/class/etc → 뒤에 _ 추가
531
+ [FUNC js-reserved? :params [n]
532
+ :body (or (= n "default") (= n "class") (= n "const") (= n "let")
533
+ (= n "if") (= n "else") (= n "switch") (= n "case")
534
+ (= n "break") (= n "continue") (= n "for") (= n "while")
535
+ (= n "function") (= n "return") (= n "throw") (= n "try")
536
+ (= n "catch") (= n "new") (= n "delete") (= n "typeof")
537
+ (= n "instanceof") (= n "var") (= n "in") (= n "of")
538
+ (= n "this") (= n "super") (= n "void") (= n "yield")
539
+ (= n "async") (= n "await") (= n "import") (= n "export")
540
+ (= n "enum") (= n "do") (= n "with") (= n "finally")
541
+ (= n "null") (= n "true") (= n "false"))]
542
+ [FUNC rename-1 :params [n] :body (replace n "-" "_")]
543
+ [FUNC rename-2 :params [n] :body (replace n "?" "_q")]
544
+ [FUNC rename-3 :params [n] :body (replace n "!" "_x")]
545
+ [FUNC rename-4 :params [n] :body (replace n ">" "_gt")]
546
+ [FUNC rename-5 :params [n] :body (replace n "<" "_lt")]
547
+ [FUNC rename-6 :params [n] :body (replace n "*" "_st")]
548
+ [FUNC rename-7 :params [n] :body (replace n "+" "_pl")]
549
+ [FUNC js-name-inner :params [n]
550
+ :body (let [[g (rename-7 (rename-6 (rename-5 (rename-4 (rename-3 (rename-2 (rename-1 n)))))))]]
551
+ (if (js-reserved? g) (str g "_") g))]
552
+ [FUNC js-name :params [n]
553
+ :body (if (null? n) "_" (js-name-inner n))]
554
+ ;; ═══════ 디스패치 ═══════
555
+ [FUNC cg :params [n]
556
+ :body (cond
557
+ [(null? n) "null"]
558
+ [(= (get n :kind) "literal") (cg-literal n)]
559
+ [(= (get n :kind) "variable") (js-name (get n :name))]
560
+ [(= (get n :kind) "keyword") (js-esc (get n :name))]
561
+ [(= (get n :kind) "template-string") (cg-template-string n)]
562
+ [(= (get n :kind) "try") (cg-try n)]
563
+ [(= (get n :kind) "sexpr") (cg-sexpr n)]
564
+ [(= (get n :kind) "block") (cg-block n)]
565
+ [(= (get n :kind) "pattern-match") (cg-match n)]
566
+ [(= (get n :kind) "await") (str "(await " (cg (get n :argument)) ")")]
567
+ [(= (get n :kind) "throw") (str "(()=>{throw new Error(String(" (cg (get n :argument)) "))})()")]
568
+ [true "null"])]
569
+ [FUNC js-esc-for-template :params [s]
570
+ :body (let [[s1 (replace s "\\" "\\\\")]]
571
+ (replace s1 "`" "\`"))]
572
+ [FUNC cg-template-string :params [n]
573
+ :body (str "`" (js-esc-for-template (get n :value)) "`")]
574
+ [FUNC cg-try :params [n]
575
+ :body (let [[body (get n :body)]
576
+ [catch-node (get n :catch)]
577
+ [finally-node (get n :finally)]
578
+ [body-code (cg body)]
579
+ [catch-code (if (null? catch-node) "" (cg-catch-clause catch-node))]
580
+ [finally-code (if (null? finally-node) "" (str "finally{" (cg finally-node) "}"))]
581
+ ]
582
+ (str "(()=>{try{return " body-code "}catch(err){" catch-code "}" finally-code "})()"))]
583
+ [FUNC cg-catch-clause :params [catch-node]
584
+ :body (let [[param (if (= (get catch-node :kind) "sexpr")
585
+ (let [[args (get catch-node :args)]]
586
+ (if (> (length args) 0)
587
+ (js-name (str (get (get args 0) :name)))
588
+ "err"))
589
+ "err")]
590
+ [body (if (= (get catch-node :kind) "sexpr")
591
+ (let [[args (get catch-node :args)]]
592
+ (if (> (length args) 1)
593
+ (cg (get args 1))
594
+ "null"))
595
+ (cg catch-node))]]
596
+ (str "let " param "=err;return " body ";"))]
597
+ [FUNC cg-literal-dispatch :params [t v]
598
+ :body (cond
599
+ [(= t "number") v]
600
+ [(= t "string") (js-esc v)]
601
+ [(= t "boolean") (if v "true" "false")]
602
+ [(= t "symbol")
603
+ (cond [(= v "true") "true"]
604
+ [(= v "false") "false"]
605
+ [(= v "null") "null"]
606
+ [(= v "nil") "null"]
607
+ [true (js-name v)])]
608
+ [true "null"])]
609
+ [FUNC cg-literal :params [n]
610
+ :body (cg-literal-dispatch (get n :type) (get n :value))]
611
+ [FUNC cg-block-dispatch :params [t fields]
612
+ :body (cond
613
+ [(= t "Array")
614
+ (str "[" (cg-args (get fields "items")) "]")]
615
+ [(= t "Map")
616
+ (str "({" (cg-map-entries fields) "})")]
617
+ [true "null"])]
618
+ [FUNC cg-block :params [n]
619
+ :body (let [[t (get n :type)] [fields (get n :fields)]]
620
+ (if (= t "FUNC")
621
+ (cg-func-block n)
622
+ (cg-block-dispatch t fields)))]
623
+ ;; Map literal: 두 AST 형태 지원
624
+ ;; 1) bootstrap parser: fields = JS Map, map_entries 로 [[k,v] ...]
625
+ ;; 2) self-parser: fields = {items: [k1,v1,k2,v2,...]} (평탄한 쌍 리스트)
626
+ ;; Map fields 형태 감지:
627
+ ;; bootstrap: JS Map{"key1"→node, "key2"→node, ...}
628
+ ;; self-parser: plain obj {items: [kw-node1, val-node1, kw-node2, val-node2, ...]}
629
+ ;; 자기참조 bootstrap 형태에서 "items" 키가 있어도 그 값은 단일 node 이지 list 아님.
630
+ [FUNC cg-map-entries-dispatch :params [items-val fields]
631
+ :body (if (array? items-val)
632
+ ;; self-parser: items = [key-node val-node key-node val-node ...]
633
+ (cg-map-flat-loop items-val 0 "")
634
+ ;; bootstrap parser: fields = Map{key -> val-node}
635
+ ;; map-entries 를 호출해서 [[k,v], [k,v], ...] 변환 후 처리
636
+ (cg-map-loop (map-entries fields) 0 ""))]
637
+ [FUNC cg-map-entries :params [fields]
638
+ :body (cg-map-entries-dispatch (get fields "items") fields)]
639
+ [FUNC cg-map-loop-inner :params [entries i acc e]
640
+ :body (let [[k (get e 0)]
641
+ [v (cg (get e 1))]
642
+ [pair (str (js-esc k) ":" v)]]
643
+ (cg-map-loop entries (+ i 1)
644
+ (if (= i 0) pair (str acc "," pair))))]
645
+ [FUNC cg-map-loop :params [entries i acc]
646
+ :body (if (>= i (length entries)) acc
647
+ (cg-map-loop-inner entries i acc (get entries i)))]
648
+ ;; self-parser 형태: items = [kw-node val-node kw-node val-node ...]
649
+ [FUNC cg-map-flat-loop-inner :params [items i acc k-n v-n]
650
+ :body (let [[k-str (cg-keyword-key k-n)]
651
+ [v-js (str (cg v-n))]
652
+ [pair (str k-str ":" v-js)]]
653
+ (cg-map-flat-loop items (+ i 2)
654
+ (if (= i 0) pair (str acc "," pair))))]
655
+ [FUNC cg-map-flat-loop :params [items i acc]
656
+ :body (if (>= i (length items)) acc
657
+ (cg-map-flat-loop-inner items i acc (get items i) (get items (+ i 1))))]
658
+ ;; keyword/literal 에서 키 문자열 추출
659
+ [FUNC cg-keyword-key :params [n]
660
+ :body (cond [(= (get n :kind) "keyword") (js-esc (get n :name))]
661
+ [(= (get n :kind) "literal") (js-esc (str (get n :value)))]
662
+ [true "\"_anon\""])]
663
+ ;; [FUNC name :params [a b] :body expr]
664
+ ;; → const name = (a, b) => expr;
665
+ [FUNC cg-func-block-inner :params [name fields pnode body]
666
+ :body (let [[pitems (if (null? pnode) (list) (get (get pnode :fields) "items"))]
667
+ [ps (extract-params pitems)]]
668
+ (str "const " name " = (" ps ")=>" (cg body) ";"))]
669
+ [FUNC cg-func-block :params [n]
670
+ :body (let [[name (js-name (get n :name))]
671
+ [fields (get n :fields)]]
672
+ (cg-func-block-inner name fields (get fields "params") (get fields "body")))]
673
+ ;; ═══════ 특수폼 ═══════
674
+ [FUNC cg-if :params [args]
675
+ :body (str "(" (cg (get args 0)) "?" (cg (get args 1)) ":"
676
+ (if (>= (length args) 3) (cg (get args 2)) "null") ")")]
677
+ [FUNC cg-fn :params [args]
678
+ :body (let [[pnode (get args 0)] [body (get args 1)]
679
+ [ps (extract-params (get (get pnode :fields) "items"))]]
680
+ (str "((" ps ")=>" (cg body) ")"))]
681
+ [FUNC cg-defn :params [args]
682
+ :body (let [[name-n (get args 0)] [pnode (get args 1)] [body (get args 2)]
683
+ [name (extract-name name-n)]
684
+ [ps (extract-params (get (get pnode :fields) "items"))]
685
+ [warning (if (fl-reserved? name) (str "// ⚠️ RESERVED NAME: " name) "")]]
686
+ (str warning (if (fl-reserved? name) "\n" "") "const " name " = (" ps ")=>" (cg body)))]
687
+ [FUNC cg-define :params [args]
688
+ :body (if (= (length args) 2)
689
+ (str "const " (extract-name (get args 0)) " = " (cg (get args 1)))
690
+ (cg-defn args))]
691
+ [FUNC cg-let :params [args]
692
+ :body (let [[bnode (get args 0)]
693
+ [items (get (get bnode :fields) "items")]
694
+ [first-item (if (null? items) null (get items 0))]
695
+ [inner-items (if (null? first-item) null
696
+ (if (and (= (get first-item :kind) "block")
697
+ (= (get first-item :type) "Array"))
698
+ (get (get first-item :fields) "items")
699
+ null))]
700
+ [nested (and (not (null? inner-items))
701
+ (> (length inner-items) 0)
702
+ (= (get (get inner-items 0) :kind) "block")
703
+ (= (get (get inner-items 0) :type) "Array"))]
704
+ [bindings (if nested (cg-let-2d items 0 "" 0) (cg-let-1d items 0 "" 0))]
705
+ [body-args (slice args 1 (length args))]
706
+ [body-js (cg-do-body body-args 0 "")]]
707
+ (str "((()=>{" bindings body-js "})())"))]
708
+ [FUNC cg-let-binding :params [pat-node val-js tmpvar]
709
+ :body (let [[kind (get pat-node :kind)]
710
+ [type (get pat-node :type)]]
711
+ (cond
712
+ [(= kind "variable")
713
+ (str "let " (js-name (get pat-node :name)) "=" val-js ";")]
714
+ [(and (= kind "block") (= type "Map"))
715
+ ;; Map 패턴: 필드들을 순회하며 바인딩 생성
716
+ ;; val-js와 tmpvar이 같으면 (배열에서 추출됨) 다시 선언하지 않음
717
+ (let [[pat-fields (get pat-node :fields)]
718
+ [pat-entries (map-entries pat-fields)]
719
+ [pat-bindings (cg-map-pattern-bindings-from-entries pat-entries tmpvar 0 "")]]
720
+ (str
721
+ (if (= val-js tmpvar) "" (str "let " tmpvar "=" val-js ";"))
722
+ pat-bindings))]
723
+ [(and (= kind "block") (= type "Array"))
724
+ ;; array pattern: 배열 값에서 첫 항목을 추출해서 패턴과 매칭
725
+ (let [[items (get (get pat-node :fields) "items")]
726
+ [first-pat (if (null? items) nil (get items 0))]
727
+ [tmpvar-next (str tmpvar "_inner")]]
728
+ (if (null? first-pat) ""
729
+ (str "let " tmpvar "=" val-js "[0];"
730
+ (cg-let-binding first-pat tmpvar tmpvar-next))))]
731
+ [true
732
+ (str "let " (extract-name pat-node) "=" val-js ";")]))]
733
+ [FUNC cg-let-1d :params [items i acc counter]
734
+ :body (if (>= i (length items)) acc
735
+ (let [[pat-n (get items i)] [v-n (get items (+ i 1))]
736
+ [val (cg v-n)]
737
+ [tmpvar (str "__v" (if (= counter 0) "" counter))]]
738
+ (cg-let-1d items (+ i 2) (str acc (cg-let-binding pat-n val tmpvar)) (+ counter 1))))]
739
+ [FUNC cg-let-2d :params [items i acc counter]
740
+ :body (if (>= i (length items)) acc
741
+ (let [[pair (get items i)]
742
+ [pitems (get (get pair :fields) "items")]
743
+ [k-n (get pitems 0)] [v-n (get pitems 1)]
744
+ [val (cg v-n)]
745
+ [tmpvar (str "__v" (if (= counter 0) "" counter))]]
746
+ (cg-let-2d items (+ i 1) (str acc (cg-let-binding k-n val tmpvar)) (+ counter 1))))]
747
+ [FUNC cg-do :params [args]
748
+ :body (if (= (length args) 0) "null"
749
+ (str "(()=>{" (cg-do-body args 0 "") "})()"))]
750
+ [FUNC cg-do-body :params [args i acc]
751
+ :body (if (>= i (length args)) acc
752
+ (let [[last (= i (- (length args) 1))]
753
+ [c (cg (get args i))]
754
+ [sep (if last "return " "")]]
755
+ (cg-do-body args (+ i 1) (str acc sep c ";"))))]
756
+ [FUNC get-clause-items :params [clause]
757
+ :body (let [[fields (get clause :fields)]
758
+ [items (get fields "items")]]
759
+ (if (array? items) items
760
+ (list (get fields 0) (get fields 1))))]
761
+ [FUNC cg-cond :params [args]
762
+ :body (cg-cond-loop args 0)]
763
+ [FUNC cg-cond-loop :params [args i]
764
+ :body (loop [j (- (length args) 1) acc "null"]
765
+ (if (< j 0) acc
766
+ (let [[clause (get args j)]
767
+ [citems (get-clause-items clause)]
768
+ [test (cg (get citems 0))] [result (cg (get citems 1))]]
769
+ (recur (- j 1) (str "(" test "?" result ":" acc ")")))))]
770
+ [FUNC cg-and :params [args]
771
+ :body (if (= (length args) 0) "true"
772
+ (str "(" (and-loop args 0 "") ")")) ]
773
+ [FUNC and-loop :params [args i acc]
774
+ :body (if (>= i (length args)) acc
775
+ (let [[c (str (cg (get args i)))]]
776
+ (and-loop args (+ i 1)
777
+ (if (= i 0) c (str acc "&&" c)))))]
778
+ [FUNC cg-or :params [args]
779
+ :body (if (= (length args) 0) "false"
780
+ (str "(" (or-loop args 0 "") ")")) ]
781
+ [FUNC or-loop :params [args i acc]
782
+ :body (if (>= i (length args)) acc
783
+ (let [[c (str (cg (get args i)))]]
784
+ (or-loop args (+ i 1)
785
+ (if (= i 0) c (str acc "||" c)))))]
786
+ [FUNC cg-quote :params [args]
787
+ :body (if (= (length args) 0) "null" (js-esc (str (cg (get args 0)))))]
788
+ ;; (set! x v) → (x=v)
789
+ [FUNC cg-set! :params [args]
790
+ :body (str "(" (extract-name (get args 0)) "=" (cg (get args 1)) ")")]
791
+ ;; (throw msg) → (()=>{throw new Error(msg)})()
792
+ [FUNC cg-throw :params [args]
793
+ :body (let [[m (if (= (length args) 0) "\"error\"" (cg (get args 0)))]]
794
+ (str "(()=>{throw new Error(String(" m "))})()"))]
795
+ ;; (while cond body...) → (()=>{while(cond){body;}})()
796
+ [FUNC cg-while :params [args]
797
+ :body (let [[cond (cg (get args 0))]
798
+ [body-args (slice args 1 (length args))]
799
+ [body (while-body body-args 0 "")]]
800
+ (str "(()=>{while(" cond "){" body "}})()"))]
801
+ [FUNC while-body :params [args i acc]
802
+ :body (if (>= i (length args)) acc
803
+ (while-body args (+ i 1) (str acc (cg (get args i)) ";")))]
804
+ ;; (loop [[i 0] [acc 0]] body-with-recur)
805
+ ;; → mutable let + while(true) { const __r=...; if(__r?.__recur){[i,acc]=__r.a;continue;} return __r; }
806
+ ;; recur 는 { __recur:true, a:[v1,v2,...] } 를 반환
807
+ [FUNC cg-loop :params [args]
808
+ :body (let [[bnode (get args 0)]
809
+ [items (get (get bnode :fields) "items")]
810
+ [first (if (null? items) null (get items 0))]
811
+ [nested (if (null? first) false
812
+ (and (= (get first :kind) "block")
813
+ (= (get first :type) "Array")))]
814
+ [bindings (if nested (loop-inits-2d items 0 "") (loop-inits-1d items 0 ""))]
815
+ [names (if nested (loop-names-2d items 0 "") (loop-names-1d items 0 ""))]
816
+ [body-args (slice args 1 (length args))]
817
+ [body-js (cg-do-body body-args 0 "")]]
818
+ (str "((()=>{" bindings
819
+ "while(true){let __r=(()=>{" body-js "})();"
820
+ "if(__r&&__r.__recur){[" names "]=__r.a;continue;}"
821
+ "return __r;}})())"))]
822
+ [FUNC loop-inits-1d :params [items i acc]
823
+ :body (if (>= i (length items)) acc
824
+ (let [[k (get items i)] [v (get items (+ i 1))]]
825
+ (loop-inits-1d items (+ i 2)
826
+ (str acc "let " (extract-name k) "=" (cg v) ";"))))]
827
+ [FUNC loop-inits-2d :params [items i acc]
828
+ :body (if (>= i (length items)) acc
829
+ (let [[pair (get items i)]
830
+ [pit (get (get pair :fields) "items")]]
831
+ (loop-inits-2d items (+ i 1)
832
+ (str acc "let " (extract-name (get pit 0)) "=" (cg (get pit 1)) ";"))))]
833
+ [FUNC loop-names-1d :params [items i acc]
834
+ :body (if (>= i (length items)) acc
835
+ (let [[k (get items i)] [n (extract-name k)]]
836
+ (loop-names-1d items (+ i 2)
837
+ (if (= (length acc) 0) n (str acc "," n)))))]
838
+ [FUNC loop-names-2d :params [items i acc]
839
+ :body (if (>= i (length items)) acc
840
+ (let [[pair (get items i)]
841
+ [pit (get (get pair :fields) "items")]
842
+ [n (extract-name (get pit 0))]]
843
+ (loop-names-2d items (+ i 1)
844
+ (if (= (length acc) 0) n (str acc "," n)))))]
845
+ ;; (recur v1 v2 ...) → {__recur:true, a:[v1,v2,...]}
846
+ [FUNC cg-recur :params [args]
847
+ :body (str "{__recur:true,a:[" (cg-args args) "]}")]
848
+ ;; ═══════ match (pattern-match node) ═══════
849
+ ;; (match value
850
+ ;; (pat1 body1)
851
+ ;; (pat2 body2)
852
+ ;; (default body))
853
+ ;;
854
+ ;; → ((__v)=>{
855
+ ;; if(<test1>){let b=__v; return <body1>;}
856
+ ;; if(<test2>){return <body2>;}
857
+ ;; return <default>;
858
+ ;; })(value)
859
+ [FUNC cg-match :params [n]
860
+ :body (let [[val (cg (get n :value))]
861
+ [cases (get n :cases)]
862
+ [default-n (get n :defaultCase)]
863
+ [default (if (null? default-n) "null" (cg default-n))]
864
+ [cases-js (match-cases-loop cases 0 "")]]
865
+ (str "((__v)=>{" cases-js "return " default ";})(" val ")"))]
866
+ ;; 각 case: if (pattern-test) { bindings; if (guard) { return body; } }
867
+ ;; guard 가 binding 변수를 참조할 수 있어 bindings 를 먼저 실행
868
+ [FUNC match-cases-loop :params [cases i acc]
869
+ :body (if (>= i (length cases)) acc
870
+ (let [[c (get cases i)]
871
+ [pat (get c :pattern)]
872
+ [body (cg (get c :body))]
873
+ [guard-n (get c :guard)]
874
+ [test (pattern-test pat "__v")]
875
+ [bind (pattern-bindings pat "__v")]
876
+ [guard-js (if (null? guard-n) "true" (cg guard-n))]
877
+ [inner (if (null? guard-n)
878
+ (str bind "return " body ";")
879
+ (str bind "if(" guard-js "){return " body ";}"))]]
880
+ (match-cases-loop cases (+ i 1)
881
+ (str acc "if(" test "){" inner "}"))))]
882
+ ;; pattern-test: JS expression that returns truthy if pat matches __v
883
+ [FUNC pattern-test-dispatch :params [k pat v]
884
+ :body (cond
885
+ [(= k "wildcard-pattern") "true"]
886
+ [(= k "variable-pattern") "true"]
887
+ [(= k "literal-pattern")
888
+ (str "(" v "===" (literal-to-js (get pat :type) (get pat :value)) ")")]
889
+ [(= k "or-pattern") (or-pattern-test (get pat :patterns) v 0 "")]
890
+ [(= k "range-pattern")
891
+ (str "(" v ">=" (get pat :min) "&&" v "<=" (get pat :max) ")")]
892
+ [(= k "struct-pattern")
893
+ (struct-pattern-test (get pat :fields) v 0 nil "")]
894
+ [true "false"])]
895
+ [FUNC pattern-test :params [pat v]
896
+ :body (pattern-test-dispatch (get pat :kind) pat v)]
897
+ [FUNC literal-to-js :params [t v]
898
+ :body (cond [(= t "number") v]
899
+ [(= t "string") (js-esc v)]
900
+ [(= t "symbol")
901
+ (cond [(= v "true") "true"] [(= v "false") "false"] [(= v "null") "null"]
902
+ [true (js-esc v)])]
903
+ [true "null"])]
904
+ [FUNC or-pattern-test :params [pats v i acc]
905
+ :body (if (>= i (length pats)) (if (= (length acc) 0) "false" (str "(" acc ")"))
906
+ (let [[t (pattern-test (get pats i) v)]]
907
+ (or-pattern-test pats v (+ i 1)
908
+ (if (= (length acc) 0) t (str acc "||" t))))) ]
909
+ ;; struct-pattern-test: Test all fields match
910
+ ;; fields는 {key: pattern, ...} 형태의 객체
911
+ [FUNC struct-pattern-test :params [fields v i keys acc]
912
+ :body (if (nil? keys)
913
+ (let [[ks (json_keys fields)]]
914
+ (struct-pattern-test fields v 0 ks ""))
915
+ (if (>= i (length keys))
916
+ (if (= (length acc) 0)
917
+ (str "(" v "!==null&&typeof " v "===\"object\")")
918
+ (str "(" v "!==null&&typeof " v "===\"object\"&&" acc ")"))
919
+ (let [[k (get keys i)]
920
+ [pat (get fields k)]
921
+ [k-clean (if (= (char-at k 0) ":") (substring k 1) k)]
922
+ [t (pattern-test pat (str v "[" (js-esc k-clean) "]"))]]
923
+ (struct-pattern-test fields v (+ i 1) keys
924
+ (if (= (length acc) 0) t (str acc "&&" t))))))]
925
+ ;; pattern-bindings: JS statement that binds pattern variables from __v
926
+ [FUNC pattern-bindings-dispatch :params [k pat v]
927
+ :body (cond
928
+ [(or (= k "variable-pattern") (= k "variable"))
929
+ (str "let " (js-name (get pat :name)) "=" v ";")]
930
+ [(or (= k "struct-pattern") (= k "block"))
931
+ (struct-pattern-bindings (get pat :fields) v 0 nil "")]
932
+ [true ""])]
933
+ ;; bootstrap Map 지원: map-entries 호출해서 [[k,v], ...] 형태로 변환
934
+ [FUNC struct-pattern-bindings-from-entries :params [entries v i acc]
935
+ :body (if (>= i (length entries)) acc
936
+ (let [[e (get entries i)]
937
+ [k (get e 0)]
938
+ [pat (get e 1)]
939
+ [k-clean (if (= (char-at k 0) ":") (substring k 1) k)]
940
+ [access (str v "[" (js-esc k-clean) "]")]
941
+ [pat-kind (get pat :kind)]
942
+ [binding (cond
943
+ [(= pat-kind "variable")
944
+ (str "let " (js-name (get pat :name)) "=" access ";")]
945
+ [(= pat-kind "block")
946
+ (let [[v_next (str v "_" i)]]
947
+ (str "let " v_next "=" access ";" (struct-pattern-bindings-from-entries (map-entries (get pat :fields)) v_next 0 "")))]
948
+ [true ""])]
949
+ [binding (if (= (length binding) 0) "" binding)]]
950
+ (struct-pattern-bindings-from-entries entries v (+ i 1)
951
+ (str acc binding))))]
952
+ ;; cg-map-pattern-bindings-from-entries: entries 형태의 패턴 필드들을 처리
953
+ [FUNC cg-map-pattern-bindings-from-entries :params [entries v i acc]
954
+ :body (if (>= i (length entries)) acc
955
+ (let [[e (get entries i)]
956
+ [k (get e 0)]
957
+ [pat (get e 1)]
958
+ [k-clean (if (= (char-at k 0) ":") (substring k 1) k)]
959
+ [access (str v "[" (js-esc k-clean) "]")]
960
+ [binding (pattern-bindings-dispatch (get pat :kind) pat access)]]
961
+ (cg-map-pattern-bindings-from-entries entries v (+ i 1)
962
+ (str acc binding))))]
963
+ ;; struct-pattern-bindings: Collect bindings from all fields
964
+ ;; bootstrap parser: fields = Map{...} → map-entries로 변환
965
+ ;; self-parser: fields = plain obj {field: pattern, ...} → json_keys로 처리
966
+ [FUNC struct-pattern-bindings :params [fields v i keys acc]
967
+ :body (if (nil? keys)
968
+ (let [[ks (json_keys fields)]]
969
+ (if (empty? ks)
970
+ ;; Map인 경우: json_keys가 빈 배열 반환 → map-entries 사용
971
+ (struct-pattern-bindings-from-entries (map-entries fields) v 0 "")
972
+ ;; plain object인 경우: json_keys로 계속 진행
973
+ (struct-pattern-bindings fields v 0 ks "")))
974
+ (if (>= i (length keys))
975
+ acc
976
+ (let [[k (get keys i)]
977
+ [pat (get fields k)]
978
+ [k-clean (if (= (char-at k 0) ":") (substring k 1) k)]
979
+ [field-bindings (pattern-bindings pat (str v "[" (js-esc k-clean) "]"))]]
980
+ (struct-pattern-bindings fields v (+ i 1) keys
981
+ (str acc field-bindings)))))]
982
+ [FUNC pattern-bindings :params [pat v]
983
+ :body (pattern-bindings-dispatch (get pat :kind) pat v)]
984
+ ;; (compose f g h) → ((__x)=>f(g(h(__x)))) right-to-left
985
+ ;; 마지막 arg (h) 먼저 적용, 맨 처음 (f) 가 바깥
986
+ [FUNC cg-compose :params [args]
987
+ :body (str "((__x)=>" (compose-nest args (- (length args) 1) "__x") ")")]
988
+ [FUNC compose-nest :params [args i acc]
989
+ :body (if (< i 0) acc
990
+ (let [[f (str (cg (get args i)))]]
991
+ (compose-nest args (- i 1) (str f "(" acc ")")))) ]
992
+ ;; (pipe f g h) → ((__x)=>h(g(f(__x)))) left-to-right
993
+ ;; 첫 arg (f) 먼저 적용, 마지막 (h) 이 바깥
994
+ [FUNC cg-pipe :params [args]
995
+ :body (str "((__x)=>" (pipe-nest args 0 "__x") ")")]
996
+ [FUNC pipe-nest :params [args i acc]
997
+ :body (if (>= i (length args)) acc
998
+ (let [[f (str (cg (get args i)))]]
999
+ (pipe-nest args (+ i 1) (str f "(" acc ")")))) ]
1000
+ ;; (-> x step1 step2) thread-first: step(acc, args...)
1001
+ ;; step 이 symbol → step(acc); step 이 sexpr → (op acc args...)
1002
+ [FUNC cg-thread-first :params [args]
1003
+ :body (let [[init (str (cg (get args 0)))]]
1004
+ (thread-first-loop args 1 init))]
1005
+ [FUNC thread-first-loop :params [args i acc]
1006
+ :body (if (>= i (length args)) acc
1007
+ (thread-first-loop args (+ i 1)
1008
+ (thread-apply (get args i) acc true))) ]
1009
+ ;; (->> x step1 step2) thread-last: step(args..., acc)
1010
+ [FUNC cg-thread-last :params [args]
1011
+ :body (let [[init (str (cg (get args 0)))]]
1012
+ (thread-last-loop args 1 init))]
1013
+ [FUNC thread-last-loop :params [args i acc]
1014
+ :body (if (>= i (length args)) acc
1015
+ (thread-last-loop args (+ i 1)
1016
+ (thread-apply (get args i) acc false))) ]
1017
+ ;; thread-apply: step, acc, first? → new acc
1018
+ [FUNC thread-apply :params [step acc fst]
1019
+ :body (cond
1020
+ [(= (get step :kind) "sexpr")
1021
+ (let [[op (js-name (get step :op))] [a (get step :args)]]
1022
+ (if fst
1023
+ (str op "(" acc (if (= (length a) 0) "" (str "," (cg-args a))) ")")
1024
+ (str op "(" (if (= (length a) 0) "" (str (cg-args a) ",")) acc ")")))]
1025
+ [true
1026
+ (str (cg step)) "(" acc ")")])]
1027
+ ;; (call f 1 2) → f(1,2)
1028
+ [FUNC cg-call-form :params [args]
1029
+ :body (let [[fn (str (cg (get args 0)))]
1030
+ [rest (slice args 1 (length args))]]
1031
+ (str fn "(" (cg-args rest) ")"))]
1032
+ ;; (async body...) → (async()=>{...})()
1033
+ ;; 반환: Promise
1034
+ [FUNC cg-async :params [args]
1035
+ :body (str "(async()=>{" (cg-do-body args 0 "") "})()")]
1036
+ ;; (await p) → await p (런타임에 async context 필요)
1037
+ [FUNC cg-await :params [args]
1038
+ :body (str "(await " (cg (get args 0)) ")")]
1039
+ ;; (defstruct Name field1 field2 ...)
1040
+ ;; → const Name = (field1, field2, ...) => ({__struct:"Name", field1, field2, ...});
1041
+ [FUNC cg-defstruct :params [args]
1042
+ :body (let [[name-n (get args 0)]
1043
+ [name (extract-name name-n)]
1044
+ [fields (slice args 1 (length args))]
1045
+ [params (struct-field-list fields 0 "")]
1046
+ [init (struct-init-list fields 0 "")]]
1047
+ (str "const " name " = (" params ")=>({__struct:\"" name "\"," init "})"))]
1048
+ [FUNC struct-field-list :params [fs i acc]
1049
+ :body (if (>= i (length fs)) acc
1050
+ (let [[n (extract-name (get fs i))]]
1051
+ (struct-field-list fs (+ i 1)
1052
+ (if (= (length acc) 0) n (str acc "," n)))))]
1053
+ [FUNC struct-init-list :params [fs i acc]
1054
+ :body (if (>= i (length fs)) acc
1055
+ (let [[n (extract-name (get fs i))]]
1056
+ (struct-init-list fs (+ i 1)
1057
+ (if (= (length acc) 0) n (str acc "," n)))))]
1058
+ ;; ═══════ 연산/인자 ═══════
1059
+ [FUNC cg-args :params [args] :body (args-loop args 0 "")]
1060
+ [FUNC args-loop :params [args i acc]
1061
+ :body (if (>= i (length args)) acc
1062
+ (let [[c (str (cg (get args i)))]]
1063
+ (args-loop args (+ i 1)
1064
+ (if (= i 0) c (str acc "," c)))))]
1065
+ [FUNC cg-binop :params [args op zero]
1066
+ :body (cond [(= (length args) 0) zero]
1067
+ [(= (length args) 1) (str (cg (get args 0)))]
1068
+ [true (str "(" (binop-loop args 0 "" op) ")")])]
1069
+ [FUNC binop-loop :params [args i acc op]
1070
+ :body (if (>= i (length args)) acc
1071
+ (let [[c (str (cg (get args i)))]]
1072
+ (binop-loop args (+ i 1)
1073
+ (if (= i 0) c (str acc op c)) op)))]
1074
+ [FUNC cg-pair :params [args op]
1075
+ :body (str "(" (cg (get args 0)) op (cg (get args 1)) ")")]
1076
+ [FUNC cg-sub :params [args]
1077
+ :body (cond [(= (length args) 0) "0"]
1078
+ [(= (length args) 1) (str "(-" (cg (get args 0)) ")")]
1079
+ [true (str "(" (binop-loop args 0 "" "-") ")")])]
1080
+ ;; ═══════ 파라미터/이름 추출 ═══════
1081
+ [FUNC extract-name :params [n]
1082
+ :body (cond [(= (get n :kind) "variable") (js-name (get n :name))]
1083
+ [(= (get n :kind) "literal") (js-name (get n :value))]
1084
+ [true "_anon"])]
1085
+ [FUNC extract-params :params [items]
1086
+ :body (param-loop items 0 "")]
1087
+ [FUNC param-loop :params [items i acc]
1088
+ :body (if (null? items) acc
1089
+ (if (>= i (length items)) acc
1090
+ (let [[cur (get items i)]
1091
+ [cur-val (if (= (get cur :kind) "literal") (get cur :value) "")]]
1092
+ (if (= cur-val "&")
1093
+ ;; rest-args: '&' 다음 항목 이름 앞에 '...' 붙여 emit, i+2 로 점프
1094
+ (if (>= (+ i 1) (length items)) acc
1095
+ (let [[rest-name (extract-name (get items (+ i 1)))]
1096
+ [entry (str "..." rest-name)]]
1097
+ (param-loop items (+ i 2)
1098
+ (if (= i 0) entry (str acc "," entry)))))
1099
+ (let [[name (extract-name cur)]]
1100
+ (param-loop items (+ i 1)
1101
+ (if (= i 0) name (str acc "," name))))))))]
1102
+ ;; ═══════ stdlib native → JS 매핑 ═══════
1103
+ [FUNC cg-native-dispatch :params [op as]
1104
+ :body (cond
1105
+ ;; ─── String (15) ───
1106
+ [(= op "str") (str "_fl_str(" as ")")]
1107
+ [(= op "concat") (str "_fl_str(" as ")")]
1108
+ [(= op "length") (str "_fl_length(" as ")")]
1109
+ [(= op "substring") (str "_fl_substring(" as ")")]
1110
+ [(= op "char-at") (str "_fl_char_at(" as ")")]
1111
+ [(= op "replace") (str "_fl_replace(" as ")")]
1112
+ [(= op "starts-with?") (str "_fl_starts_with(" as ")")]
1113
+ [(= op "ends-with?") (str "_fl_ends_with(" as ")")]
1114
+ [(= op "contains?") (str "_fl_contains(" as ")")]
1115
+ [(= op "split") (str "_fl_split(" as ")")]
1116
+ [(= op "join") (str "_fl_join(" as ")")]
1117
+ [(= op "trim") (str "_fl_trim(" as ")")]
1118
+ [(= op "upper") (str "_fl_upper(" as ")")]
1119
+ [(= op "lower") (str "_fl_lower(" as ")")]
1120
+ [(= op "repeat") (str "_fl_repeat(" as ")")]
1121
+ [(= op "index-of") (str "_fl_index_of(" as ")")]
1122
+ ;; ─── List (15) ───
1123
+ [(= op "first") (str "_fl_first(" as ")")]
1124
+ [(= op "last") (str "_fl_last(" as ")")]
1125
+ [(= op "rest") (str "_fl_rest(" as ")")]
1126
+ [(= op "append") (str "_fl_append(" as ")")]
1127
+ [(= op "slice") (str "_fl_slice(" as ")")]
1128
+ [(= op "list") (str "[" as "]")]
1129
+ [(= op "map") (str "_fl_map(" as ")")]
1130
+ [(= op "filter") (str "_fl_filter(" as ")")]
1131
+ [(= op "reduce") (str "_fl_reduce(" as ")")]
1132
+ [(= op "find") (str "_fl_find(" as ")")]
1133
+ [(= op "every?") (str "_fl_every(" as ")")]
1134
+ [(= op "some?") (str "_fl_some(" as ")")]
1135
+ [(= op "sort") (str "_fl_sort(" as ")")]
1136
+ [(= op "reverse") (str "_fl_reverse(" as ")")]
1137
+ [(= op "flatten") (str "_fl_flatten(" as ")")]
1138
+ [(= op "distinct") (str "_fl_distinct(" as ")")]
1139
+ [(= op "range") (str "_fl_range(" as ")")]
1140
+ [(= op "take") (str "_fl_take(" as ")")]
1141
+ [(= op "drop") (str "_fl_drop(" as ")")]
1142
+ [(= op "count") (str "_fl_length(" as ")")]
1143
+ ;; ─── Map (8) ───
1144
+ [(= op "get") (str "_fl_get(" as ")")]
1145
+ [(= op "keys") (str "_fl_keys(" as ")")]
1146
+ [(= op "values") (str "_fl_values(" as ")")]
1147
+ [(= op "entries") (str "_fl_entries(" as ")")]
1148
+ [(= op "has-key?") (str "_fl_has_key(" as ")")]
1149
+ [(= op "map-set") (str "_fl_map_set(" as ")")]
1150
+ [(= op "map-delete") (str "_fl_map_delete(" as ")")]
1151
+ [(= op "merge") (str "_fl_merge(" as ")")]
1152
+ [(= op "json_set") (str "_fl_map_set(" as ")")]
1153
+ ;; ─── JSON (4) ───
1154
+ [(= op "json-parse") (str "JSON.parse(" as ")")]
1155
+ [(= op "json-stringify") (str "JSON.stringify(" as ")")]
1156
+ [(= op "json_parse") (str "JSON.parse(" as ")")]
1157
+ [(= op "json_stringify") (str "JSON.stringify(" as ")")]
1158
+ ;; ─── Type predicates (10) ───
1159
+ [(= op "null?") (str "(" as "==null)")]
1160
+ [(= op "nil?") (str "_fl_nil_q(" as ")")]
1161
+ [(= op "nil-or-empty?") (str "_fl_nil_or_empty_q(" as ")")]
1162
+ [(= op "not") (str "(!" as ")")]
1163
+ [(= op "empty?") (str "_fl_empty_q(" as ")")]
1164
+ [(= op "true?") (str "(" as "===true)")]
1165
+ [(= op "false?") (str "(" as "===false)")]
1166
+ [(= op "string?") (str "(typeof " as "===\"string\")")]
1167
+ [(= op "number?") (str "(typeof " as "===\"number\")")]
1168
+ [(= op "list?") (str "Array.isArray(" as ")")]
1169
+ [(= op "array?") (str "Array.isArray(" as ")")]
1170
+ [(= op "map?") (str "_fl_is_map(" as ")")]
1171
+ [(= op "fn?") (str "(typeof " as "===\"function\")")]
1172
+ [(= op "boolean?") (str "(typeof " as "===\"boolean\")")]
1173
+ [(= op "type-of") (str "_fl_type_of(" as ")")]
1174
+ ;; ─── Math (15) ───
1175
+ [(= op "min") (str "Math.min(" as ")")]
1176
+ [(= op "max") (str "Math.max(" as ")")]
1177
+ [(= op "abs") (str "Math.abs(" as ")")]
1178
+ [(= op "sqrt") (str "Math.sqrt(" as ")")]
1179
+ [(= op "pow") (str "Math.pow(" as ")")]
1180
+ [(= op "floor") (str "Math.floor(" as ")")]
1181
+ [(= op "ceil") (str "Math.ceil(" as ")")]
1182
+ [(= op "round") (str "Math.round(" as ")")]
1183
+ [(= op "mod") (cg-pair args "%")]
1184
+ [(= op "neg") (str "(-" as ")")]
1185
+ [(= op "sign") (str "Math.sign(" as ")")]
1186
+ [(= op "random") (str "Math.random()")]
1187
+ [(= op "log") (str "Math.log(" as ")")]
1188
+ [(= op "exp") (str "Math.exp(" as ")")]
1189
+ [(= op "sin") (str "Math.sin(" as ")")]
1190
+ [(= op "cos") (str "Math.cos(" as ")")]
1191
+ [(= op "str-to-num") (str "Number(" as ")")]
1192
+ [(= op "num-to-str") (str "String(" as ")")]
1193
+ ;; ─── I/O (7) ───
1194
+ [(= op "println") (str "console.log(" as ")")]
1195
+ [(= op "print") (str "process.stdout.write(String(" as "))")]
1196
+ [(= op "file_read") (str "_fl_file_read(" as ")")]
1197
+ [(= op "file_write") (str "_fl_file_write(" as ")")]
1198
+ [(= op "file_exists") (str "_fl_file_exists(" as ")")]
1199
+ [(= op "exit") (str "process.exit(" as ")")]
1200
+ [(= op "shell_capture") (str "_fl_shell_capture(" as ")")]
1201
+ ;; ─── Time (10) ───
1202
+ [(= op "now") (str "now()")]
1203
+ [(= op "now_ms") (str "now_ms()")]
1204
+ [(= op "now_iso") (str "now_iso()")]
1205
+ [(= op "now_unix") (str "now_unix()")]
1206
+ [(= op "time_diff") (str "((t1,t2)=>t2-t1)(" as ")")]
1207
+ [(= op "time_since") (str "((ts)=>Date.now()-ts)(" as ")")]
1208
+ [(= op "sleep_ms") (str "((ms)=>{const start=Date.now();while(Date.now()-start<ms){}})(" as ")")]
1209
+ [(= op "timer_start") (str "{__timer:{label:" as ",start:Date.now(),laps:[]}}")]
1210
+ [(= op "timer_elapsed") (str "((t)=>Date.now()-t.__timer.start)(" as ")")]
1211
+ [(= op "timer_lap") (str "((t,l)=>{t.__timer.laps.push({label:l,ms:Date.now()-t.__timer.start});return t;})(" as ")")]
1212
+ ;; ─── String 추가 (starts-with?, ends-with?, contains?, split, join, trim, upper, lower, repeat, index-of) ───
1213
+ [(= op "starts-with?") (str "_fl_starts_with(" as ")")]
1214
+ [(= op "ends-with?") (str "_fl_ends_with(" as ")")]
1215
+ [(= op "contains?") (str "_fl_contains(" as ")")]
1216
+ [(= op "split") (str "_fl_split(" as ")")]
1217
+ [(= op "join") (str "_fl_join(" as ")")]
1218
+ [(= op "trim") (str "_fl_trim(" as ")")]
1219
+ [(= op "upper") (str "_fl_upper(" as ")")]
1220
+ [(= op "lower") (str "_fl_lower(" as ")")]
1221
+ [(= op "repeat") (str "_fl_repeat(" as ")")]
1222
+ [(= op "index-of") (str "_fl_index_of(" as ")")]
1223
+ ;; ─── List 추가 (map, filter, reduce, find, every?, some?, sort, reverse, flatten, distinct, range, take, drop, count) ───
1224
+ [(= op "map") (str "_fl_map(" as ")")]
1225
+ [(= op "filter") (str "_fl_filter(" as ")")]
1226
+ [(= op "reduce") (str "_fl_reduce(" as ")")]
1227
+ [(= op "find") (str "_fl_find(" as ")")]
1228
+ [(= op "every?") (str "_fl_every(" as ")")]
1229
+ [(= op "some?") (str "_fl_some(" as ")")]
1230
+ [(= op "sort") (str "_fl_sort(" as ")")]
1231
+ [(= op "reverse") (str "_fl_reverse(" as ")")]
1232
+ [(= op "flatten") (str "_fl_flatten(" as ")")]
1233
+ [(= op "distinct") (str "_fl_distinct(" as ")")]
1234
+ ;; ─── Database (8, placeholder for JS env) ───
1235
+ [(= op "pg_exec") (str "_fl_pg_exec(" as ")")]
1236
+ [(= op "pg_query") (str "_fl_pg_query(" as ")")]
1237
+ [(= op "pg_connect") (str "_fl_pg_connect(" as ")")]
1238
+ [(= op "mariadb_exec") (str "_fl_mariadb_exec(" as ")")]
1239
+ [(= op "mariadb_query") (str "_fl_mariadb_query(" as ")")]
1240
+ [(= op "mariadb_one") (str "_fl_mariadb_one(" as ")")]
1241
+ [(= op "db_query") (str "_fl_db_query(" as ")")]
1242
+ [(= op "db_exec") (str "_fl_db_exec(" as ")")]
1243
+ ;; ─── Server/HTTP (placeholder) ───
1244
+ [(= op "server_post") (str "_fl_server_post(" as ")")]
1245
+ [(= op "server_get") (str "_fl_server_get(" as ")")]
1246
+ [(= op "server_put") (str "_fl_server_put(" as ")")]
1247
+ [(= op "server_delete") (str "_fl_server_delete(" as ")")]
1248
+ [(= op "server_start") (str "_fl_server_start(" as ")")]
1249
+ [(= op "server_stop") (str "_fl_server_stop(" as ")")]
1250
+ [(= op "http_get") (str "_fl_http_get(" as ")")]
1251
+ [(= op "http_post") (str "_fl_http_post(" as ")")]
1252
+ [(= op "ws_send") (str "_fl_ws_send(" as ")")]
1253
+ [true (str (js-name (if (= (char-at op 0) "$") (substring op 1 (length op)) op)) "(" as ")")])]
1254
+ [FUNC cg-native :params [op args]
1255
+ :body (cg-native-dispatch op (cg-args args))]
1256
+ [FUNC cg-call :params [op args]
1257
+ :body (let [[fn-name (js-name (if (= (char-at op 0) "$") (substring op 1 (length op)) op))]]
1258
+ (str fn-name "(" (cg-args args) ")"))]
1259
+ ;; ═══════ sexpr 메인 dispatch ═══════
1260
+ [FUNC cg-sexpr-dispatch :params [op args]
1261
+ :body (cond
1262
+ [(= op "if") (cg-if args)]
1263
+ [(= op "fn") (cg-fn args)]
1264
+ [(= op "defn") (cg-defn args)]
1265
+ [(= op "define") (cg-define args)]
1266
+ [(= op "let") (cg-let args)]
1267
+ [(= op "do") (cg-do args)]
1268
+ [(= op "begin") (cg-do args)]
1269
+ [(= op "cond") (cg-cond args)]
1270
+ [(= op "and") (cg-and args)]
1271
+ [(= op "or") (cg-or args)]
1272
+ [(= op "quote") (cg-quote args)]
1273
+ [(= op "set!") (cg-set! args)]
1274
+ [(= op "throw") (cg-throw args)]
1275
+ [(= op "try") (cg-try args)]
1276
+ [(= op "while") (cg-while args)]
1277
+ [(= op "loop") (cg-loop args)]
1278
+ [(= op "recur") (cg-recur args)]
1279
+ [(= op "defstruct") (cg-defstruct args)]
1280
+ [(= op "compose") (cg-compose args)]
1281
+ [(= op "pipe") (cg-pipe args)]
1282
+ [(= op "->") (cg-thread-first args)]
1283
+ [(= op "->>") (cg-thread-last args)]
1284
+ [(= op "|>") (cg-thread-first args)]
1285
+ [(= op "call") (cg-call-form args)]
1286
+ [(= op "async") (cg-async args)]
1287
+ [(= op "await") (cg-await args)]
1288
+ [(= op "+") (cg-binop args "+" "0")]
1289
+ [(= op "-") (cg-sub args)]
1290
+ [(= op "*") (cg-binop args "*" "1")]
1291
+ [(= op "/") (cg-pair args "/")]
1292
+ [(= op "%") (cg-pair args "%")]
1293
+ [(= op "<") (cg-pair args "<")]
1294
+ [(= op ">") (cg-pair args ">")]
1295
+ [(= op "<=") (cg-pair args "<=")]
1296
+ [(= op ">=") (cg-pair args ">=")]
1297
+ [(= op "=") (cg-pair args "===")]
1298
+ [(= op "!=") (cg-pair args "!==")]
1299
+ [true (cg-native op args)])]
1300
+ [FUNC cg-sexpr :params [n]
1301
+ :body (cg-sexpr-dispatch (get n :op) (get n :args))]
1302
+ ;; ═══════ 런타임 prelude (생성 JS 앞에 삽입) ═══════
1303
+ ;; 분할 구조: 각 부분을 따로 정의하여 stack overflow 방지
1304
+ [FUNC prelude-string :params []
1305
+ :body (str
1306
+ "const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');"
1307
+ "const _fl_length = (x) => (x==null ? 0 : x.length);"
1308
+ "const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));"
1309
+ "const _fl_char_at = (s, i) => (s[i] || null);"
1310
+ "const _fl_replace = (s, a, b) => s.split(a).join(b);"
1311
+ "const _fl_starts_with = (s, p) => s.startsWith(p);"
1312
+ "const _fl_ends_with = (s, p) => s.endsWith(p);"
1313
+ "const _fl_contains = (s, p) => s.includes(p);"
1314
+ "const _fl_split = (s, sep) => s.split(sep);"
1315
+ "const _fl_join = (l, sep) => l.join(sep==null?'':sep);"
1316
+ "const _fl_trim = (s) => s.trim();"
1317
+ "const _fl_upper = (s) => s.toUpperCase();"
1318
+ "const _fl_lower = (s) => s.toLowerCase();"
1319
+ "const _fl_repeat = (s, n) => s.repeat(n);"
1320
+ "const _fl_index_of = (s, p) => s.indexOf(p);")]
1321
+ [FUNC prelude-list :params []
1322
+ :body (str
1323
+ "const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);"
1324
+ "const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);"
1325
+ "const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));"
1326
+ "const _fl_append = (...xs) => xs.reduce((acc, x) => Array.isArray(x) ? [...acc, ...x] : [...acc, x], []);"
1327
+ "const _fl_slice = (l, a, b) => l.slice(a, b);"
1328
+ "const _fl_map = (f, l) => l.map(x => f(x));"
1329
+ "const _fl_filter = (f, l) => l.filter(x => f(x));"
1330
+ "const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);"
1331
+ "const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);"
1332
+ "const _fl_every = (f, l) => l.every(x => f(x));"
1333
+ "const _fl_some = (f, l) => l.some(x => f(x));"
1334
+ "const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));"
1335
+ "const _fl_reverse = (l) => [...l].reverse();"
1336
+ "const _fl_flatten = (l) => l.flat(Infinity);"
1337
+ "const _fl_distinct = (l) => [...new Set(l)];"
1338
+ "const _fl_range = (a, b, s) => { let r=[]; let step=s||1; for(let i=a;i<b;i+=step)r.push(i); return r; };"
1339
+ "const _fl_take = (n, l) => l.slice(0, n);"
1340
+ "const _fl_drop = (n, l) => l.slice(n);")]
1341
+ [FUNC prelude-map :params []
1342
+ :body (str
1343
+ "const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));"
1344
+ "const _fl_keys = (o) => (o==null ? [] : Object.keys(o));"
1345
+ "const _fl_values = (o) => (o==null ? [] : Object.values(o));"
1346
+ "const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));"
1347
+ "const _fl_has_key = (o, k) => (o!=null && k in o);"
1348
+ "const _fl_map_set = (o, k, v) => ({...o, [k]: v});"
1349
+ "const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };"
1350
+ "const _fl_merge = (...os) => Object.assign({}, ...os);"
1351
+ "const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));"
1352
+ "const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);"
1353
+ "const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);"
1354
+ "const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);"
1355
+ "const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);")]
1356
+ [FUNC prelude-time-regex :params []
1357
+ :body (str
1358
+ "const now = () => Date.now();"
1359
+ "const now_ms = () => Date.now();"
1360
+ "const now_iso = () => new Date().toISOString();"
1361
+ "const now_unix = () => Math.floor(Date.now()/1000);"
1362
+ "const regex_match = (s, p) => new RegExp(p).test(s);"
1363
+ "const regex_find = (s, p) => { const m = s.match(new RegExp(p)); return m ? m[0] : null; };"
1364
+ "const regex_find_all = (s, p) => s.match(new RegExp(p, 'g')) || [];"
1365
+ "const regex_replace = (s, p, r) => s.replace(new RegExp(p, 'g'), r);"
1366
+ "const regex_split = (s, p) => s.split(new RegExp(p));"
1367
+ "const regex_count = (s, p) => (s.match(new RegExp(p, 'g')) || []).length;"
1368
+ "const regex_extract = (s, p) => { const m = s.match(new RegExp(p)); return m ? m.slice(1) : []; };")]
1369
+ [FUNC prelude-io-misc :params []
1370
+ :body (str
1371
+ "const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');"
1372
+ "const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);"
1373
+ "const _fl_file_exists = (p) => require('fs').existsSync(p);"
1374
+ "const _fl_shell_capture = (cmd) => { try { const {execSync}=require('child_process'); return {stdout:execSync(cmd,{encoding:'utf8'}),stderr:'',code:0}; } catch(e) { return {stdout:'',stderr:String(e),code:1}; } };"
1375
+ "const _fl_empty_q = (x) => (x==null || x.length===0);"
1376
+ "const _fl_nil_q = (x) => (x == null || x === undefined);"
1377
+ "const _fl_nil_or_empty_q = (x) => (x == null || x === undefined || (x && x.length === 0));"
1378
+ "const __argv__ = process.argv.slice(2);")]
1379
+ [FUNC prelude-db-server :params []
1380
+ :body (str
1381
+ "const _fl_pg_exec = (db,sql,...args) => null;"
1382
+ "const _fl_pg_query = (db,sql,...args) => [];"
1383
+ "const _fl_pg_connect = (cfg) => null;"
1384
+ "const _fl_mariadb_exec = (db,sql,...args) => null;"
1385
+ "const _fl_mariadb_query = (db,sql,...args) => [];"
1386
+ "const _fl_mariadb_one = (db,sql,...args) => null;"
1387
+ "const _fl_db_query = (path,sql,...args) => [];"
1388
+ "const _fl_db_exec = (path,sql,...args) => null;"
1389
+ "const _fl_server_post = (path,fn) => null;"
1390
+ "const _fl_server_get = (path,fn) => null;"
1391
+ "const _fl_server_put = (path,fn) => null;"
1392
+ "const _fl_server_delete = (path,fn) => null;"
1393
+ "const _fl_server_start = (port) => null;"
1394
+ "const _fl_server_stop = () => null;"
1395
+ "const _fl_http_get = (url) => '';"
1396
+ "const _fl_http_post = (url,body) => '';"
1397
+ "const _fl_ws_send = (sid,data) => null;")]
1398
+ [FUNC prelude-parts :params []
1399
+ :body [(prelude-string) (prelude-list) (prelude-map) (prelude-time-regex) (prelude-io-misc) (prelude-db-server)]]
1400
+ [FUNC runtime-prelude :params []
1401
+ :body (str "const nil = null;" (reduce (fn [acc part] (str acc part)) "" (prelude-parts)))]
1402
+ ;; ═══════ 최상위 ═══════
1403
+ [FUNC fl->js-code :params [ast]
1404
+ :body (reduce (fn [acc node] (str acc (cg node) ";\n")) "" ast)]
1405
+ [FUNC fl->js-with-prelude :params [ast]
1406
+ :body (let [[p (runtime-prelude)]]
1407
+ (let [[c (fl->js-code ast)]]
1408
+ (str p "\n" c)))]
1409
+ ;; ═══════ driver ═══════
1410
+ ;; 사용법: node bootstrap.js run self/codegen.fl <input.fl> [<output.js>]
1411
+ ;; 인자 없이 실행하면 FUNC 등록만 하고 종료.
1412
+ [FUNC compile-file :params [input output]
1413
+ :body (let [[src (file_read input)]
1414
+ [tokens (lex src)]
1415
+ [ast (parse tokens)]
1416
+ [js (fl->js-with-prelude ast)]]
1417
+ (file_write output js)
1418
+ (println (str "compiled " input " -> " output " size=" (length js))))]
1419
+ (if (null? __argv__) null
1420
+ (if (= (length __argv__) 0) null
1421
+ (compile-file (get __argv__ 0)
1422
+ (if (>= (length __argv__) 2) (get __argv__ 1)
1423
+ (str (get __argv__ 0) ".out.js")))))