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.
- package/.config/jest.config.js +47 -0
- package/.config/jest.fast.config.js +9 -0
- package/.config/openapi.yaml +457 -0
- package/.config/tsconfig.json +30 -0
- package/.github/CODE_OF_CONDUCT.md +176 -0
- package/.github/CONTRIBUTING.md +296 -0
- package/.github/DISCUSSIONS.md +179 -0
- package/.github/ISSUE_TEMPLATE/bug-report.md +44 -0
- package/.github/ISSUE_TEMPLATE/feature-request.md +39 -0
- package/.github/pull_request_template.md +87 -0
- package/.github/workflows/phase-3c-l2-proof.yml +101 -0
- package/.github/workflows/phase-c-full-slack.yml +409 -0
- package/.github/workflows/phase-c-full.yml +241 -0
- package/.github/workflows/phase-c-scan.yml +64 -0
- package/.gitmodules +3 -0
- package/.tmp.js +3 -0
- package/CHANGELOG.md +1182 -0
- package/CLAUDE.md +633 -0
- package/Dockerfile +3 -0
- package/LICENSE +21 -0
- package/MISTAKES-COVERAGE.json +115 -0
- package/Makefile +95 -0
- package/PHASE-F-ROADMAP.md +554 -0
- package/README.md +459 -0
- package/SELF_HOSTING_CHECKLIST.md +155 -0
- package/benchmark-freelang.fl +47 -0
- package/benchmark-results.json +37 -0
- package/benchmark-simple.fl +38 -0
- package/bin/freelang-migrate +310 -0
- package/bin/freelang-smart +258 -0
- package/bootstrap.js +1134 -0
- package/docker-compose.yml +3 -0
- package/docs/AI_FRIENDLINESS.md +181 -0
- package/docs/AI_LEARNING_PATH.md +542 -0
- package/docs/AI_MAINTENANCE.md +153 -0
- package/docs/AI_QUICKSTART.md +380 -0
- package/docs/AI_REFERENCE.md +559 -0
- package/docs/AI_RELIABILITY_GUIDE.md +597 -0
- package/docs/AKL_ARCHITECTURE.md +228 -0
- package/docs/AKL_P0_KIMDB.md +215 -0
- package/docs/API.md +380 -0
- package/docs/ARCHITECTURE.md +208 -0
- package/docs/CHANGELOG.md +1014 -0
- package/docs/CLAUDE.md +991 -0
- package/docs/CLAUDE_AI.md +210 -0
- package/docs/CODEGEN_IMPROVEMENTS.md +158 -0
- package/docs/CODE_OF_CONDUCT.md +337 -0
- package/docs/CONTRIBUTING.md +437 -0
- package/docs/CRON_AUTOMATION.md +97 -0
- package/docs/DEPLOYMENT.md +357 -0
- package/docs/DETERMINISM_GUIDE.md +174 -0
- package/docs/HUMAN_GUIDE.md +599 -0
- package/docs/INDEX.md +199 -0
- package/docs/INLINE_TEST_GUIDE.md +231 -0
- package/docs/LANGUAGE-FAULTS.md +583 -0
- package/docs/LANGUAGE_IMPROVEMENT_REQUESTS.md +187 -0
- package/docs/LEARNING.md +257 -0
- package/docs/MISTAKES-100.md +52 -0
- package/docs/MISTAKES.md +131 -0
- package/docs/NAMING_CONVENTIONS.md +158 -0
- package/docs/NIGHTLY-MONITORING.md +222 -0
- package/docs/OFFICIAL_LANGUAGE.md +249 -0
- package/docs/ONBOARDING_1HOUR.md +210 -0
- package/docs/PERFORMANCE.md +329 -0
- package/docs/PHASE-3C-L2-PROOF-PLAN.md +282 -0
- package/docs/PHASE-3C-L2-RESULTS.md +183 -0
- package/docs/PHASE-3D-AI-LIBRARY.md +170 -0
- package/docs/PHASE-3E-VM-OPTIMIZATION.md +192 -0
- package/docs/PHASE-C-CI.md +242 -0
- package/docs/PHASE-C-PR-CHECKLIST.md +267 -0
- package/docs/PHASE-C-ROADMAP.md +141 -0
- package/docs/PHASE-C-SCAN.md +205 -0
- package/docs/PHASE-G-ROADMAP.md +228 -0
- package/docs/PHASE-X-V11.5-ROADMAP.md +267 -0
- package/docs/PHASE4_IMPLEMENTATION_PLAN.md +290 -0
- package/docs/PHASE5-COMPLETION.md +186 -0
- package/docs/PHASE5-SUMMARY.md +82 -0
- package/docs/PLUGIN_GUIDE.md +241 -0
- package/docs/PROJECT_OVERVIEW_KO.md +66 -0
- package/docs/QUICKSTART.md +160 -0
- package/docs/README.md +192 -0
- package/docs/RESERVED.md +125 -0
- package/docs/ROADMAP.md +191 -0
- package/docs/SECURITY.md +518 -0
- package/docs/SETUP.md +127 -0
- package/docs/SLACK-SETUP.md +190 -0
- package/docs/STATE_OF_V11.md +74 -0
- package/docs/STDLIB_NAMING_AUDIT.md +154 -0
- package/docs/STDLIB_REFERENCE.md +2722 -0
- package/docs/STYLE_GUIDE.md +559 -0
- package/docs/TASK5-MAP-DESTRUCTURE-DESIGN.md +136 -0
- package/docs/TOOLS.md +357 -0
- package/docs/TYPE_SYSTEM_GUIDE.md +201 -0
- package/docs/UI-PATTERN.md +265 -0
- package/docs/V11.5-RULES.md +416 -0
- package/docs/V11.6-HARNESS-RULES.md +222 -0
- package/docs/V11.6-MULTI-AGENT-PLAN.md +265 -0
- package/docs/V11.6-STABILIZATION-PLAN.md +290 -0
- package/docs/Y4-2B_DRY_RUN.md +142 -0
- package/docs/_classifications.json +882 -0
- package/docs/api/stdlib.md +134 -0
- package/docs/blog/2026-04-17-v11-ai-first-evolution.md +223 -0
- package/docs/blog/2026-04-20-self-hosting-fixedpoint.md +269 -0
- package/docs/blog/2026-05-04-mistakes-are-language-faults.md +267 -0
- package/docs/blog/2026-05-04-mistakes-coverage-honest.md +170 -0
- package/docs/blog/2026-05-04-phase-g-followup-smart-wrapper.md +188 -0
- package/docs/blog/2026-05-04-phase-g-mistakes-100.md +269 -0
- package/docs/blog/2026-05-04-phase-x-v11.5-launch.md +224 -0
- package/docs/blog/2026-05-04-v11.5.0-real-language-change.md +252 -0
- package/docs/blog-demo/README.md +44 -0
- package/docs/examples/index.md +78 -0
- package/docs/examples/todo-app.md +99 -0
- package/docs/guide/ai-blocks.md +335 -0
- package/docs/guide/basics.md +235 -0
- package/docs/guide/frameworks.md +319 -0
- package/docs/homepage/README.md +164 -0
- package/docs/index.md +183 -0
- package/docs/v12-DESIGN.md +214 -0
- package/examples/README.md +26 -0
- package/examples/browser-test.html +149 -0
- package/examples/csv-tool/analyze.fl +222 -0
- package/examples/csv-tool/employees.csv +16 -0
- package/examples/csv-tool/products.csv +21 -0
- package/examples/factorial.fl +9 -0
- package/examples/fib30.fl +4 -0
- package/examples/hello.fl +2 -0
- package/examples/hello.fl.js +3 -0
- package/examples/learning-session/01-grade-stats.fl +49 -0
- package/examples/learning-session/02-class-stats.fl +52 -0
- package/examples/learning-session/03-cart.fl +61 -0
- package/examples/learning-session/04-word-freq.fl +57 -0
- package/examples/learning-session/05-todo.fl +69 -0
- package/examples/learning-session/06-library.fl +76 -0
- package/examples/learning-session/07-currency.fl +99 -0
- package/examples/learning-session/08-csv-grades.fl +104 -0
- package/examples/learning-session/09-calc-repl.fl +92 -0
- package/examples/learning-session/10-contacts.fl +109 -0
- package/examples/learning-session/11-markdown.fl +107 -0
- package/examples/learning-session/12-calendar.fl +87 -0
- package/examples/learning-session/13-statistics.fl +123 -0
- package/examples/learning-session/14-primes.fl +107 -0
- package/examples/learning-session/15-statistics.fl +123 -0
- package/examples/learning-session/16-calendar.fl +87 -0
- package/examples/learning-session/17-markdown.fl +107 -0
- package/examples/learning-session/18-contacts.fl +109 -0
- package/examples/learning-session/19-json-serializer.fl +86 -0
- package/examples/learning-session/20-template.fl +201 -0
- package/examples/learning-session/21-calc-parser.fl +148 -0
- package/examples/learning-session/22-table.fl +96 -0
- package/examples/patterns/01-map-filter-reduce.fl +50 -0
- package/examples/patterns/02-error-handling.fl +51 -0
- package/examples/patterns/03-type-validation.fl +57 -0
- package/examples/patterns/04-state-management.fl +44 -0
- package/examples/patterns/05-api-integration.fl +95 -0
- package/examples/patterns/06-database-operations.fl +113 -0
- package/examples/patterns/07-string-processing.fl +86 -0
- package/examples/patterns/08-data-transformation.fl +92 -0
- package/examples/patterns/09-decision-logic.fl +122 -0
- package/examples/patterns/10-agent-orchestration.fl +184 -0
- package/examples/patterns/README.md +344 -0
- package/examples/simple-server.fl +29 -0
- package/examples/tables-app.fl +219 -0
- package/examples/test-libs.fl +272 -0
- package/jest.config.js +4 -0
- package/lib/datetime.fl +123 -0
- package/lib/http-client.fl +129 -0
- package/lib/pipeline.fl +150 -0
- package/lib/query.fl +160 -0
- package/lib/result.fl +124 -0
- package/lib/template.fl +161 -0
- package/lib/validate.fl +136 -0
- package/package.json +58 -0
- package/scripts/ai-eval.js +318 -0
- package/scripts/ai-self-verify.js +200 -0
- package/scripts/ai-validate.js +302 -0
- package/scripts/bench.sh +71 -0
- package/scripts/benchmark.js +258 -0
- package/scripts/benchmark.sh +99 -0
- package/scripts/build-binary.sh +68 -0
- package/scripts/build-runtime.sh +46 -0
- package/scripts/build-stage1-final.sh +58 -0
- package/scripts/build-stage1.sh +119 -0
- package/scripts/build-standalone.sh +17 -0
- package/scripts/build.js +130 -0
- package/scripts/check-let-regressions.js +95 -0
- package/scripts/check-parens.py +117 -0
- package/scripts/check-ports.sh +49 -0
- package/scripts/check-syntax.js +30 -0
- package/scripts/cli-extras.js +135 -0
- package/scripts/cron-daily-verify.sh +101 -0
- package/scripts/deploy.sh +91 -0
- package/scripts/dev.sh +37 -0
- package/scripts/extract-fl-examples.js +29 -0
- package/scripts/extract-runtime-helpers.js +122 -0
- package/scripts/fl-compile.sh +14 -0
- package/scripts/fl-fixpoint.sh +28 -0
- package/scripts/fl-repl.sh +21 -0
- package/scripts/fl-run.sh +41 -0
- package/scripts/fl-serve.sh +25 -0
- package/scripts/fuzz-compiler.js +92 -0
- package/scripts/gen-ai-prompt.js +340 -0
- package/scripts/gen-fixtures.js +166 -0
- package/scripts/gen-mistakes-split.js +199 -0
- package/scripts/gen-stdlib-docs.js +69 -0
- package/scripts/lint-stdlib-aliases.js +166 -0
- package/scripts/measure-baseline.sh +43 -0
- package/scripts/property-test.js +885 -0
- package/scripts/push-to-gogs.sh +60 -0
- package/scripts/regression-scan.js +132 -0
- package/scripts/run-jest-shard.sh +85 -0
- package/scripts/safe-push.sh +37 -0
- package/scripts/scan-fl-tokens.js +170 -0
- package/scripts/scan-for-fl-tokens.sh +17 -0
- package/scripts/self-diff.sh +95 -0
- package/scripts/snapshot-v0.sh +35 -0
- package/scripts/test-l2-fixpoint.sh +54 -0
- package/scripts/verify-all.sh +130 -0
- package/scripts/verify-build-deterministic.sh +110 -0
- package/scripts/verify-c7-bootstrap.sh +150 -0
- package/scripts/verify-c8-fixed-point-simple.sh +121 -0
- package/scripts/verify-c8-fixed-point.sh +133 -0
- package/scripts/verify-c9-fuzzing.sh +214 -0
- package/scripts/verify-fixed-point-deep.sh +133 -0
- package/scripts/verify-fixed-point.sh +65 -0
- package/scripts/verify-l2-proof.sh +153 -0
- package/scripts/verify-l3-proof.sh +40 -0
- package/scripts/verify-mistakes-coverage.js +120 -0
- package/scripts/verify-self-host.sh +509 -0
- package/self/CHANGELOG.md +964 -0
- package/self/COMPILER_REDESIGN_FAILURES.md +59 -0
- package/self/INTEGRATION-CHECKLIST.md +113 -0
- package/self/README.md +34 -0
- package/self/all.fl +1353 -0
- package/self/ast.fl +219 -0
- package/self/ast.self.js +47 -0
- package/self/bench/_bi_json-parse.js +46 -0
- package/self/bench/_bi_json-str.js +60 -0
- package/self/bench/_bi_list-distinct.js +37 -0
- package/self/bench/_bi_list-filter-even.js +56 -0
- package/self/bench/_bi_list-first.js +29 -0
- package/self/bench/_bi_list-last.js +28 -0
- package/self/bench/_bi_list-map-inc.js +41 -0
- package/self/bench/_bi_list-range.js +22 -0
- package/self/bench/_bi_list-reduce-sum.js +50 -0
- package/self/bench/_bi_list-reverse.js +28 -0
- package/self/bench/_bi_list-sort.js +35 -0
- package/self/bench/_bi_list-take.js +36 -0
- package/self/bench/_bi_m-abs.js +24 -0
- package/self/bench/_bi_m-floor.js +22 -0
- package/self/bench/_bi_m-max.js +26 -0
- package/self/bench/_bi_m-min.js +26 -0
- package/self/bench/_bi_m-mod.js +21 -0
- package/self/bench/_bi_map-has.js +50 -0
- package/self/bench/_bi_map-keys.js +50 -0
- package/self/bench/_bi_map-values.js +52 -0
- package/self/bench/_bi_str-concat.js +36 -0
- package/self/bench/_bi_str-contains.js +43 -0
- package/self/bench/_bi_str-ends.js +45 -0
- package/self/bench/_bi_str-index.js +34 -0
- package/self/bench/_bi_str-lower.js +23 -0
- package/self/bench/_bi_str-repeat.js +26 -0
- package/self/bench/_bi_str-split.js +41 -0
- package/self/bench/_bi_str-starts.js +47 -0
- package/self/bench/_bi_str-trim.js +26 -0
- package/self/bench/_bi_str-upper.js +23 -0
- package/self/bench/_bi_t-list.js +24 -0
- package/self/bench/_bi_t-null.js +23 -0
- package/self/bench/_bi_t-number.js +23 -0
- package/self/bench/_bi_t-string.js +25 -0
- package/self/bench/_bi_t-typeof.js +25 -0
- package/self/bench/_c_parse_probe.fl +426 -0
- package/self/bench/_c_parse_probe.js +67 -0
- package/self/bench/_codegen_nodrv.fl +751 -0
- package/self/bench/_combined2.fl +423 -0
- package/self/bench/_combined_arr.fl +422 -0
- package/self/bench/_combined_astprobe.fl +429 -0
- package/self/bench/_combined_astprobe.js +69 -0
- package/self/bench/_combined_cg.fl +424 -0
- package/self/bench/_combined_cg.js +64 -0
- package/self/bench/_combined_lex.fl +421 -0
- package/self/bench/_combined_trace.fl +435 -0
- package/self/bench/_combined_trace.js +75 -0
- package/self/bench/_ext_abs-neg.js +2 -0
- package/self/bench/_ext_and.js +2 -0
- package/self/bench/_ext_cond-1.js +2 -0
- package/self/bench/_ext_cond-2.js +2 -0
- package/self/bench/_ext_do-seq.js +2 -0
- package/self/bench/_ext_fact20.js +3 -0
- package/self/bench/_ext_fib25.js +3 -0
- package/self/bench/_ext_length.js +2 -0
- package/self/bench/_ext_let-1d.js +18 -0
- package/self/bench/_ext_let-2d.js +2 -0
- package/self/bench/_ext_list-sum.js +3 -0
- package/self/bench/_ext_math.js +2 -0
- package/self/bench/_ext_or.js +2 -0
- package/self/bench/_ext_str.js +2 -0
- package/self/bench/_fact15.js +2 -0
- package/self/bench/_fb_fact15.js +2 -0
- package/self/bench/_fb_func-fact.js +2 -0
- package/self/bench/_fb_func-multi.js +2 -0
- package/self/bench/_fb_func-mutual.js +3 -0
- package/self/bench/_fb_func-simple.js +21 -0
- package/self/bench/_fib.js +2 -0
- package/self/bench/_fn_async-await-seq.js +40 -0
- package/self/bench/_fn_async-await.js +3 -0
- package/self/bench/_fn_async-print.js +26 -0
- package/self/bench/_fn_async-result.js +1 -0
- package/self/bench/_fn_call-form.js +24 -0
- package/self/bench/_fn_compose.js +37 -0
- package/self/bench/_fn_pipe.js +34 -0
- package/self/bench/_fn_thread-first-sexpr.js +31 -0
- package/self/bench/_fn_thread-first.js +25 -0
- package/self/bench/_fn_thread-last.js +31 -0
- package/self/bench/_generated.js +35 -0
- package/self/bench/_mt_match-default.js +51 -0
- package/self/bench/_mt_match-num.js +58 -0
- package/self/bench/_mt_match-str.js +56 -0
- package/self/bench/_mt_match-var.js +32 -0
- package/self/bench/_mt_match-wild.js +36 -0
- package/self/bench/_mt_struct-make.js +81 -0
- package/self/bench/_mt_struct-tag.js +81 -0
- package/self/bench/_probe.fl +1 -0
- package/self/bench/_probe2.fl +1 -0
- package/self/bench/_probe3.fl +3 -0
- package/self/bench/_probe_apply.fl +1 -0
- package/self/bench/_probe_args.fl +7 -0
- package/self/bench/_probe_arr.fl +7 -0
- package/self/bench/_probe_arr2.fl +5 -0
- package/self/bench/_probe_block.fl +7 -0
- package/self/bench/_probe_call.fl +1 -0
- package/self/bench/_probe_cg.fl +27 -0
- package/self/bench/_probe_compose.fl +13 -0
- package/self/bench/_probe_define.fl +1 -0
- package/self/bench/_probe_keys.fl +5 -0
- package/self/bench/_probe_length.fl +5 -0
- package/self/bench/_probe_lexparse.fl +4 -0
- package/self/bench/_probe_loop.fl +12 -0
- package/self/bench/_probe_map.fl +8 -0
- package/self/bench/_probe_map2.fl +8 -0
- package/self/bench/_probe_map3.fl +5 -0
- package/self/bench/_probe_mapkeys.fl +5 -0
- package/self/bench/_probe_mapv12.fl +1 -0
- package/self/bench/_probe_mapv12.js +2 -0
- package/self/bench/_probe_match.fl +1 -0
- package/self/bench/_probe_match2.fl +1 -0
- package/self/bench/_probe_neg.fl +7 -0
- package/self/bench/_probe_neg2.fl +3 -0
- package/self/bench/_probe_protocol.fl +7 -0
- package/self/bench/_probe_self_parse.fl +6 -0
- package/self/bench/_probe_struct.fl +1 -0
- package/self/bench/_probe_true.fl +3 -0
- package/self/bench/_probe_true2.fl +6 -0
- package/self/bench/_probe_v12_cg.fl +7 -0
- package/self/bench/_probe_v12_extract.fl +8 -0
- package/self/bench/_probe_v12_extract.js +7 -0
- package/self/bench/_probe_v12_internal.fl +21 -0
- package/self/bench/_probe_v12_map_ast.fl +12 -0
- package/self/bench/_rs_combo.js +3 -0
- package/self/bench/_rs_gcd.js +36 -0
- package/self/bench/_rs_grade.js +2 -0
- package/self/bench/_rs_mutual-fib.js +2 -0
- package/self/bench/_rs_range-sum.js +2 -0
- package/self/bench/_rs_sum-10k.js +2 -0
- package/self/bench/_rs_sum-5k.js +2 -0
- package/self/bench/_sf_loop-fact-10.js +73 -0
- package/self/bench/_sf_loop-sum-10k.js +87 -0
- package/self/bench/_sf_set-x.js +40 -0
- package/self/bench/_sf_throw-catch.js +1 -0
- package/self/bench/_sf_while-5.js +62 -0
- package/self/bench/_v12_combined.fl +1184 -0
- package/self/bench/_v12_extract_test.fl +14 -0
- package/self/bench/_v12_extract_test.js +7 -0
- package/self/bench/_v12_inspect.js +26 -0
- package/self/bench/_v12_inspect_mod.js +137 -0
- package/self/bench/_v12_makevartest.fl +8 -0
- package/self/bench/_v12_makevartest.js +6 -0
- package/self/bench/_v12_parse_probe.fl +9 -0
- package/self/bench/_v12_parse_trace.fl +18 -0
- package/self/bench/_v12_simple_fn.fl +2 -0
- package/self/bench/_v12_simple_fn.js +3 -0
- package/self/bench/_v12_trace.fl +2 -0
- package/self/bench/_v12_trace.js +3 -0
- package/self/bench/collection.js +13 -0
- package/self/bench/fib30.fl +4 -0
- package/self/bench/final-test.fl +12 -0
- package/self/bench/final-test.js +2 -0
- package/self/bench/fp1-v12.js +4 -0
- package/self/bench/fp1.fl +3 -0
- package/self/bench/fp1.fp.js +4 -0
- package/self/bench/fp2-v12.js +4 -0
- package/self/bench/fp2.fl +3 -0
- package/self/bench/fp2.fp.js +4 -0
- package/self/bench/fp3-v12.js +8 -0
- package/self/bench/fp3.fl +11 -0
- package/self/bench/fp3.fp.js +8 -0
- package/self/bench/fp4-v12.js +6 -0
- package/self/bench/fp4.fl +9 -0
- package/self/bench/fp4.fp.js +6 -0
- package/self/bench/hello-sample.fl +3 -0
- package/self/bench/hello-sample.js +4 -0
- package/self/bench/hello.fl +1 -0
- package/self/bench/json.js +9 -0
- package/self/bench/json1mb.fl +3 -0
- package/self/bench/math.js +8 -0
- package/self/bench/realworld.fl +17 -0
- package/self/bench/realworld.js +8 -0
- package/self/bench/regex.js +10 -0
- package/self/bench/sample.json +1 -0
- package/self/bench/string.js +7 -0
- package/self/bench/test-ffi.fl +3 -0
- package/self/bench/test-ffi.js +2 -0
- package/self/bench/test-hof-advanced.fl +7 -0
- package/self/bench/test-hof-advanced.js +2 -0
- package/self/bench/test-hof.fl +5 -0
- package/self/bench/test-hof.js +2 -0
- package/self/bench/test-output.txt +1 -0
- package/self/bench/test-phase15-integration.fl +16 -0
- package/self/bench/test-phase15-integration.js +3 -0
- package/self/bench/test-phase19-complete.fl +24 -0
- package/self/bench/test-phase19-complete.js +2 -0
- package/self/bench/test-stdlib-codegen.fl +9 -0
- package/self/bench/test-stdlib-codegen.js +2 -0
- package/self/bench/test-time.fl +8 -0
- package/self/bench/test-time.js +2 -0
- package/self/bench/time.js +9 -0
- package/self/bench/tiny-v12.js +2 -0
- package/self/bench/tiny.fl +1 -0
- package/self/builtins/core.fl +150 -0
- package/self/char-class.fl +45 -0
- package/self/codegen-core.fl +733 -0
- package/self/codegen-final.fl +135 -0
- package/self/codegen.fl +379 -0
- package/self/codegen.fl.bak +856 -0
- package/self/codegen.self.js +75 -0
- package/self/examples/agent-loop.fl +32 -0
- package/self/examples/ci-cd-example.fl +114 -0
- package/self/examples/cloud-real.fl +134 -0
- package/self/examples/docker-example.fl +67 -0
- package/self/examples/fullstack-app.fl +330 -0
- package/self/examples/k8s-example.fl +91 -0
- package/self/examples/microservices.fl +448 -0
- package/self/examples/rest-api.fl +253 -0
- package/self/examples/style-example.fl +133 -0
- package/self/examples/workflow-orchestration.fl +44 -0
- package/self/fixtures/eval/add.fl +1 -0
- package/self/fixtures/eval/and-sc.fl +1 -0
- package/self/fixtures/eval/bool-false.fl +1 -0
- package/self/fixtures/eval/bool-true.fl +1 -0
- package/self/fixtures/eval/closure.fl +1 -0
- package/self/fixtures/eval/cmp-eq.fl +1 -0
- package/self/fixtures/eval/cmp-lt.fl +1 -0
- package/self/fixtures/eval/cond-first.fl +1 -0
- package/self/fixtures/eval/define-fn3.fl +1 -0
- package/self/fixtures/eval/define-var.fl +1 -0
- package/self/fixtures/eval/defn-bare.fl +1 -0
- package/self/fixtures/eval/defn-call.fl +1 -0
- package/self/fixtures/eval/div.fl +1 -0
- package/self/fixtures/eval/filter-hof.fl +1 -0
- package/self/fixtures/eval/floor.fl +1 -0
- package/self/fixtures/eval/fn-apply.fl +1 -0
- package/self/fixtures/eval/get-idx.fl +1 -0
- package/self/fixtures/eval/get-key.fl +1 -0
- package/self/fixtures/eval/higher-order.fl +1 -0
- package/self/fixtures/eval/let-bare.fl +1 -0
- package/self/fixtures/eval/let-flat.fl +1 -0
- package/self/fixtures/eval/let-use.fl +1 -0
- package/self/fixtures/eval/list-first.fl +1 -0
- package/self/fixtures/eval/list-last.fl +1 -0
- package/self/fixtures/eval/list-len.fl +1 -0
- package/self/fixtures/eval/map-hof.fl +1 -0
- package/self/fixtures/eval/mod.fl +1 -0
- package/self/fixtures/eval/mul-nested.fl +1 -0
- package/self/fixtures/eval/not.fl +1 -0
- package/self/fixtures/eval/null-p.fl +1 -0
- package/self/fixtures/eval/or-sc.fl +1 -0
- package/self/fixtures/eval/pow.fl +1 -0
- package/self/fixtures/eval/recursion.fl +1 -0
- package/self/fixtures/eval/reduce-hof.fl +1 -0
- package/self/fixtures/eval/replace.fl +1 -0
- package/self/fixtures/eval/sqrt.fl +1 -0
- package/self/fixtures/eval/str-concat.fl +1 -0
- package/self/fixtures/eval/str-num.fl +1 -0
- package/self/fixtures/eval/sub.fl +1 -0
- package/self/fixtures/eval/substring.fl +1 -0
- package/self/fixtures/lex/array.fl +1 -0
- package/self/fixtures/lex/at-atom.fl +1 -0
- package/self/fixtures/lex/block.fl +1 -0
- package/self/fixtures/lex/comment.fl +2 -0
- package/self/fixtures/lex/deep-array.fl +1 -0
- package/self/fixtures/lex/deep-map.fl +1 -0
- package/self/fixtures/lex/deep-nest.fl +1 -0
- package/self/fixtures/lex/dollar-dot.fl +1 -0
- package/self/fixtures/lex/empty-list.fl +1 -0
- package/self/fixtures/lex/empty-str.fl +1 -0
- package/self/fixtures/lex/empty.fl +1 -0
- package/self/fixtures/lex/float.fl +1 -0
- package/self/fixtures/lex/hex.fl +1 -0
- package/self/fixtures/lex/kebab-sym.fl +1 -0
- package/self/fixtures/lex/keyword.fl +1 -0
- package/self/fixtures/lex/leading-zero.fl +1 -0
- package/self/fixtures/lex/long-num.fl +1 -0
- package/self/fixtures/lex/many-args.fl +1 -0
- package/self/fixtures/lex/map.fl +1 -0
- package/self/fixtures/lex/mixed.fl +1 -0
- package/self/fixtures/lex/neg-float.fl +1 -0
- package/self/fixtures/lex/negative.fl +1 -0
- package/self/fixtures/lex/nested.fl +1 -0
- package/self/fixtures/lex/null.fl +1 -0
- package/self/fixtures/lex/pipe-op.fl +1 -0
- package/self/fixtures/lex/route-like.fl +1 -0
- package/self/fixtures/lex/scientific.fl +1 -0
- package/self/fixtures/lex/single-num.fl +1 -0
- package/self/fixtures/lex/small-sexpr.fl +1 -0
- package/self/fixtures/lex/spaces.fl +1 -0
- package/self/fixtures/lex/str-quote.fl +1 -0
- package/self/fixtures/lex/str-tab.fl +1 -0
- package/self/fixtures/lex/string-esc.fl +1 -0
- package/self/fixtures/lex/string.fl +1 -0
- package/self/fixtures/lex/symbol.fl +1 -0
- package/self/fixtures/lex/tabs-nl.fl +3 -0
- package/self/fixtures/lex/true-false.fl +1 -0
- package/self/fixtures/lex/unicode.fl +1 -0
- package/self/fixtures/lex/variable.fl +1 -0
- package/self/fixtures/lex/zero.fl +1 -0
- package/self/fixtures/parse/and-or.fl +1 -0
- package/self/fixtures/parse/array-lit.fl +1 -0
- package/self/fixtures/parse/block-func.fl +1 -0
- package/self/fixtures/parse/compose.fl +1 -0
- package/self/fixtures/parse/cond.fl +1 -0
- package/self/fixtures/parse/define-fn.fl +1 -0
- package/self/fixtures/parse/define-val.fl +1 -0
- package/self/fixtures/parse/defn.fl +1 -0
- package/self/fixtures/parse/do-begin.fl +1 -0
- package/self/fixtures/parse/dotted.fl +1 -0
- package/self/fixtures/parse/empty-fn.fl +1 -0
- package/self/fixtures/parse/empty-list.fl +1 -0
- package/self/fixtures/parse/fn.fl +1 -0
- package/self/fixtures/parse/if-else.fl +1 -0
- package/self/fixtures/parse/if-only.fl +1 -0
- package/self/fixtures/parse/keyword-arg.fl +1 -0
- package/self/fixtures/parse/kw.fl +1 -0
- package/self/fixtures/parse/let-1d.fl +1 -0
- package/self/fixtures/parse/let-2d.fl +1 -0
- package/self/fixtures/parse/let-bare.fl +1 -0
- package/self/fixtures/parse/literal-num.fl +1 -0
- package/self/fixtures/parse/literal-str.fl +1 -0
- package/self/fixtures/parse/loop-recur.fl +1 -0
- package/self/fixtures/parse/map-lit.fl +1 -0
- package/self/fixtures/parse/match-simple.fl +1 -0
- package/self/fixtures/parse/multi-body.fl +1 -0
- package/self/fixtures/parse/nested-arr.fl +1 -0
- package/self/fixtures/parse/nested-block.fl +1 -0
- package/self/fixtures/parse/nested-map.fl +1 -0
- package/self/fixtures/parse/nested.fl +1 -0
- package/self/fixtures/parse/pipe.fl +1 -0
- package/self/fixtures/parse/quote.fl +1 -0
- package/self/fixtures/parse/set-bang.fl +1 -0
- package/self/fixtures/parse/sexpr.fl +1 -0
- package/self/fixtures/parse/str-interp.fl +1 -0
- package/self/fixtures/parse/sym.fl +1 -0
- package/self/fixtures/parse/thread-first.fl +1 -0
- package/self/fixtures/parse/thread-last.fl +1 -0
- package/self/fixtures/parse/try-catch.fl +1 -0
- package/self/fixtures/parse/var.fl +1 -0
- package/self/full-compiler-fixed.fl +1308 -0
- package/self/full-compiler-v1-bloated.fl +1298 -0
- package/self/full-compiler.fl +1301 -0
- package/self/interpreter.fl +351 -0
- package/self/lexer.fl +200 -0
- package/self/lexer.self.js +30 -0
- package/self/main.fl +22 -0
- package/self/parser.fl +241 -0
- package/self/parser.self.js +33 -0
- package/self/runtime/http-server.js +642 -0
- package/self/runtime/interpreter.js +30787 -0
- package/self/runtime/repl.js +186 -0
- package/self/runtime-helpers.ts +282 -0
- package/self/scope.fl +80 -0
- package/self/scope.self.js +1 -0
- package/self/self/bench/_bi_list-distinct.js +2 -0
- package/self/self/bench/_bi_list-filter-even.js +2 -0
- package/self/self/bench/_bi_list-first.js +2 -0
- package/self/self/bench/_bi_list-last.js +2 -0
- package/self/self/bench/_bi_list-map-inc.js +2 -0
- package/self/self/bench/_bi_list-range.js +2 -0
- package/self/self/bench/_bi_list-reduce-sum.js +2 -0
- package/self/self/bench/_bi_list-reverse.js +2 -0
- package/self/self/bench/_bi_list-sort.js +2 -0
- package/self/self/bench/_bi_list-take.js +2 -0
- package/self/self/bench/_bi_map-has.js +2 -0
- package/self/self/bench/_bi_map-keys.js +2 -0
- package/self/self/bench/_bi_map-values.js +2 -0
- package/self/self/bench/_bi_str-concat.js +2 -0
- package/self/self/bench/_bi_str-contains.js +2 -0
- package/self/self/bench/_bi_str-ends.js +2 -0
- package/self/self/bench/_bi_str-index.js +2 -0
- package/self/self/bench/_bi_str-lower.js +2 -0
- package/self/self/bench/_bi_str-repeat.js +2 -0
- package/self/self/bench/_bi_str-split.js +2 -0
- package/self/self/bench/_bi_str-starts.js +2 -0
- package/self/self/bench/_bi_str-trim.js +2 -0
- package/self/self/bench/_bi_str-upper.js +2 -0
- package/self/self/bench/_ext_abs-neg.js +2 -0
- package/self/self/bench/_ext_and.js +2 -0
- package/self/self/bench/_ext_cond-1.js +2 -0
- package/self/self/bench/_ext_cond-2.js +2 -0
- package/self/self/bench/_ext_do-seq.js +2 -0
- package/self/self/bench/_ext_fact20.js +3 -0
- package/self/self/bench/_ext_fib25.js +3 -0
- package/self/self/bench/_ext_length.js +2 -0
- package/self/self/bench/_ext_let-1d.js +2 -0
- package/self/self/bench/_ext_let-2d.js +2 -0
- package/self/self/bench/_ext_list-sum.js +3 -0
- package/self/self/bench/_ext_math.js +2 -0
- package/self/self/bench/_ext_or.js +2 -0
- package/self/self/bench/_ext_str.js +2 -0
- package/self/self/bench/_fact15.js +2 -0
- package/self/self/bench/_fb_fact15.js +2 -0
- package/self/self/bench/_fb_func-fact.js +2 -0
- package/self/self/bench/_fb_func-multi.js +2 -0
- package/self/self/bench/_fb_func-mutual.js +3 -0
- package/self/self/bench/_fb_func-simple.js +2 -0
- package/self/self/bench/_fib.js +2 -0
- package/self/self/bench/_fn_async-await-seq.js +2 -0
- package/self/self/bench/_fn_async-print.js +2 -0
- package/self/self/bench/_fn_call-form.js +2 -0
- package/self/self/bench/_fn_compose.js +2 -0
- package/self/self/bench/_fn_pipe.js +2 -0
- package/self/self/bench/_fn_thread-first-sexpr.js +2 -0
- package/self/self/bench/_fn_thread-first.js +2 -0
- package/self/self/bench/_fn_thread-last.js +2 -0
- package/self/self/bench/_generated.js +2 -0
- package/self/self/bench/_mt_match-default.js +2 -0
- package/self/self/bench/_mt_match-num.js +2 -0
- package/self/self/bench/_mt_match-str.js +2 -0
- package/self/self/bench/_mt_match-var.js +2 -0
- package/self/self/bench/_mt_match-wild.js +2 -0
- package/self/self/bench/_mt_struct-make.js +4 -0
- package/self/self/bench/_mt_struct-tag.js +4 -0
- package/self/self/bench/_rs_combo.js +3 -0
- package/self/self/bench/_rs_gcd.js +2 -0
- package/self/self/bench/_rs_grade.js +2 -0
- package/self/self/bench/_rs_mutual-fib.js +2 -0
- package/self/self/bench/_rs_range-sum.js +2 -0
- package/self/self/bench/_rs_sum-5k.js +2 -0
- package/self/self/bench/_sf_loop-fact-10.js +1 -0
- package/self/self/bench/_sf_loop-sum-10k.js +1 -0
- package/self/self/bench/_sf_set-x.js +3 -0
- package/self/self/bench/_sf_throw-catch.js +1 -0
- package/self/self/bench/_sf_while-5.js +3 -0
- package/self/stdlib/ai.fl +73 -0
- package/self/stdlib/assert.fl +30 -0
- package/self/stdlib/async.fl +48 -0
- package/self/stdlib/base64.fl +22 -0
- package/self/stdlib/binary.fl +30 -0
- package/self/stdlib/build.fl +69 -0
- package/self/stdlib/collection.fl +37 -0
- package/self/stdlib/color.fl +35 -0
- package/self/stdlib/crypto-hash.fl +29 -0
- package/self/stdlib/crypto.fl +56 -0
- package/self/stdlib/data.fl +69 -0
- package/self/stdlib/db.fl +53 -0
- package/self/stdlib/encoding.fl +49 -0
- package/self/stdlib/error.fl +36 -0
- package/self/stdlib/feed.fl +86 -0
- package/self/stdlib/file.fl +53 -0
- package/self/stdlib/format.fl +34 -0
- package/self/stdlib/graph.fl +72 -0
- package/self/stdlib/hash.fl +32 -0
- package/self/stdlib/heap.fl +76 -0
- package/self/stdlib/http.fl +47 -0
- package/self/stdlib/image.fl +45 -0
- package/self/stdlib/json.fl +11 -0
- package/self/stdlib/list-extra.fl +32 -0
- package/self/stdlib/markdown.fl +59 -0
- package/self/stdlib/math-extra.fl +34 -0
- package/self/stdlib/math.fl +13 -0
- package/self/stdlib/metadata.fl +66 -0
- package/self/stdlib/mongodb/bson.fl +21 -0
- package/self/stdlib/mongodb/schema.fl +95 -0
- package/self/stdlib/mongodb/wire.fl +54 -0
- package/self/stdlib/mongodb.fl +172 -0
- package/self/stdlib/path.fl +72 -0
- package/self/stdlib/plot.fl +56 -0
- package/self/stdlib/process.fl +50 -0
- package/self/stdlib/queue.fl +65 -0
- package/self/stdlib/regex.fl +11 -0
- package/self/stdlib/resource.fl +61 -0
- package/self/stdlib/search.fl +54 -0
- package/self/stdlib/set-extra.fl +35 -0
- package/self/stdlib/sort.fl +61 -0
- package/self/stdlib/stack.fl +54 -0
- package/self/stdlib/stats.fl +110 -0
- package/self/stdlib/stream.fl +56 -0
- package/self/stdlib/string-extended.fl +25 -0
- package/self/stdlib/string-extra.fl +40 -0
- package/self/stdlib/string.fl +21 -0
- package/self/stdlib/test-helpers.fl +51 -0
- package/self/stdlib/test-runner.fl +76 -0
- package/self/stdlib/time-extra.fl +27 -0
- package/self/stdlib/time.fl +31 -0
- package/self/stdlib/tree.fl +57 -0
- package/self/stdlib/types.fl +85 -0
- package/self/stdlib/url.fl +33 -0
- package/self/stdlib/uuid.fl +28 -0
- package/self/stdlib/validation.fl +42 -0
- package/self/stdlib/vector-math.fl +52 -0
- package/self/stdlib/ws.fl +52 -0
- package/self/tests/mongodb-phase3.fl +75 -0
- package/self/tests/mongodb-wire-phase2.fl +45 -0
- package/self/tests/test-ast.fl +36 -0
- package/self/tests/test-builtins.fl +340 -0
- package/self/tests/test-char-class.fl +29 -0
- package/self/tests/test-codegen-builtins.fl +240 -0
- package/self/tests/test-codegen-ext.fl +380 -0
- package/self/tests/test-codegen-ffi.fl +295 -0
- package/self/tests/test-codegen-fn.fl +177 -0
- package/self/tests/test-codegen-match.fl +161 -0
- package/self/tests/test-codegen-run.fl +252 -0
- package/self/tests/test-codegen-sf.fl +262 -0
- package/self/tests/test-codegen.fl +260 -0
- package/self/tests/test-core-fl.fl +63 -0
- package/self/tests/test-forward-decl.fl +5 -0
- package/self/tests/test-func-block.fl +4 -0
- package/self/tests/test-interp-user-fn.fl +296 -0
- package/self/tests/test-interp.fl +225 -0
- package/self/tests/test-lexer.fl +162 -0
- package/self/tests/test-list-debug.fl +21 -0
- package/self/tests/test-mutual-rec.fl +6 -0
- package/self/tests/test-parser-debug.fl +35 -0
- package/self/tests/test-parser-full-debug.fl +66 -0
- package/self/tests/test-parser-lex-debug.fl +107 -0
- package/self/tests/test-parser-lex-only.fl +40 -0
- package/self/tests/test-parser-simple-debug.fl +35 -0
- package/self/tests/test-parser.fl +262 -0
- package/self/tests/test-real-stdlib.fl +377 -0
- package/self/tests/test-scope.fl +74 -0
- package/self/tests/test-selfcompile.fl +325 -0
- package/self/tests/test-stdlib.fl +44 -0
- package/self/tests/test-tco.fl +16 -0
- package/self/tests/test-token.fl +4 -0
- package/self/token.fl +38 -0
- package/self/token.self.js +8 -0
- package/self/v12-driver.fl +16 -0
- package/self/verify.fl +39 -0
- package/self-evolve/1-observe-ast.fl +28 -0
- package/self-evolve/2-inspect-block.fl +35 -0
- package/self-evolve/3-full-ast-json.fl +10 -0
- package/self-evolve/4-trace-block-fields.fl +23 -0
- package/self-evolve/5-analyze-do-ast.fl +29 -0
- package/self-evolve/6-test-do-elim-simple.fl +14 -0
- package/self-evolve/debug-evaluate.fl +24 -0
- package/self-evolve/debug-gen1-const-fold.fl +57 -0
- package/self-evolve/debug-map.fl +15 -0
- package/self-evolve/debug-optimize-simple.fl +95 -0
- package/self-evolve/debug-recursive-map.fl +23 -0
- package/self-evolve/logs/gen-0.fl +1658 -0
- package/self-evolve/logs/gen-1.fl +1658 -0
- package/self-evolve/logs/gen-2.fl +1658 -0
- package/self-evolve/logs/speed-gen-0.fl +1423 -0
- package/self-evolve/run-semantic-test.js +130 -0
- package/self-evolve/test-basic.fl +19 -0
- package/self-evolve/test-fold-direct.fl +60 -0
- package/self-evolve/test-gen1-simple.fl +67 -0
- package/self-evolve/test-optimize-debug.fl +63 -0
- package/self-evolve/tmp-test.fl +1 -0
- package/self-evolve/v11-analyzer.fl +40 -0
- package/self-evolve/v11-benchmark.fl +45 -0
- package/self-evolve/v11-evolution-real.fl +45 -0
- package/self-evolve/v11-evolution.fl +32 -0
- package/self-evolve/v11-gen1-validate.fl +157 -0
- package/self-evolve/v11-optimizer-constant-fold.fl +124 -0
- package/self-evolve/v11-optimizer-dead-expr.fl +111 -0
- package/self-evolve/v11-optimizer-gen1-complete.fl +180 -0
- package/self-evolve/v11-optimizer-gen1.fl +68 -0
- package/self-evolve/v11-optimizer.fl +56 -0
- package/self-evolve/v11-semantic-test.fl +54 -0
- package/self-evolve/v11-speed-benchmark.fl +106 -0
- package/self-evolve/v11-speed-optimizer.fl +79 -0
- package/src/AGENT-DSL.md +527 -0
- package/src/CLI-DEPLOYMENT.md +204 -0
- package/src/CLI.md +361 -0
- package/src/EXPRESS-ADVANCED.md +294 -0
- package/src/EXPRESS-AUTH.md +365 -0
- package/src/EXPRESS-CACHE.md +409 -0
- package/src/EXPRESS-COMPLETE.md +569 -0
- package/src/EXPRESS-README.md +121 -0
- package/src/EXPRESS-TEST.md +492 -0
- package/src/EXPRESS-WEBSOCKET.md +391 -0
- package/src/LOGGING-GUIDE.md +354 -0
- package/src/STORAGE-GUIDE.md +416 -0
- package/src/__tests__/advanced.test.ts +573 -0
- package/src/__tests__/ai-library.test.ts +210 -0
- package/src/__tests__/build-determinism.test.ts +33 -0
- package/src/__tests__/builtins-advanced.test.ts +150 -0
- package/src/__tests__/builtins-sanity.test.ts +180 -0
- package/src/__tests__/codegen.let.test.ts +81 -0
- package/src/__tests__/core.test.ts +188 -0
- package/src/__tests__/coverage-boost.test.ts +626 -0
- package/src/__tests__/cron-scheduler.test.ts +269 -0
- package/src/__tests__/enterprise-blocks.test.ts +63 -0
- package/src/__tests__/errors.test.ts +313 -0
- package/src/__tests__/integration.test.ts +219 -0
- package/src/__tests__/interpreter.test.ts +170 -0
- package/src/__tests__/l2-proof.test.ts +78 -0
- package/src/__tests__/lexer-parser.test.ts +366 -0
- package/src/__tests__/lexer.test.ts +106 -0
- package/src/__tests__/mariadb-prepared-statement.test.ts +206 -0
- package/src/__tests__/migrate.test.ts +403 -0
- package/src/__tests__/mongodb-integration.test.ts.skip +207 -0
- package/src/__tests__/mongodb-phase4.test.ts +132 -0
- package/src/__tests__/p1-1-parallel-tasks.test.ts +179 -0
- package/src/__tests__/p1-2-compensation.test.ts +242 -0
- package/src/__tests__/p1-3-distributed.test.ts +160 -0
- package/src/__tests__/p1-4-observability.test.ts +161 -0
- package/src/__tests__/parser.test.ts +142 -0
- package/src/__tests__/phase151-self-evolve.test.ts +161 -0
- package/src/__tests__/rate-limiter.test.ts +274 -0
- package/src/__tests__/self-hosting.test.ts +174 -0
- package/src/__tests__/semantic-preservation.test.ts +207 -0
- package/src/__tests__/setup.ts +34 -0
- package/src/__tests__/special-forms-advanced.test.ts +106 -0
- package/src/__tests__/stdlib-crypto-rsa.test.ts +122 -0
- package/src/__tests__/stdlib-f4.test.ts +159 -0
- package/src/__tests__/stdlib-helpers.test.ts +128 -0
- package/src/__tests__/stdlib-modules.test.ts +161 -0
- package/src/__tests__/stdlib-mongodb.test.ts +331 -0
- package/src/__tests__/stdlib-new.test.ts +269 -0
- package/src/__tests__/stdlib-perf.test.ts +125 -0
- package/src/__tests__/stdlib-phase-b.test.ts +249 -0
- package/src/__tests__/stdlib.test.ts +163 -0
- package/src/__tests__/v12-alpha.test.ts +205 -0
- package/src/__tests__/vm-optin.test.ts +141 -0
- package/src/__tests__/web-integration.test.ts +1452 -0
- package/src/__tests__/weblibs.test.ts +210 -0
- package/src/_aliases.json +1123 -0
- package/src/_mongodb_helper.js +272 -0
- package/src/_stdlib-signatures.json +1 -0
- package/src/agent-chain.ts +71 -0
- package/src/agent-dsl.fl +168 -0
- package/src/agent-example-error-handling.fl +51 -0
- package/src/agent-example-sequential.fl +66 -0
- package/src/agent-example-state-tracking.fl +70 -0
- package/src/agent.ts +393 -0
- package/src/align.ts +349 -0
- package/src/analogy.ts +78 -0
- package/src/ast-helpers.ts +199 -0
- package/src/ast.ts +817 -0
- package/src/async-runtime.ts +263 -0
- package/src/belief.ts +86 -0
- package/src/benchmark-self.ts +275 -0
- package/src/benchmarks/bench-interpreter.ts +73 -0
- package/src/benchmarks/bench-runner.ts +85 -0
- package/src/benchmarks/bench-vm.ts +128 -0
- package/src/browser-debug-panel.ts +220 -0
- package/src/browser-entry.ts +79 -0
- package/src/browser-stubs/child-process-stubs.ts +6 -0
- package/src/browser-stubs/crypto-stubs.ts +15 -0
- package/src/browser-stubs/misc-stubs.ts +4 -0
- package/src/browser-stubs/node-stubs.ts +17 -0
- package/src/browser-stubs/path-stubs.ts +6 -0
- package/src/bytecode.ts +41 -0
- package/src/causal.ts +258 -0
- package/src/chain-agents.ts +86 -0
- package/src/checkpoint.ts +106 -0
- package/src/ci-runner.ts +279 -0
- package/src/cli.ts +2136 -0
- package/src/codegen-js.ts +847 -0
- package/src/cognitive.ts +95 -0
- package/src/compete.ts +60 -0
- package/src/compiler.ts +267 -0
- package/src/compose-reason.ts +118 -0
- package/src/consensus.ts +109 -0
- package/src/context-window.ts +139 -0
- package/src/cot.ts +241 -0
- package/src/counterfactual.ts +268 -0
- package/src/critique.ts +77 -0
- package/src/crossover.ts +218 -0
- package/src/curiosity.ts +305 -0
- package/src/debate.ts +64 -0
- package/src/debug-api.ts +92 -0
- package/src/debugger.ts +185 -0
- package/src/delegate.ts +78 -0
- package/src/doc-extractor.ts +255 -0
- package/src/doc-renderer.ts +131 -0
- package/src/echo-server-demo.fl +17 -0
- package/src/error-formatter.ts +369 -0
- package/src/error-system.ts +88 -0
- package/src/errors.ts +281 -0
- package/src/ethics-check.ts +408 -0
- package/src/eval-ai-blocks.ts +182 -0
- package/src/eval-ai-handlers.ts +132 -0
- package/src/eval-builtins-ai.ts +1659 -0
- package/src/eval-builtins.ts +5956 -0
- package/src/eval-call-function.ts +665 -0
- package/src/eval-infra-blocks.ts +450 -0
- package/src/eval-module-system.ts +286 -0
- package/src/eval-pattern-match.ts +289 -0
- package/src/eval-phase150.ts +87 -0
- package/src/eval-reasoning-sequence.ts +218 -0
- package/src/eval-special-forms.ts +2154 -0
- package/src/eval-style-blocks.ts +193 -0
- package/src/eval-type-classes.ts +148 -0
- package/src/evolve.ts +276 -0
- package/src/explain.ts +345 -0
- package/src/express-advanced.fl +78 -0
- package/src/express-auth.fl +118 -0
- package/src/express-cache.fl +118 -0
- package/src/express-chat.fl +81 -0
- package/src/express-example.fl +67 -0
- package/src/express-test.fl +331 -0
- package/src/express.fl +92 -0
- package/src/fitness.ts +238 -0
- package/src/fl-app-demo.fl +19 -0
- package/src/fl-files/fl-fmt.fl +29 -0
- package/src/fl-files/fl-lint.fl +61 -0
- package/src/fl-files/fl-test.fl +52 -0
- package/src/fl-http-demo.fl +19 -0
- package/src/fl-list-utils.fl +108 -0
- package/src/fl-math-lib.fl +14 -0
- package/src/fl-sdk.ts +154 -0
- package/src/fl-server-demo.fl +74 -0
- package/src/fl-str-utils.fl +29 -0
- package/src/fl-tutor.ts +126 -0
- package/src/formatter.ts +581 -0
- package/src/freelang-codegen.fl +904 -0
- package/src/freelang-interpreter.fl +483 -0
- package/src/freelang-lexer.fl +337 -0
- package/src/freelang-parser.fl +349 -0
- package/src/freelang-stdlib.fl +246 -0
- package/src/freelang-typechecker.fl +422 -0
- package/src/freelang-v9-complete.ts +474 -0
- package/src/generation.ts +201 -0
- package/src/gpt-mini-p3.fl +316 -0
- package/src/hot-reload.ts +235 -0
- package/src/http-server-runner.ts +89 -0
- package/src/hypothesis.ts +62 -0
- package/src/immutable.ts +140 -0
- package/src/interpreter-context.ts +87 -0
- package/src/interpreter-scope.ts +140 -0
- package/src/interpreter.ts +2351 -0
- package/src/lazy-seq.ts +134 -0
- package/src/learned-facts-store.ts +306 -0
- package/src/lexer.ts +359 -0
- package/src/lint-rules.ts +584 -0
- package/src/linter.ts +237 -0
- package/src/logger.ts +128 -0
- package/src/logging-deterministic.fl +138 -0
- package/src/lsp-server.ts +379 -0
- package/src/macro-expander.ts +195 -0
- package/src/maybe-chain.ts +108 -0
- package/src/maybe-type.ts +163 -0
- package/src/memory-system.ts +142 -0
- package/src/meta-reason.ts +93 -0
- package/src/multi-agent-hub.ts +247 -0
- package/src/multi-agent.ts +101 -0
- package/src/mutate.ts +226 -0
- package/src/negotiate.ts +55 -0
- package/src/optimizer.ts +277 -0
- package/src/orchestrate.ts +154 -0
- package/src/package-manager.ts +375 -0
- package/src/parser.ts +2722 -0
- package/src/peer-review.ts +53 -0
- package/src/predict.ts +365 -0
- package/src/profiler.ts +150 -0
- package/src/prompt-compiler.ts +123 -0
- package/src/protocol.ts +114 -0
- package/src/prune.ts +195 -0
- package/src/quality-loop.ts +105 -0
- package/src/rag.ts +81 -0
- package/src/reasoning-debugger.ts +122 -0
- package/src/refactor-self.ts +362 -0
- package/src/reflect.ts +186 -0
- package/src/repl.ts +323 -0
- package/src/result-type.ts +126 -0
- package/src/return-signal.ts +10 -0
- package/src/runtime-entry.ts +8 -0
- package/src/runtime-helpers.ts +234 -0
- package/src/self-evolution-hub.ts +431 -0
- package/src/self-improve.ts +107 -0
- package/src/source-map.ts +114 -0
- package/src/stdlib-agent.js +164 -0
- package/src/stdlib-agent.ts +225 -0
- package/src/stdlib-ai-native.ts +176 -0
- package/src/stdlib-ai-workflow.ts +308 -0
- package/src/stdlib-ai.ts +180 -0
- package/src/stdlib-async.ts +179 -0
- package/src/stdlib-audit.ts +94 -0
- package/src/stdlib-auth.ts +196 -0
- package/src/stdlib-bits.ts +86 -0
- package/src/stdlib-blog.ts +127 -0
- package/src/stdlib-browser.ts +239 -0
- package/src/stdlib-cache.ts +147 -0
- package/src/stdlib-capture-error.ts +183 -0
- package/src/stdlib-channel.ts +96 -0
- package/src/stdlib-checkpoint.js +109 -0
- package/src/stdlib-checkpoint.ts +97 -0
- package/src/stdlib-cloud.ts +317 -0
- package/src/stdlib-collection.ts +227 -0
- package/src/stdlib-compile.ts +111 -0
- package/src/stdlib-cron.ts +219 -0
- package/src/stdlib-crypto-rsa.ts +82 -0
- package/src/stdlib-crypto.js +203 -0
- package/src/stdlib-crypto.ts +208 -0
- package/src/stdlib-data.ts +614 -0
- package/src/stdlib-db-query.ts +198 -0
- package/src/stdlib-db.ts +185 -0
- package/src/stdlib-distributed.ts +292 -0
- package/src/stdlib-error.ts +90 -0
- package/src/stdlib-fd.ts +130 -0
- package/src/stdlib-feed.ts +171 -0
- package/src/stdlib-file.ts +182 -0
- package/src/stdlib-helpers.ts +273 -0
- package/src/stdlib-http-macro.ts +178 -0
- package/src/stdlib-http-server.ts +1229 -0
- package/src/stdlib-http.ts +405 -0
- package/src/stdlib-image.ts +92 -0
- package/src/stdlib-kebab-aliases.ts +131 -0
- package/src/stdlib-lazy-registry.ts +106 -0
- package/src/stdlib-loader.ts +810 -0
- package/src/stdlib-mail.ts +251 -0
- package/src/stdlib-mariadb.ts +467 -0
- package/src/stdlib-markdown.ts +227 -0
- package/src/stdlib-matrix.ts +170 -0
- package/src/stdlib-middleware.ts +221 -0
- package/src/stdlib-module.ts +178 -0
- package/src/stdlib-mongodb.ts +174 -0
- package/src/stdlib-oci.ts +321 -0
- package/src/stdlib-optional.ts +56 -0
- package/src/stdlib-orm.ts +241 -0
- package/src/stdlib-perf.ts +140 -0
- package/src/stdlib-pg.ts +181 -0
- package/src/stdlib-plot.ts +196 -0
- package/src/stdlib-process.ts +120 -0
- package/src/stdlib-property.ts +157 -0
- package/src/stdlib-pubsub.ts +93 -0
- package/src/stdlib-queue-helpers.ts +92 -0
- package/src/stdlib-registry.ts +78 -0
- package/src/stdlib-resource.ts +553 -0
- package/src/stdlib-rest-crud.ts +146 -0
- package/src/stdlib-service.ts +206 -0
- package/src/stdlib-shell.ts +76 -0
- package/src/stdlib-stats.ts +172 -0
- package/src/stdlib-table.ts +200 -0
- package/src/stdlib-test-enhanced.ts +76 -0
- package/src/stdlib-test.ts +153 -0
- package/src/stdlib-time.js +217 -0
- package/src/stdlib-time.ts +282 -0
- package/src/stdlib-timer.ts +134 -0
- package/src/stdlib-totp.ts +110 -0
- package/src/stdlib-type-predicates.ts +136 -0
- package/src/stdlib-types.ts +107 -0
- package/src/stdlib-validation.ts +248 -0
- package/src/stdlib-verify.ts +181 -0
- package/src/stdlib-webauthn.ts +192 -0
- package/src/stdlib-workflow.js +715 -0
- package/src/stdlib-workflow.ts +950 -0
- package/src/stdlib-ws.ts +333 -0
- package/src/stdlib-wsc.test.ts +122 -0
- package/src/stdlib-wsc.ts +243 -0
- package/src/storage-unified.fl +279 -0
- package/src/streaming.ts +101 -0
- package/src/struct-system.ts +104 -0
- package/src/style-registry.ts +54 -0
- package/src/swarm.ts +89 -0
- package/src/tco.ts +31 -0
- package/src/test-advanced-patterns.ts +211 -0
- package/src/test-ast-debug.ts +20 -0
- package/src/test-ast-helpers.ts +208 -0
- package/src/test-async.ts +406 -0
- package/src/test-bootstrap-self-compile.ts +449 -0
- package/src/test-bootstrap-verification.ts +336 -0
- package/src/test-composition.ts +206 -0
- package/src/test-errors-phase6.ts +166 -0
- package/src/test-extended-monads.ts +313 -0
- package/src/test-field-parsing.ts +135 -0
- package/src/test-first-class-functions.ts +257 -0
- package/src/test-freelang-interpreter.ts +320 -0
- package/src/test-freelang-lexer.ts +306 -0
- package/src/test-freelang-parser.ts +268 -0
- package/src/test-fullstack-core.ts +258 -0
- package/src/test-fullstack-phase7-12.ts +305 -0
- package/src/test-fullstack-practical.ts +338 -0
- package/src/test-integration-stdlib.ts +195 -0
- package/src/test-interpreter-phase6.ts +305 -0
- package/src/test-lexer-comparison.ts +108 -0
- package/src/test-lexer-phase6.ts +271 -0
- package/src/test-modules.ts +325 -0
- package/src/test-monad-laws.ts +383 -0
- package/src/test-monads.ts +197 -0
- package/src/test-p0-checkpoint.ts +304 -0
- package/src/test-p0-conditional.ts +284 -0
- package/src/test-p0-error-handling.ts +231 -0
- package/src/test-p0-error-messages.ts +220 -0
- package/src/test-p1-1-parallel-tasks.js +214 -0
- package/src/test-parser-phase6.ts +222 -0
- package/src/test-performance.ts +206 -0
- package/src/test-phase10-data.ts +259 -0
- package/src/test-phase10-file.ts +216 -0
- package/src/test-phase100-stdlib-ai.ts +343 -0
- package/src/test-phase101-memory.ts +309 -0
- package/src/test-phase102-rag.ts +296 -0
- package/src/test-phase103-multi-agent.ts +418 -0
- package/src/test-phase104-try-reason.ts +459 -0
- package/src/test-phase105-streaming.ts +287 -0
- package/src/test-phase106-quality.ts +397 -0
- package/src/test-phase107-tutor.ts +305 -0
- package/src/test-phase108-debugger.ts +316 -0
- package/src/test-phase109-prompt-compiler.ts +333 -0
- package/src/test-phase11-12-complete.ts +275 -0
- package/src/test-phase11-error.ts +192 -0
- package/src/test-phase110-sdk.ts +320 -0
- package/src/test-phase111-hypothesis.ts +380 -0
- package/src/test-phase112-maybe-chain.ts +313 -0
- package/src/test-phase113-debate.ts +364 -0
- package/src/test-phase114-checkpoint.ts +348 -0
- package/src/test-phase115-meta-reason.ts +277 -0
- package/src/test-phase116-belief.ts +275 -0
- package/src/test-phase117-analogy.ts +325 -0
- package/src/test-phase118-critique.ts +308 -0
- package/src/test-phase119-compose.ts +434 -0
- package/src/test-phase12-http-shell.ts +120 -0
- package/src/test-phase120-cognitive.ts +297 -0
- package/src/test-phase121-consensus.ts +404 -0
- package/src/test-phase122-delegate.ts +411 -0
- package/src/test-phase123-vote.ts +339 -0
- package/src/test-phase124-negotiate.ts +403 -0
- package/src/test-phase125-swarm.ts +321 -0
- package/src/test-phase126-orchestrate.ts +343 -0
- package/src/test-phase127-peer-review.ts +279 -0
- package/src/test-phase128-chain-agents.ts +456 -0
- package/src/test-phase129-compete.ts +256 -0
- package/src/test-phase13-data.ts +223 -0
- package/src/test-phase130-hub.ts +390 -0
- package/src/test-phase131-evolve.ts +536 -0
- package/src/test-phase132-mutate.ts +268 -0
- package/src/test-phase133-crossover.ts +289 -0
- package/src/test-phase134-fitness.ts +306 -0
- package/src/test-phase135-generation.ts +328 -0
- package/src/test-phase136-prune.ts +228 -0
- package/src/test-phase137-refactor-self.ts +354 -0
- package/src/test-phase138-benchmark-self.ts +325 -0
- package/src/test-phase139-version-self.ts +278 -0
- package/src/test-phase14-collection.ts +254 -0
- package/src/test-phase140-self-evolution.ts +410 -0
- package/src/test-phase141-world-model.ts +387 -0
- package/src/test-phase142-causal.ts +384 -0
- package/src/test-phase143-counterfactual.ts +280 -0
- package/src/test-phase144-predict.ts +312 -0
- package/src/test-phase145-explain.ts +287 -0
- package/src/test-phase146-align.ts +439 -0
- package/src/test-phase147-ethics-check.ts +399 -0
- package/src/test-phase148-curiosity.ts +247 -0
- package/src/test-phase149-wisdom.ts +758 -0
- package/src/test-phase15-agent.ts +320 -0
- package/src/test-phase150-complete.ts +481 -0
- package/src/test-phase16-time.ts +292 -0
- package/src/test-phase17-crypto.ts +312 -0
- package/src/test-phase18-integration.ts +429 -0
- package/src/test-phase19-resource.ts +214 -0
- package/src/test-phase20-server-db.ts +160 -0
- package/src/test-phase21-ws-auth-cache-pubsub.ts +212 -0
- package/src/test-phase22-process.ts +166 -0
- package/src/test-phase23-selfhosting.ts +383 -0
- package/src/test-phase24-codegen.ts +236 -0
- package/src/test-phase25-bootstrap.ts +227 -0
- package/src/test-phase26-map-filter-reduce.ts +282 -0
- package/src/test-phase27-stdlib-codegen.ts +325 -0
- package/src/test-phase28-loop-recur.ts +182 -0
- package/src/test-phase29-import.ts +165 -0
- package/src/test-phase3-web-server.ts +234 -0
- package/src/test-phase30-selfcompile.ts +254 -0
- package/src/test-phase31-gen2-lexer.ts +251 -0
- package/src/test-phase33-gen3-bootstrap.ts +323 -0
- package/src/test-phase34-parser-tco.ts +268 -0
- package/src/test-phase35-error-messages.ts +280 -0
- package/src/test-phase36-sourcemap.ts +240 -0
- package/src/test-phase37-variadic.ts +228 -0
- package/src/test-phase38-destructuring.ts +261 -0
- package/src/test-phase39-do-block.ts +288 -0
- package/src/test-phase40-const-fold.ts +249 -0
- package/src/test-phase41-repl.ts +312 -0
- package/src/test-phase42-watch.ts +314 -0
- package/src/test-phase43-format.ts +377 -0
- package/src/test-phase44-check.ts +505 -0
- package/src/test-phase45-interpreter.ts +367 -0
- package/src/test-phase46-match.ts +390 -0
- package/src/test-phase47-file-io.ts +338 -0
- package/src/test-phase48-types.ts +308 -0
- package/src/test-phase49-stdlib.ts +365 -0
- package/src/test-phase5-week1.ts +160 -0
- package/src/test-phase50-fl-server.ts +159 -0
- package/src/test-phase51-transformer.ts +152 -0
- package/src/test-phase52-import.ts +161 -0
- package/src/test-phase53-training.ts +122 -0
- package/src/test-phase54-fl-utils.ts +122 -0
- package/src/test-phase55-http-client.ts +182 -0
- package/src/test-phase56-lexical-scope.ts +230 -0
- package/src/test-phase58-module-refactor.ts +298 -0
- package/src/test-phase59-errors.ts +226 -0
- package/src/test-phase6-compile.ts +227 -0
- package/src/test-phase60-types.ts +457 -0
- package/src/test-phase61-tco.ts +209 -0
- package/src/test-phase63-macros.ts +191 -0
- package/src/test-phase64-protocols.ts +451 -0
- package/src/test-phase65-patterns.ts +301 -0
- package/src/test-phase66-structs.ts +215 -0
- package/src/test-phase67-concurrency.ts +348 -0
- package/src/test-phase68-pipeline.ts +209 -0
- package/src/test-phase69-lazy.ts +237 -0
- package/src/test-phase7-registry.ts +236 -0
- package/src/test-phase70-immutable.ts +488 -0
- package/src/test-phase71-ai-native.ts +252 -0
- package/src/test-phase72-integration.ts +533 -0
- package/src/test-phase73-formatter.ts +361 -0
- package/src/test-phase74-linter.ts +565 -0
- package/src/test-phase75-repl.ts +227 -0
- package/src/test-phase76-testrunner.ts +439 -0
- package/src/test-phase77-doc.ts +416 -0
- package/src/test-phase78-debugger.ts +370 -0
- package/src/test-phase79-watch.ts +224 -0
- package/src/test-phase8-oci.ts +264 -0
- package/src/test-phase80-ci.ts +282 -0
- package/src/test-phase81-pkg.ts +383 -0
- package/src/test-phase82-profiler.ts +336 -0
- package/src/test-phase83-vm.ts +318 -0
- package/src/test-phase84-optimizer.ts +424 -0
- package/src/test-phase85-codegen.ts +380 -0
- package/src/test-phase86-lsp.ts +533 -0
- package/src/test-phase87-packages.ts +277 -0
- package/src/test-phase88-selfhost.ts +412 -0
- package/src/test-phase89-bench.ts +361 -0
- package/src/test-phase9-flnext-v2.ts +372 -0
- package/src/test-phase9-learn.ts +241 -0
- package/src/test-phase9-reasoning.ts +312 -0
- package/src/test-phase9-search.ts +212 -0
- package/src/test-phase90-release.ts +365 -0
- package/src/test-phase91-maybe.ts +257 -0
- package/src/test-phase92-cot.ts +438 -0
- package/src/test-phase93-tot.ts +462 -0
- package/src/test-phase94-reflect.ts +498 -0
- package/src/test-phase95-context.ts +268 -0
- package/src/test-phase96-errors.ts +296 -0
- package/src/test-phase97-tools.ts +344 -0
- package/src/test-phase98-agent.ts +370 -0
- package/src/test-phase99-self-improve.ts +394 -0
- package/src/test-phase9a-websearch.ts +283 -0
- package/src/test-phase9ab-integration.ts +140 -0
- package/src/test-phase9b-persistence.ts +448 -0
- package/src/test-phase9c-conditional.ts +251 -0
- package/src/test-phase9c-extension.ts +270 -0
- package/src/test-phase9c-feedback.ts +263 -0
- package/src/test-phase9c-loop.ts +239 -0
- package/src/test-selfhosting-sh1.ts +41 -0
- package/src/test-selfhosting-sh2.ts +84 -0
- package/src/test-selfhosting-sh3.ts +61 -0
- package/src/test-selfhosting-sh4.ts +65 -0
- package/src/test-type-classes-dispatch.ts +202 -0
- package/src/test-type-classes.ts +320 -0
- package/src/test-type-inference.ts +464 -0
- package/src/test-typeclass-parsing-final.ts +218 -0
- package/src/test-typeclass-parsing.ts +264 -0
- package/src/todo-server-30116.ts +53 -0
- package/src/token.ts +130 -0
- package/src/tool-registry.ts +195 -0
- package/src/tot.ts +258 -0
- package/src/try-reason.ts +109 -0
- package/src/type-check-static.ts +417 -0
- package/src/type-checker.ts +245 -0
- package/src/type-inference.ts +271 -0
- package/src/type-system.ts +169 -0
- package/src/version-self.ts +219 -0
- package/src/vm-eligible.ts +106 -0
- package/src/vm.ts +219 -0
- package/src/vote.ts +127 -0
- package/src/vpm/checksum-test.fl +193 -0
- package/src/vpm/checksum.fl +219 -0
- package/src/vpm/error-test.fl +211 -0
- package/src/vpm/error.fl +218 -0
- package/src/vpm/lock-file.fl +380 -0
- package/src/vpm/logging-test.fl +194 -0
- package/src/vpm/logging.fl +294 -0
- package/src/vpm/resolver-test.fl +117 -0
- package/src/vpm/resolver.fl +618 -0
- package/src/vpm/semver-test.fl +180 -0
- package/src/vpm/semver.fl +143 -0
- package/src/vpm-cli.ts +1955 -0
- package/src/web/app-router.ts +286 -0
- package/src/web/fl-executor.ts +655 -0
- package/src/web/image-optimizer.ts +206 -0
- package/src/web/index.ts +14 -0
- package/src/web/page-renderer.ts +287 -0
- package/src/web/server.ts +553 -0
- package/src/web-search-adapter.ts +348 -0
- package/src/wisdom.ts +441 -0
- package/src/world-model.ts +348 -0
- package/stdlib/cache.fl +42 -0
- package/stdlib/csv.fl +38 -0
- package/stdlib/date-ext.fl +68 -0
- package/stdlib/log.fl +44 -0
- package/stdlib/math-ext.fl +57 -0
- package/stdlib/number-ext.fl +47 -0
- package/stdlib/queue.fl +57 -0
- package/stdlib/string-ext.fl +45 -0
- package/stdlib/validate.fl +123 -0
- package/stdlib/web/components.fl +125 -0
- package/stdlib/web/csrf.fl +61 -0
- package/stdlib/web/format.fl +75 -0
- package/stdlib/web/forms.fl +94 -0
- package/stdlib/web/image.fl +77 -0
- package/stdlib/web/metadata.fl +85 -0
- package/stdlib/web/pagination.fl +62 -0
- package/stdlib/web/state.fl +167 -0
- package/stdlib/web/styles.fl +68 -0
- package/stdlib/web/toast.fl +62 -0
- package/stdlib/web/v9-stdlib-dom.fl +92 -0
- package/stdlib/web/v9-stdlib-fetch.fl +90 -0
- package/stdlib/web/v9-stdlib-storage.fl +70 -0
- package/stdlib/web/v9-stdlib-ui.fl +115 -0
- package/stdlib/web/ws-client.fl +125 -0
- package/tests/.v11-backup/test-migrate-sample.fl +22 -0
- package/tests/PHASE-C-VERIFICATION-REPORT.md +125 -0
- package/tests/benchmark-v11.1.js +103 -0
- package/tests/evidence/01-about.html +1 -0
- package/tests/evidence/02-post-hello.html +1 -0
- package/tests/evidence/02-post-world.html +1 -0
- package/tests/evidence/03-home.html +1 -0
- package/tests/evidence/04-dist/404.html +1 -0
- package/tests/evidence/04-dist/about/index.html +1 -0
- package/tests/evidence/04-dist/index.html +1 -0
- package/tests/evidence/04-dist/post/hello/index.html +1 -0
- package/tests/evidence/04-dist/post/world/index.html +1 -0
- package/tests/evidence/05-dist/404.html +1 -0
- package/tests/evidence/05-dist/about/index.html +1 -0
- package/tests/evidence/05-dist/index.html +1 -0
- package/tests/evidence/05-dist/post/hello/index.html +1 -0
- package/tests/evidence/05-dist/post/world/index.html +1 -0
- package/tests/evidence/06-dist/404.html +1 -0
- package/tests/evidence/06-dist/about/index.html +1 -0
- package/tests/evidence/06-dist/index.html +1 -0
- package/tests/evidence/06-dist/post/hello/index.html +1 -0
- package/tests/evidence/06-dist/post/world/index.html +1 -0
- package/tests/evidence/07-markdown.html +1 -0
- package/tests/evidence/08-rss.xml +25 -0
- package/tests/evidence/09-robots.txt +4 -0
- package/tests/evidence/09-sitemap.xml +12 -0
- package/tests/evidence/10-jsonld.html +1 -0
- package/tests/evidence/_results.txt +11 -0
- package/tests/evidence/about.html +1 -0
- package/tests/evidence/home.html +1 -0
- package/tests/evidence/missing.html +42 -0
- package/tests/evidence/post-hello.html +1 -0
- package/tests/evidence/post-world.html +1 -0
- package/tests/fixtures/basic-app/about/page.fl +1 -0
- package/tests/fixtures/basic-app/api/echo/route.fl +5 -0
- package/tests/fixtures/basic-app/layout.fl +1 -0
- package/tests/fixtures/basic-app/not-found.fl +1 -0
- package/tests/fixtures/basic-app/page.fl +1 -0
- package/tests/fixtures/basic-app/post/[slug]/generate-static-params.fl +1 -0
- package/tests/fixtures/basic-app/post/[slug]/page.fl +1 -0
- package/tests/fixtures/stdlib-probes/blog.fl +6 -0
- package/tests/fixtures/stdlib-probes/jsonld.fl +1 -0
- package/tests/fixtures/stdlib-probes/map-probe.fl +3 -0
- package/tests/fixtures/stdlib-probes/map-shape.fl +2 -0
- package/tests/fixtures/stdlib-probes/md.fl +1 -0
- package/tests/fixtures/stdlib-probes/robots.fl +1 -0
- package/tests/fixtures/stdlib-probes/rss.fl +4 -0
- package/tests/fixtures/stdlib-probes/sitemap.fl +1 -0
- package/tests/l2/case-01-arithmetic.fl +6 -0
- package/tests/l2/case-02-comparisons.fl +15 -0
- package/tests/l2/case-03-logic.fl +15 -0
- package/tests/l2/case-04-control-flow.fl +15 -0
- package/tests/l2/case-05-functions.fl +13 -0
- package/tests/l2/case-06-collections.fl +14 -0
- package/tests/l2/case-07-pattern-matching.fl +14 -0
- package/tests/l2/case-08-recursion.fl +19 -0
- package/tests/l2/case-09-strings.fl +13 -0
- package/tests/l2/case-10-loops.fl +17 -0
- package/tests/l2/case-11-higher-order.fl +13 -0
- package/tests/l2/case-12-edge-cases.fl +14 -0
- package/tests/l2/case-13-ai-vector.fl +22 -0
- package/tests/l2/case-14-ai-cosine.fl +25 -0
- package/tests/l2/case-15-ai-template.fl +22 -0
- package/tests/l2/case-16-ai-ranking.fl +20 -0
- package/tests/l2/case-17-stdlib-extended.fl +32 -0
- package/tests/l2-proof/01-arithmetic.bootstrap.js +141 -0
- package/tests/l2-proof/01-arithmetic.fl +15 -0
- package/tests/l2-proof/01-arithmetic.stage1.js +141 -0
- package/tests/l2-proof/02-comparisons.bootstrap.js +141 -0
- package/tests/l2-proof/02-comparisons.fl +17 -0
- package/tests/l2-proof/03-logic.bootstrap.js +141 -0
- package/tests/l2-proof/03-logic.fl +15 -0
- package/tests/l2-proof/04-control-flow.bootstrap.js +146 -0
- package/tests/l2-proof/04-control-flow.fl +24 -0
- package/tests/l2-proof/05-functions.bootstrap.js +143 -0
- package/tests/l2-proof/05-functions.fl +16 -0
- package/tests/l2-proof/06-collections.bootstrap.js +146 -0
- package/tests/l2-proof/06-collections.fl +27 -0
- package/tests/l2-proof/07-pattern-matching.bootstrap.js +142 -0
- package/tests/l2-proof/07-pattern-matching.fl +23 -0
- package/tests/l2-proof/08-async-errors.bootstrap.js +142 -0
- package/tests/l2-proof/08-async-errors.fl +17 -0
- package/tests/l2-proof/09-strings.bootstrap.js +141 -0
- package/tests/l2-proof/09-strings.fl +13 -0
- package/tests/l2-proof/10-type-checks.bootstrap.js +141 -0
- package/tests/l2-proof/10-type-checks.fl +17 -0
- package/tests/l2-proof/11-recursion.bootstrap.js +143 -0
- package/tests/l2-proof/11-recursion.fl +21 -0
- package/tests/l2-proof/12-edge-cases.bootstrap.js +141 -0
- package/tests/l2-proof/12-edge-cases.fl +17 -0
- package/tests/parity/01-app-router-static.sh +18 -0
- package/tests/parity/02-app-router-dynamic.sh +18 -0
- package/tests/parity/03-layout-children.sh +17 -0
- package/tests/parity/04-not-found.sh +22 -0
- package/tests/parity/05-ssg.sh +21 -0
- package/tests/parity/06-parallel-render.sh +21 -0
- package/tests/parity/07-markdown.sh +16 -0
- package/tests/parity/08-rss-atom.sh +18 -0
- package/tests/parity/09-sitemap-robots.sh +23 -0
- package/tests/parity/10-jsonld.sh +16 -0
- package/tests/parity/11-blog-helpers.sh +28 -0
- package/tests/parity/12-api-routes.sh +25 -0
- package/tests/parity/_lib.sh +53 -0
- package/tests/parity/run-all.sh +89 -0
- package/tests/parity/score.sh +20 -0
- package/tests/phase-c-fuzzing.fl +89 -0
- package/tests/phase-c-property-testing.fl +137 -0
- package/tests/phase-c-sha-verification.fl +117 -0
- package/tests/phase-c-validation.fl +194 -0
- package/tests/property-testing.sh +47 -0
- package/tests/regen/let-in-expr-01.fl +5 -0
- package/tests/regen/let-in-expr-02.fl +6 -0
- package/tests/regen/let-in-expr-03.fl +4 -0
- package/tests/regen/let-in-expr-04.fl +6 -0
- package/tests/regen/let-in-expr-05.fl +5 -0
- package/tests/test-ai-library.fl +36 -0
- package/tests/test-andor.fl +2 -0
- package/tests/test-bootstrap-match.fl +5 -0
- package/tests/test-cg-final.fl +5 -0
- package/tests/test-cli.fl +19 -0
- package/tests/test-codegen.fl +4 -0
- package/tests/test-cond-flat.fl +1 -0
- package/tests/test-fl-exec-op.fl +1 -0
- package/tests/test-fp.fl +10 -0
- package/tests/test-funcs.fl +11 -0
- package/tests/test-fuzz-crash.fl +3 -0
- package/tests/test-http-get.fl +3 -0
- package/tests/test-json-load.fl +32 -0
- package/tests/test-let-flat.fl +2 -0
- package/tests/test-let-order.fl +3 -0
- package/tests/test-let-simple.fl +3 -0
- package/tests/test-let-syntax.fl +2 -0
- package/tests/test-let.fl +3 -0
- package/tests/test-lex-debug.fl +75 -0
- package/tests/test-loop-bug.fl +5 -0
- package/tests/test-map-entries.fl +1 -0
- package/tests/test-map-pattern.fl +3 -0
- package/tests/test-match-syntax.fl +5 -0
- package/tests/test-migrate-sample.fl +22 -0
- package/tests/test-neg.fl +1 -0
- package/tests/test-nested-let.fl +4 -0
- package/tests/test-node-to-pattern.fl +8 -0
- package/tests/test-quant-lib.fl +114 -0
- package/tests/test-reduce.fl +10 -0
- package/tests/test-server.fl +3 -0
- package/tests/test-simple-map.fl +4 -0
- package/tests/test-simple-match.fl +3 -0
- package/tests/test-simple.fl +1 -0
- package/tests/test-try-bootstrap.fl +7 -0
- package/tests/test-try-catch.fl +3 -0
- package/tests/test-watchdog-lib.fl +69 -0
- package/tests/test-which-lex.fl +4 -0
- package/tsconfig.json +39 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
;; cg-func-block 의 과정을 수동 검증
|
|
2
|
+
[FUNC js-name :params [n]
|
|
3
|
+
:body (if (null? n) "_"
|
|
4
|
+
(let [[a (replace n "-" "_")]]
|
|
5
|
+
a))]
|
|
6
|
+
[FUNC extract-name :params [n]
|
|
7
|
+
:body (cond [(= (get n :kind) "variable") (js-name (get n :name))]
|
|
8
|
+
[(= (get n :kind) "literal") (js-name (get n :value))]
|
|
9
|
+
[true "_anon"])]
|
|
10
|
+
|
|
11
|
+
(define v {:kind "variable" :name "src" :line 1})
|
|
12
|
+
(println "kind:" (get v :kind))
|
|
13
|
+
(println "name:" (get v :name))
|
|
14
|
+
(println "extract:" (extract-name v))
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const js_name = ()=>((n==null)?"_":((()=>{return a;})()));;
|
|
3
|
+
const extract_name = ()=>(null?null:(null?null:(null?null:null)));;
|
|
4
|
+
const v = ({});
|
|
5
|
+
console.log("kind:",_fl_get(v,"kind"));
|
|
6
|
+
console.log("name:",_fl_get(v,"name"));
|
|
7
|
+
console.log("extract:",extract_name(v));
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Inspect v12-candidate internals
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const src = fs.readFileSync(__dirname + '/../../bootstrap-v12-candidate.js', 'utf8');
|
|
4
|
+
// Strip out the driver that auto-runs on argv:
|
|
5
|
+
const driverless = src.replace(/\(\(__argv__==null\)\?null:[\s\S]*$/m, '');
|
|
6
|
+
// Inject exports at end
|
|
7
|
+
const injected = driverless + `\nmodule.exports = { lex, parse, cg, cg_func_block, extract_params, extract_name, param_loop };`;
|
|
8
|
+
fs.writeFileSync(__dirname + '/_v12_inspect_mod.js', injected);
|
|
9
|
+
|
|
10
|
+
const mod = require('./_v12_inspect_mod.js');
|
|
11
|
+
const { lex, parse, cg, cg_func_block, extract_params, extract_name, param_loop } = mod;
|
|
12
|
+
|
|
13
|
+
const code = '[FUNC double :params [$x] :body (* $x 2)]';
|
|
14
|
+
const toks = lex(code);
|
|
15
|
+
console.log('TOKS:', toks.length);
|
|
16
|
+
const ast = parse(toks);
|
|
17
|
+
console.log('AST:', JSON.stringify(ast, null, 2));
|
|
18
|
+
console.log('---');
|
|
19
|
+
const fnode = ast[0];
|
|
20
|
+
console.log('CG-FUNC:', cg_func_block(fnode));
|
|
21
|
+
console.log('---');
|
|
22
|
+
const pnode = fnode.fields.params;
|
|
23
|
+
const pitems = pnode.fields.items;
|
|
24
|
+
console.log('pitems:', JSON.stringify(pitems, null, 2));
|
|
25
|
+
console.log('extract-params:', extract_params(pitems));
|
|
26
|
+
console.log('extract-name(item[0]):', extract_name(pitems[0]));
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const is_digit_q = (c)=>((c==null)?false:((c>="0")&&(c<="9")));;
|
|
3
|
+
const is_alpha_q = (c)=>((c==null)?false:(((c>="a")&&(c<="z"))||((c>="A")&&(c<="Z"))));;
|
|
4
|
+
const is_alnum_q = (c)=>(is_digit_q(c)||is_alpha_q(c));;
|
|
5
|
+
const is_space_q = (c)=>((c===" ")||(c==="\t")||(c==="\n")||(c==="\r"));;
|
|
6
|
+
const is_symbol_char_q = (c)=>((c==null)?false:(is_alnum_q(c)||(c==="-")||(c==="_")||(c==="?")||(c==="!")||(c==="/")||(c===".")||(c==="<")||(c===">")||(c==="=")||(c==="+")||(c==="*")||(c==="%")||(c==="&")||(c==="|")||(c==="^")||(c==="~")));;
|
|
7
|
+
const make_state = (src)=>({"src":src,"idx":0,"line":1,"col":1,"tokens":[]});;
|
|
8
|
+
const peek_at = (st,offset)=>((()=>{let src=_fl_get(st,"src");let i=(_fl_get(st,"idx")+offset);return ((i>=_fl_length(src))?null:_fl_char_at(src,i));})());;
|
|
9
|
+
const peek = (st)=>peek_at(st,0);;
|
|
10
|
+
const at_end_q = (st)=>(_fl_get(st,"idx")>=_fl_length(_fl_get(st,"src")));;
|
|
11
|
+
const advance = (st)=>((()=>{let c=peek(st);return ((c==="\n")?({"src":_fl_get(st,"src"),"idx":(_fl_get(st,"idx")+1),"line":(_fl_get(st,"line")+1),"col":1,"tokens":_fl_get(st,"tokens")}):({"src":_fl_get(st,"src"),"idx":(_fl_get(st,"idx")+1),"line":_fl_get(st,"line"),"col":(_fl_get(st,"col")+1),"tokens":_fl_get(st,"tokens")}));})());;
|
|
12
|
+
const emit = (st,kind,value,sl,sc)=>({"src":_fl_get(st,"src"),"idx":_fl_get(st,"idx"),"line":_fl_get(st,"line"),"col":_fl_get(st,"col"),"tokens":_fl_append(_fl_get(st,"tokens"),[({"kind":kind,"value":value,"line":sl,"col":sc})])});;
|
|
13
|
+
const skip_comment = (st)=>(at_end_q(st)?st:((()=>{let c=peek(st);return ((c==="\n")?advance(st):skip_comment(advance(st)));})()));;
|
|
14
|
+
const skip_ws = (st)=>(at_end_q(st)?st:((()=>{let c=peek(st);return (is_space_q(c)?skip_ws(advance(st)):((c===";")?skip_ws(skip_comment(st)):(true?st:null)));})()));;
|
|
15
|
+
const read_number_body = (st,acc,has_dot,line,col)=>(at_end_q(st)?emit(st,"Number",acc,line,col):((()=>{let c=peek(st);return (is_digit_q(c)?read_number_body(advance(st),_fl_str(acc,c),has_dot,line,col):(((c===".")&&(!has_dot))?read_number_body(advance(st),_fl_str(acc,c),true,line,col):(true?emit(st,"Number",acc,line,col):null)));})()));;
|
|
16
|
+
const read_number = (st)=>read_number_body(st,"",false,_fl_get(st,"line"),_fl_get(st,"col"));;
|
|
17
|
+
const translate_esc = (c)=>((c==="n")?"\n":((c==="t")?"\t":((c==="r")?"\r":((c==="\"")?"\"":((c==="\\")?"\\":(true?c:null))))));;
|
|
18
|
+
const read_string_body = (st,acc,line,col)=>(at_end_q(st)?emit(st,"String",acc,line,col):((()=>{let c=peek(st);return ((c==="\"")?emit(advance(st),"String",acc,line,col):((c==="\\")?((()=>{let st2=advance(st);let c2=peek(st2);return read_string_body(advance(st2),_fl_str(acc,translate_esc(c2)),line,col);})()):(true?read_string_body(advance(st),_fl_str(acc,c),line,col):null)));})()));;
|
|
19
|
+
const read_string = (st)=>((()=>{let line=_fl_get(st,"line");let col=_fl_get(st,"col");let st1=advance(st);return read_string_body(st1,"",line,col);})());;
|
|
20
|
+
const read_symbol_body_kind = (st,acc,line,col,kind)=>(at_end_q(st)?emit(st,kind,acc,line,col):((()=>{let c=peek(st);return (is_symbol_char_q(c)?read_symbol_body_kind(advance(st),_fl_str(acc,c),line,col,kind):emit(st,kind,acc,line,col));})()));;
|
|
21
|
+
const read_symbol = (st)=>read_symbol_body_kind(st,"",_fl_get(st,"line"),_fl_get(st,"col"),"Symbol");;
|
|
22
|
+
const read_variable = (st)=>((()=>{let line=_fl_get(st,"line");let col=_fl_get(st,"col");let st1=advance(st);return read_symbol_body_kind(st1,"",line,col,"Variable");})());;
|
|
23
|
+
const read_keyword = (st)=>((()=>{let line=_fl_get(st,"line");let col=_fl_get(st,"col");let st1=advance(st);return read_symbol_body_kind(st1,"",line,col,"Keyword");})());;
|
|
24
|
+
const read_token = (st)=>((()=>{let st1=skip_ws(st);return (at_end_q(st1)?st1:((()=>{let c=peek(st1);let line=_fl_get(st1,"line");let col=_fl_get(st1,"col");return ((c==="(")?emit(advance(st1),"LParen",c,line,col):((c===")")?emit(advance(st1),"RParen",c,line,col):((c==="[")?emit(advance(st1),"LBracket",c,line,col):((c==="]")?emit(advance(st1),"RBracket",c,line,col):((c==="{")?emit(advance(st1),"LBrace",c,line,col):((c==="}")?emit(advance(st1),"RBrace",c,line,col):((c==="\"")?read_string(st1):((c==="$")?read_variable(st1):((c===":")?read_keyword(st1):(is_digit_q(c)?read_number(st1):(((c==="-")&&is_digit_q(peek_at(st1,1)))?read_number_body(advance(st1),"-",false,line,col):(is_symbol_char_q(c)?read_symbol(st1):(true?emit(advance(st1),"Unknown",c,line,col):null)))))))))))));})()));})());;
|
|
25
|
+
const lex_loop = (st)=>((()=>{let st1=skip_ws(st);return (at_end_q(st1)?_fl_get(st1,"tokens"):lex_loop(read_token(st1)));})());;
|
|
26
|
+
const lex = (src)=>lex_loop(make_state(src));;
|
|
27
|
+
const make_literal = (type,value,line)=>({"kind":"literal","type":type,"value":value,"line":line});;
|
|
28
|
+
const make_variable = (name,line)=>({"kind":"variable","name":name,"line":line});;
|
|
29
|
+
const make_keyword = (name,line)=>({"kind":"keyword","name":name,"line":line});;
|
|
30
|
+
const make_sexpr = (op,args,line)=>({"kind":"sexpr","op":op,"args":args,"line":line});;
|
|
31
|
+
const make_array_block = (items,line)=>({"kind":"block","type":"Array","name":null,"fields":({}),"line":line});;
|
|
32
|
+
const make_map_block = (items,line)=>({"kind":"block","type":"Map","name":null,"fields":({}),"line":line});;
|
|
33
|
+
const make_block = (type,name,fields,line)=>({"kind":"block","type":type,"name":name,"fields":fields,"line":line});;
|
|
34
|
+
const p_make = (tokens)=>({"tokens":tokens,"idx":0,"ast":[]});;
|
|
35
|
+
const p_peek = (p)=>((()=>{let i=_fl_get(p,"idx");let t=_fl_get(p,"tokens");return ((i>=_fl_length(t))?null:_fl_get(t,i));})());;
|
|
36
|
+
const p_peek_at = (p,offset)=>((()=>{let i=(_fl_get(p,"idx")+offset);let t=_fl_get(p,"tokens");return ((i>=_fl_length(t))?null:_fl_get(t,i));})());;
|
|
37
|
+
const p_end_q = (p)=>(_fl_get(p,"idx")>=_fl_length(_fl_get(p,"tokens")));;
|
|
38
|
+
const p_advance = (p)=>({"tokens":_fl_get(p,"tokens"),"idx":(_fl_get(p,"idx")+1),"ast":_fl_get(p,"ast")});;
|
|
39
|
+
const p_with_ast = (p,ast)=>({"tokens":_fl_get(p,"tokens"),"idx":_fl_get(p,"idx"),"ast":ast});;
|
|
40
|
+
const p_append_ast = (p,node)=>p_with_ast(p,_fl_append(_fl_get(p,"ast"),[node]));;
|
|
41
|
+
const r_pair = (p,node)=>({"p":p,"node":node});;
|
|
42
|
+
const parse_atom = (p)=>((()=>{let t=p_peek(p);let k=_fl_get(t,"kind");let v=_fl_get(t,"value");let line=_fl_get(t,"line");return ((k==="Number")?r_pair(p_advance(p),make_literal("number",v,line)):((k==="String")?r_pair(p_advance(p),make_literal("string",v,line)):((k==="Symbol")?r_pair(p_advance(p),make_literal("symbol",v,line)):((k==="Variable")?r_pair(p_advance(p),make_variable(v,line)):((k==="Keyword")?r_pair(p_advance(p),make_keyword(v,line)):(true?r_pair(p_advance(p),make_literal("unknown",v,line)):null))))));})());;
|
|
43
|
+
const parse_expr = (p)=>((()=>{let t=p_peek(p);let k=_fl_get(t,"kind");return ((k==="LParen")?parse_sexpr(p):((k==="LBracket")?parse_bracket(p):((k==="LBrace")?parse_map(p):(true?parse_atom(p):null))));})());;
|
|
44
|
+
const parse_sexpr = (p)=>((()=>{let start_tok=p_peek(p);let line=_fl_get(start_tok,"line");let p1=p_advance(p);let first=parse_args(p1,[]);let p2=_fl_get(first,"p");let args=_fl_get(first,"node");return ((_fl_length(args)===0)?r_pair(parse_consume_rparen(p2),make_sexpr("",[],line)):((()=>{let op_node=_fl_get(args,0);let op=((_fl_get(op_node,"kind")==="literal")?_fl_get(op_node,"value"):((_fl_get(op_node,"kind")==="variable")?_fl_str("$",_fl_get(op_node,"name")):"unknown"));let rest=_fl_slice(args,1,_fl_length(args));return r_pair(parse_consume_rparen(p2),make_sexpr(op,rest,line));})()));})());;
|
|
45
|
+
const parse_consume_rparen = (p)=>((()=>{let t=p_peek(p);return (((!(t==null))&&(_fl_get(t,"kind")==="RParen"))?p_advance(p):p);})());;
|
|
46
|
+
const parse_args = (p,acc)=>((()=>{let t=p_peek(p);return ((t==null)?r_pair(p,acc):((_fl_get(t,"kind")==="RParen")?r_pair(p,acc):((_fl_get(t,"kind")==="RBracket")?r_pair(p,acc):((_fl_get(t,"kind")==="RBrace")?r_pair(p,acc):(true?((()=>{let one=parse_expr(p);return parse_args(_fl_get(one,"p"),_fl_append(acc,[_fl_get(one,"node")]));})()):null)))));})());;
|
|
47
|
+
const parse_bracket = (p)=>((()=>{let tok=p_peek(p);let line=_fl_get(tok,"line");let p1=p_advance(p);let next=p_peek(p1);return (((!(next==null))&&(_fl_get(next,"kind")==="Symbol")&&is_block_type_q(_fl_get(next,"value"))&&(_fl_get(next,"value")===upper_case(_fl_get(next,"value"))))?parse_named_block(p1,line):parse_array(p1,line));})());;
|
|
48
|
+
const is_block_type_q = (s)=>((()=>{let c=_fl_char_at(s,0);return ((c>="A")&&(c<="Z"));})());;
|
|
49
|
+
const upper_case = (s)=>s;;
|
|
50
|
+
const parse_array = (p,line)=>((()=>{let collected=parse_args(p,[]);let p2=_fl_get(collected,"p");let items=_fl_get(collected,"node");return r_pair(parse_consume_rbracket(p2),make_array_block(items,line));})());;
|
|
51
|
+
const parse_consume_rbracket = (p)=>((()=>{let t=p_peek(p);return (((!(t==null))&&(_fl_get(t,"kind")==="RBracket"))?p_advance(p):p);})());;
|
|
52
|
+
const parse_named_block = (p,line)=>((()=>{let type_tok=p_peek(p);let type=_fl_get(type_tok,"value");let p1=p_advance(p);let name_info=parse_optional_name(p1);let p2=_fl_get(name_info,"p");let name=_fl_get(name_info,"node");let fields_info=parse_block_fields(p2,({}));let p3=_fl_get(fields_info,"p");let fields=_fl_get(fields_info,"node");return r_pair(parse_consume_rbracket(p3),make_block(type,name,fields,line));})());;
|
|
53
|
+
const parse_optional_name = (p)=>((()=>{let t=p_peek(p);return (((!(t==null))&&(_fl_get(t,"kind")==="Symbol")&&(!(_fl_char_at(_fl_get(t,"value"),0)===":")))?r_pair(p_advance(p),_fl_get(t,"value")):r_pair(p,null));})());;
|
|
54
|
+
const parse_block_fields = (p,acc)=>((()=>{let t=p_peek(p);return ((t==null)?r_pair(p,acc):((_fl_get(t,"kind")==="RBracket")?r_pair(p,acc):((_fl_get(t,"kind")==="Keyword")?((()=>{let key=_fl_get(t,"value");let p1=p_advance(p);let val=parse_expr(p1);let p2=_fl_get(val,"p");let v=_fl_get(val,"node");return parse_block_fields(p2,_fl_map_set(acc,key,v));})()):(true?r_pair(p_advance(p),acc):null))));})());;
|
|
55
|
+
const parse_map = (p)=>((()=>{let tok=p_peek(p);let line=_fl_get(tok,"line");let p1=p_advance(p);let collected=parse_args(p1,[]);let p2=_fl_get(collected,"p");let items=_fl_get(collected,"node");return r_pair(parse_consume_rbrace(p2),make_map_block(items,line));})());;
|
|
56
|
+
const parse_consume_rbrace = (p)=>((()=>{let t=p_peek(p);return (((!(t==null))&&(_fl_get(t,"kind")==="RBrace"))?p_advance(p):p);})());;
|
|
57
|
+
const parse_all = (p)=>(p_end_q(p)?_fl_get(p,"ast"):((()=>{let one=parse_expr(p);let p2=p_append_ast(_fl_get(one,"p"),_fl_get(one,"node"));return parse_all(p2);})()));;
|
|
58
|
+
const parse = (tokens)=>parse_all(p_make(tokens));;
|
|
59
|
+
const js_esc = (s)=>((()=>{let a=_fl_replace(s,"\\","\\\\");let b=_fl_replace(a,"\"","\\\"");let c=_fl_replace(b,"\n","\\n");let d=_fl_replace(c,"\r","\\r");let e=_fl_replace(d,"\t","\\t");return _fl_str("\"",e,"\"");})());;
|
|
60
|
+
const js_reserved_q = (n)=>((n==="default")||(n==="class")||(n==="const")||(n==="let")||(n==="if")||(n==="else")||(n==="switch")||(n==="case")||(n==="break")||(n==="continue")||(n==="for")||(n==="while")||(n==="function")||(n==="return")||(n==="throw")||(n==="try")||(n==="catch")||(n==="new")||(n==="delete")||(n==="typeof")||(n==="instanceof")||(n==="var")||(n==="in")||(n==="of")||(n==="this")||(n==="super")||(n==="void")||(n==="yield")||(n==="async")||(n==="await")||(n==="import")||(n==="export")||(n==="enum")||(n==="do")||(n==="with")||(n==="finally")||(n==="null")||(n==="true")||(n==="false"));;
|
|
61
|
+
const js_name = (n)=>((n==null)?"_":((()=>{let a=_fl_replace(n,"-","_");let b=_fl_replace(a,"?","_q");let c=_fl_replace(b,"!","_x");let d=_fl_replace(c,">","_gt");let e=_fl_replace(d,"<","_lt");let f=_fl_replace(e,"*","_st");let g=_fl_replace(f,"+","_pl");return (js_reserved_q(g)?_fl_str(g,"_"):g);})()));;
|
|
62
|
+
const cg = (n)=>((n==null)?"null":((_fl_get(n,"kind")==="literal")?cg_literal(n):((_fl_get(n,"kind")==="variable")?js_name(_fl_get(n,"name")):((_fl_get(n,"kind")==="keyword")?js_esc(_fl_get(n,"name")):((_fl_get(n,"kind")==="sexpr")?cg_sexpr(n):((_fl_get(n,"kind")==="block")?cg_block(n):((_fl_get(n,"kind")==="pattern-match")?cg_match(n):(true?"null":null))))))));;
|
|
63
|
+
const cg_literal = (n)=>((()=>{let t=_fl_get(n,"type");let v=_fl_get(n,"value");return ((t==="number")?v:((t==="string")?js_esc(v):((t==="boolean")?(v?"true":"false"):((t==="symbol")?((v==="true")?"true":((v==="false")?"false":((v==="null")?"null":(true?js_name(v):null)))):(true?"null":null)))));})());;
|
|
64
|
+
const cg_block = (n)=>((()=>{let t=_fl_get(n,"type");return ((t==="Array")?_fl_str("[",cg_args(_fl_get(_fl_get(n,"fields"),"items")),"]"):((t==="Map")?_fl_str("({",cg_map_entries(_fl_get(n,"fields")),"})"):((t==="FUNC")?cg_func_block(n):(true?"null":null))));})());;
|
|
65
|
+
const cg_map_entries = (fields)=>((()=>{let items=_fl_get(fields,"items");return ((items==null)?cg_map_loop(map_entries(fields),0,""):cg_map_flat_loop(items,0,""));})());;
|
|
66
|
+
const cg_map_loop = (entries,i,acc)=>((i>=_fl_length(entries))?acc:((()=>{let e=_fl_get(entries,i);let k=_fl_get(e,0);let v=cg(_fl_get(e,1));let pair=_fl_str(js_esc(k),":",v);return cg_map_loop(entries,(i+1),((i===0)?pair:_fl_str(acc,",",pair)));})()));;
|
|
67
|
+
const cg_map_flat_loop = (items,i,acc)=>((i>=_fl_length(items))?acc:((()=>{let k_n=_fl_get(items,i);let v_n=_fl_get(items,(i+1));let k_str=cg_keyword_key(k_n);let v_js=_fl_str(cg(v_n));let pair=_fl_str(k_str,":",v_js);return cg_map_flat_loop(items,(i+2),((i===0)?pair:_fl_str(acc,",",pair)));})()));;
|
|
68
|
+
const cg_keyword_key = (n)=>((_fl_get(n,"kind")==="keyword")?js_esc(_fl_get(n,"name")):((_fl_get(n,"kind")==="literal")?js_esc(_fl_str(_fl_get(n,"value"))):(true?"\"_anon\"":null)));;
|
|
69
|
+
const cg_func_block = (n)=>((()=>{let name=js_name(_fl_get(n,"name"));let fields=_fl_get(n,"fields");let pnode=_fl_get(fields,"params");let body=_fl_get(fields,"body");let pitems=((pnode==null)?[]:_fl_get(_fl_get(pnode,"fields"),"items"));let ps=extract_params(pitems);return _fl_str("const ",name," = (",ps,")=>",cg(body),";");})());;
|
|
70
|
+
const cg_if = (args)=>_fl_str("(",cg(_fl_get(args,0)),"?",cg(_fl_get(args,1)),":",((_fl_length(args)>=3)?cg(_fl_get(args,2)):"null"),")");;
|
|
71
|
+
const cg_fn = (args)=>((()=>{let pnode=_fl_get(args,0);let body=_fl_get(args,1);let ps=extract_params(_fl_get(_fl_get(pnode,"fields"),"items"));return _fl_str("((",ps,")=>",cg(body),")");})());;
|
|
72
|
+
const cg_defn = (args)=>((()=>{let name_n=_fl_get(args,0);let pnode=_fl_get(args,1);let body=_fl_get(args,2);let name=extract_name(name_n);let ps=extract_params(_fl_get(_fl_get(pnode,"fields"),"items"));return _fl_str("const ",name," = (",ps,")=>",cg(body));})());;
|
|
73
|
+
const cg_define = (args)=>((_fl_length(args)===2)?_fl_str("const ",extract_name(_fl_get(args,0))," = ",cg(_fl_get(args,1))):cg_defn(args));;
|
|
74
|
+
const cg_let = (args)=>((()=>{let bnode=_fl_get(args,0);let items=_fl_get(_fl_get(bnode,"fields"),"items");let first_item=((items==null)?null:_fl_get(items,0));let nested=((first_item==null)?false:((_fl_get(first_item,"kind")==="block")&&(_fl_get(first_item,"type")==="Array")));let bindings=(nested?cg_let_2d(items,0,""):cg_let_1d(items,0,""));let body_args=_fl_slice(args,1,_fl_length(args));let body_js=cg_do_body(body_args,0,"");return _fl_str("((()=>{",bindings,body_js,"})())");})());;
|
|
75
|
+
const cg_let_1d = (items,i,acc)=>((i>=_fl_length(items))?acc:((()=>{let k_n=_fl_get(items,i);let v_n=_fl_get(items,(i+1));let name=extract_name(k_n);let val=cg(v_n);return cg_let_1d(items,(i+2),_fl_str(acc,"let ",name,"=",val,";"));})()));;
|
|
76
|
+
const cg_let_2d = (items,i,acc)=>((i>=_fl_length(items))?acc:((()=>{let pair=_fl_get(items,i);let pitems=_fl_get(_fl_get(pair,"fields"),"items");let k_n=_fl_get(pitems,0);let v_n=_fl_get(pitems,1);let name=extract_name(k_n);let val=cg(v_n);return cg_let_2d(items,(i+1),_fl_str(acc,"let ",name,"=",val,";"));})()));;
|
|
77
|
+
const cg_do = (args)=>((_fl_length(args)===0)?"null":_fl_str("(()=>{",cg_do_body(args,0,""),"})()"));;
|
|
78
|
+
const cg_do_body = (args,i,acc)=>((i>=_fl_length(args))?acc:((()=>{let last=(i===(_fl_length(args)-1));let c=cg(_fl_get(args,i));let sep=(last?"return ":"");return cg_do_body(args,(i+1),_fl_str(acc,sep,c,";"));})()));;
|
|
79
|
+
const cg_cond = (args)=>cg_cond_loop(args,0);;
|
|
80
|
+
const cg_cond_loop = (args,i)=>((i>=_fl_length(args))?"null":((()=>{let clause=_fl_get(args,i);let citems=_fl_get(_fl_get(clause,"fields"),"items");let test=cg(_fl_get(citems,0));let result=cg(_fl_get(citems,1));let rest=cg_cond_loop(args,(i+1));return _fl_str("(",test,"?",result,":",rest,")");})()));;
|
|
81
|
+
const cg_and = (args)=>((_fl_length(args)===0)?"true":_fl_str("(",and_loop(args,0,""),")"));;
|
|
82
|
+
const and_loop = (args,i,acc)=>((i>=_fl_length(args))?acc:((()=>{let c=_fl_str(cg(_fl_get(args,i)));return and_loop(args,(i+1),((i===0)?c:_fl_str(acc,"&&",c)));})()));;
|
|
83
|
+
const cg_or = (args)=>((_fl_length(args)===0)?"false":_fl_str("(",or_loop(args,0,""),")"));;
|
|
84
|
+
const or_loop = (args,i,acc)=>((i>=_fl_length(args))?acc:((()=>{let c=_fl_str(cg(_fl_get(args,i)));return or_loop(args,(i+1),((i===0)?c:_fl_str(acc,"||",c)));})()));;
|
|
85
|
+
const cg_quote = (args)=>((_fl_length(args)===0)?"null":js_esc(_fl_str(cg(_fl_get(args,0)))));;
|
|
86
|
+
const cg_set_x = (args)=>_fl_str("(",extract_name(_fl_get(args,0)),"=",cg(_fl_get(args,1)),")");;
|
|
87
|
+
const cg_throw = (args)=>((()=>{let m=((_fl_length(args)===0)?"\"error\"":cg(_fl_get(args,0)));return _fl_str("(()=>{throw new Error(String(",m,"))})()");})());;
|
|
88
|
+
const cg_try = (args)=>((()=>{let body=cg(_fl_get(args,0));let catch_node=((_fl_length(args)>=2)?_fl_get(args,1):null);let catch_info=((catch_node==null)?null:extract_catch(catch_node));let evar=((catch_info==null)?"_err":_fl_get(catch_info,"evar"));let ebody=((catch_info==null)?"null":_fl_get(catch_info,"ebody"));return _fl_str("(()=>{try{return ",body,";}catch(",evar,"){return ",ebody,";}})()");})());;
|
|
89
|
+
const extract_catch = (n)=>((()=>{let args=_fl_get(n,"args");let ev=extract_name(_fl_get(args,0));let handler=cg(_fl_get(args,1));return ({"evar":ev,"ebody":handler});})());;
|
|
90
|
+
const cg_while = (args)=>((()=>{let cond=cg(_fl_get(args,0));let body_args=_fl_slice(args,1,_fl_length(args));let body=while_body(body_args,0,"");return _fl_str("(()=>{while(",cond,"){",body,"}})()");})());;
|
|
91
|
+
const while_body = (args,i,acc)=>((i>=_fl_length(args))?acc:while_body(args,(i+1),_fl_str(acc,cg(_fl_get(args,i)),";")));;
|
|
92
|
+
const cg_loop = (args)=>((()=>{let bnode=_fl_get(args,0);let items=_fl_get(_fl_get(bnode,"fields"),"items");let first=((items==null)?null:_fl_get(items,0));let nested=((first==null)?false:((_fl_get(first,"kind")==="block")&&(_fl_get(first,"type")==="Array")));let bindings=(nested?loop_inits_2d(items,0,""):loop_inits_1d(items,0,""));let names=(nested?loop_names_2d(items,0,""):loop_names_1d(items,0,""));let body_args=_fl_slice(args,1,_fl_length(args));let body_js=cg_do_body(body_args,0,"");return _fl_str("((()=>{",bindings,"while(true){let __r=(()=>{",body_js,"})();","if(__r&&__r.__recur){[",names,"]=__r.a;continue;}","return __r;}})())");})());;
|
|
93
|
+
const loop_inits_1d = (items,i,acc)=>((i>=_fl_length(items))?acc:((()=>{let k=_fl_get(items,i);let v=_fl_get(items,(i+1));return loop_inits_1d(items,(i+2),_fl_str(acc,"let ",extract_name(k),"=",cg(v),";"));})()));;
|
|
94
|
+
const loop_inits_2d = (items,i,acc)=>((i>=_fl_length(items))?acc:((()=>{let pair=_fl_get(items,i);let pit=_fl_get(_fl_get(pair,"fields"),"items");return loop_inits_2d(items,(i+1),_fl_str(acc,"let ",extract_name(_fl_get(pit,0)),"=",cg(_fl_get(pit,1)),";"));})()));;
|
|
95
|
+
const loop_names_1d = (items,i,acc)=>((i>=_fl_length(items))?acc:((()=>{let k=_fl_get(items,i);let n=extract_name(k);return loop_names_1d(items,(i+2),((_fl_length(acc)===0)?n:_fl_str(acc,",",n)));})()));;
|
|
96
|
+
const loop_names_2d = (items,i,acc)=>((i>=_fl_length(items))?acc:((()=>{let pair=_fl_get(items,i);let pit=_fl_get(_fl_get(pair,"fields"),"items");let n=extract_name(_fl_get(pit,0));return loop_names_2d(items,(i+1),((_fl_length(acc)===0)?n:_fl_str(acc,",",n)));})()));;
|
|
97
|
+
const cg_recur = (args)=>_fl_str("{__recur:true,a:[",cg_args(args),"]}");;
|
|
98
|
+
const cg_match = (n)=>((()=>{let val=cg(_fl_get(n,"value"));let cases=_fl_get(n,"cases");let default_n=_fl_get(n,"defaultCase");let default_=((default_n==null)?"null":cg(default_n));let cases_js=match_cases_loop(cases,0,"");return _fl_str("((__v)=>{",cases_js,"return ",default_,";})(",val,")");})());;
|
|
99
|
+
const match_cases_loop = (cases,i,acc)=>((i>=_fl_length(cases))?acc:((()=>{let c=_fl_get(cases,i);let pat=_fl_get(c,"pattern");let body=cg(_fl_get(c,"body"));let guard_n=_fl_get(c,"guard");let test=pattern_test(pat,"__v");let bind=pattern_bindings(pat,"__v");let guard_js=((guard_n==null)?"true":cg(guard_n));let inner=((guard_n==null)?_fl_str(bind,"return ",body,";"):_fl_str(bind,"if(",guard_js,"){return ",body,";}"));return match_cases_loop(cases,(i+1),_fl_str(acc,"if(",test,"){",inner,"}"));})()));;
|
|
100
|
+
const pattern_test = (pat,v)=>((()=>{let k=_fl_get(pat,"kind");return ((k==="wildcard-pattern")?"true":((k==="variable-pattern")?"true":((k==="literal-pattern")?_fl_str("(",v,"===",literal_to_js(_fl_get(pat,"type"),_fl_get(pat,"value")),")"):((k==="or-pattern")?or_pattern_test(_fl_get(pat,"patterns"),v,0,""):((k==="range-pattern")?_fl_str("(",v,">=",_fl_get(pat,"min"),"&&",v,"<=",_fl_get(pat,"max"),")"):(true?"false":null))))));})());;
|
|
101
|
+
const literal_to_js = (t,v)=>((t==="number")?v:((t==="string")?js_esc(v):((t==="symbol")?((v==="true")?"true":((v==="false")?"false":((v==="null")?"null":(true?js_esc(v):null)))):(true?"null":null))));;
|
|
102
|
+
const or_pattern_test = (pats,v,i,acc)=>((i>=_fl_length(pats))?((_fl_length(acc)===0)?"false":_fl_str("(",acc,")")):((()=>{let t=pattern_test(_fl_get(pats,i),v);return or_pattern_test(pats,v,(i+1),((_fl_length(acc)===0)?t:_fl_str(acc,"||",t)));})()));;
|
|
103
|
+
const pattern_bindings = (pat,v)=>((()=>{let k=_fl_get(pat,"kind");return ((k==="variable-pattern")?_fl_str("let ",js_name(_fl_get(pat,"name")),"=",v,";"):(true?"":null));})());;
|
|
104
|
+
const cg_compose = (args)=>_fl_str("((__x)=>",compose_nest(args,(_fl_length(args)-1),"__x"),")");;
|
|
105
|
+
const compose_nest = (args,i,acc)=>((i<0)?acc:((()=>{let f=_fl_str(cg(_fl_get(args,i)));return compose_nest(args,(i-1),_fl_str(f,"(",acc,")"));})()));;
|
|
106
|
+
const cg_pipe = (args)=>_fl_str("((__x)=>",pipe_nest(args,0,"__x"),")");;
|
|
107
|
+
const pipe_nest = (args,i,acc)=>((i>=_fl_length(args))?acc:((()=>{let f=_fl_str(cg(_fl_get(args,i)));return pipe_nest(args,(i+1),_fl_str(f,"(",acc,")"));})()));;
|
|
108
|
+
const cg_thread_first = (args)=>((()=>{let init=_fl_str(cg(_fl_get(args,0)));return thread_first_loop(args,1,init);})());;
|
|
109
|
+
const thread_first_loop = (args,i,acc)=>((i>=_fl_length(args))?acc:thread_first_loop(args,(i+1),thread_apply(_fl_get(args,i),acc,true)));;
|
|
110
|
+
const cg_thread_last = (args)=>((()=>{let init=_fl_str(cg(_fl_get(args,0)));return thread_last_loop(args,1,init);})());;
|
|
111
|
+
const thread_last_loop = (args,i,acc)=>((i>=_fl_length(args))?acc:thread_last_loop(args,(i+1),thread_apply(_fl_get(args,i),acc,false)));;
|
|
112
|
+
const thread_apply = (step,acc,fst)=>((_fl_get(step,"kind")==="sexpr")?((()=>{let op=js_name(_fl_get(step,"op"));let a=_fl_get(step,"args");return (fst?_fl_str(op,"(",acc,((_fl_length(a)===0)?"":_fl_str(",",cg_args(a))),")"):_fl_str(op,"(",((_fl_length(a)===0)?"":_fl_str(cg_args(a),",")),acc,")"));})()):(true?_fl_str(_fl_str(cg(step)),"(",acc,")"):null));;
|
|
113
|
+
const cg_call_form = (args)=>((()=>{let fn=_fl_str(cg(_fl_get(args,0)));let rest=_fl_slice(args,1,_fl_length(args));return _fl_str(fn,"(",cg_args(rest),")");})());;
|
|
114
|
+
const cg_async = (args)=>_fl_str("(async()=>{",cg_do_body(args,0,""),"})()");;
|
|
115
|
+
const cg_await = (args)=>_fl_str("(await ",cg(_fl_get(args,0)),")");;
|
|
116
|
+
const cg_defstruct = (args)=>((()=>{let name_n=_fl_get(args,0);let name=extract_name(name_n);let fields=_fl_slice(args,1,_fl_length(args));let params=struct_field_list(fields,0,"");let init=struct_init_list(fields,0,"");return _fl_str("const ",name," = (",params,")=>({__struct:\"",name,"\",",init,"})");})());;
|
|
117
|
+
const struct_field_list = (fs,i,acc)=>((i>=_fl_length(fs))?acc:((()=>{let n=extract_name(_fl_get(fs,i));return struct_field_list(fs,(i+1),((_fl_length(acc)===0)?n:_fl_str(acc,",",n)));})()));;
|
|
118
|
+
const struct_init_list = (fs,i,acc)=>((i>=_fl_length(fs))?acc:((()=>{let n=extract_name(_fl_get(fs,i));return struct_init_list(fs,(i+1),((_fl_length(acc)===0)?n:_fl_str(acc,",",n)));})()));;
|
|
119
|
+
const cg_args = (args)=>args_loop(args,0,"");;
|
|
120
|
+
const args_loop = (args,i,acc)=>((i>=_fl_length(args))?acc:((()=>{let c=_fl_str(cg(_fl_get(args,i)));return args_loop(args,(i+1),((i===0)?c:_fl_str(acc,",",c)));})()));;
|
|
121
|
+
const cg_binop = (args,op,zero)=>((_fl_length(args)===0)?zero:((_fl_length(args)===1)?_fl_str(cg(_fl_get(args,0))):(true?_fl_str("(",binop_loop(args,0,"",op),")"):null)));;
|
|
122
|
+
const binop_loop = (args,i,acc,op)=>((i>=_fl_length(args))?acc:((()=>{let c=_fl_str(cg(_fl_get(args,i)));return binop_loop(args,(i+1),((i===0)?c:_fl_str(acc,op,c)),op);})()));;
|
|
123
|
+
const cg_pair = (args,op)=>_fl_str("(",cg(_fl_get(args,0)),op,cg(_fl_get(args,1)),")");;
|
|
124
|
+
const cg_sub = (args)=>((_fl_length(args)===1)?_fl_str("(-",cg(_fl_get(args,0)),")"):_fl_str("(",cg(_fl_get(args,0)),"-",cg(_fl_get(args,1)),")"));;
|
|
125
|
+
const extract_name = (n)=>((_fl_get(n,"kind")==="variable")?js_name(_fl_get(n,"name")):((_fl_get(n,"kind")==="literal")?js_name(_fl_get(n,"value")):(true?"_anon":null)));;
|
|
126
|
+
const extract_params = (items)=>param_loop(items,0,"");;
|
|
127
|
+
const param_loop = (items,i,acc)=>((items==null)?acc:((i>=_fl_length(items))?acc:((()=>{let name=extract_name(_fl_get(items,i));return param_loop(items,(i+1),((i===0)?name:_fl_str(acc,",",name)));})())));;
|
|
128
|
+
const cg_native = (op,args)=>((()=>{let as=cg_args(args);return ((op==="str")?_fl_str("_fl_str(",as,")"):((op==="concat")?_fl_str("_fl_str(",as,")"):((op==="length")?_fl_str("_fl_length(",as,")"):((op==="substring")?_fl_str("_fl_substring(",as,")"):((op==="char-at")?_fl_str("_fl_char_at(",as,")"):((op==="replace")?_fl_str("_fl_replace(",as,")"):((op==="starts-with?")?_fl_str("_fl_starts_with(",as,")"):((op==="ends-with?")?_fl_str("_fl_ends_with(",as,")"):((op==="contains?")?_fl_str("_fl_contains(",as,")"):((op==="split")?_fl_str("_fl_split(",as,")"):((op==="join")?_fl_str("_fl_join(",as,")"):((op==="trim")?_fl_str("_fl_trim(",as,")"):((op==="upper")?_fl_str("_fl_upper(",as,")"):((op==="lower")?_fl_str("_fl_lower(",as,")"):((op==="repeat")?_fl_str("_fl_repeat(",as,")"):((op==="index-of")?_fl_str("_fl_index_of(",as,")"):((op==="first")?_fl_str("_fl_first(",as,")"):((op==="last")?_fl_str("_fl_last(",as,")"):((op==="rest")?_fl_str("_fl_rest(",as,")"):((op==="append")?_fl_str("_fl_append(",as,")"):((op==="slice")?_fl_str("_fl_slice(",as,")"):((op==="list")?_fl_str("[",as,"]"):((op==="map")?_fl_str("_fl_map(",as,")"):((op==="filter")?_fl_str("_fl_filter(",as,")"):((op==="reduce")?_fl_str("_fl_reduce(",as,")"):((op==="find")?_fl_str("_fl_find(",as,")"):((op==="every?")?_fl_str("_fl_every(",as,")"):((op==="some?")?_fl_str("_fl_some(",as,")"):((op==="sort")?_fl_str("_fl_sort(",as,")"):((op==="reverse")?_fl_str("_fl_reverse(",as,")"):((op==="flatten")?_fl_str("_fl_flatten(",as,")"):((op==="distinct")?_fl_str("_fl_distinct(",as,")"):((op==="range")?_fl_str("_fl_range(",as,")"):((op==="take")?_fl_str("_fl_take(",as,")"):((op==="drop")?_fl_str("_fl_drop(",as,")"):((op==="count")?_fl_str("_fl_length(",as,")"):((op==="get")?_fl_str("_fl_get(",as,")"):((op==="keys")?_fl_str("_fl_keys(",as,")"):((op==="values")?_fl_str("_fl_values(",as,")"):((op==="entries")?_fl_str("_fl_entries(",as,")"):((op==="has-key?")?_fl_str("_fl_has_key(",as,")"):((op==="map-set")?_fl_str("_fl_map_set(",as,")"):((op==="map-delete")?_fl_str("_fl_map_delete(",as,")"):((op==="merge")?_fl_str("_fl_merge(",as,")"):((op==="json_set")?_fl_str("_fl_map_set(",as,")"):((op==="json-parse")?_fl_str("JSON.parse(",as,")"):((op==="json-stringify")?_fl_str("JSON.stringify(",as,")"):((op==="json_parse")?_fl_str("JSON.parse(",as,")"):((op==="json_stringify")?_fl_str("JSON.stringify(",as,")"):((op==="null?")?_fl_str("(",as,"==null)"):((op==="not")?_fl_str("(!",as,")"):((op==="empty?")?_fl_str("_fl_empty_q(",as,")"):((op==="true?")?_fl_str("(",as,"===true)"):((op==="false?")?_fl_str("(",as,"===false)"):((op==="string?")?_fl_str("(typeof ",as,"===\"string\")"):((op==="number?")?_fl_str("(typeof ",as,"===\"number\")"):((op==="list?")?_fl_str("Array.isArray(",as,")"):((op==="map?")?_fl_str("_fl_is_map(",as,")"):((op==="fn?")?_fl_str("(typeof ",as,"===\"function\")"):((op==="boolean?")?_fl_str("(typeof ",as,"===\"boolean\")"):((op==="type-of")?_fl_str("_fl_type_of(",as,")"):((op==="min")?_fl_str("Math.min(",as,")"):((op==="max")?_fl_str("Math.max(",as,")"):((op==="abs")?_fl_str("Math.abs(",as,")"):((op==="sqrt")?_fl_str("Math.sqrt(",as,")"):((op==="pow")?_fl_str("Math.pow(",as,")"):((op==="floor")?_fl_str("Math.floor(",as,")"):((op==="ceil")?_fl_str("Math.ceil(",as,")"):((op==="round")?_fl_str("Math.round(",as,")"):((op==="mod")?cg_pair(args,"%"):((op==="neg")?_fl_str("(-",as,")"):((op==="sign")?_fl_str("Math.sign(",as,")"):((op==="random")?_fl_str("Math.random()"):((op==="log")?_fl_str("Math.log(",as,")"):((op==="exp")?_fl_str("Math.exp(",as,")"):((op==="sin")?_fl_str("Math.sin(",as,")"):((op==="cos")?_fl_str("Math.cos(",as,")"):((op==="str-to-num")?_fl_str("Number(",as,")"):((op==="num-to-str")?_fl_str("String(",as,")"):((op==="println")?_fl_str("console.log(",as,")"):((op==="print")?_fl_str("process.stdout.write(String(",as,"))"):((op==="file_read")?_fl_str("_fl_file_read(",as,")"):((op==="file_write")?_fl_str("_fl_file_write(",as,")"):((op==="file_exists")?_fl_str("_fl_file_exists(",as,")"):((op==="exit")?_fl_str("process.exit(",as,")"):((op==="shell_capture")?_fl_str("_fl_shell_capture(",as,")"):(true?cg_call(op,args):null)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));})());;
|
|
129
|
+
const cg_call = (op,args)=>((()=>{let fn_name=js_name(((_fl_char_at(op,0)==="$")?_fl_substring(op,1,_fl_length(op)):op));return _fl_str(fn_name,"(",cg_args(args),")");})());;
|
|
130
|
+
const cg_sexpr = (n)=>((()=>{let op=_fl_get(n,"op");let args=_fl_get(n,"args");return ((op==="if")?cg_if(args):((op==="fn")?cg_fn(args):((op==="defn")?cg_defn(args):((op==="define")?cg_define(args):((op==="let")?cg_let(args):((op==="do")?cg_do(args):((op==="begin")?cg_do(args):((op==="cond")?cg_cond(args):((op==="and")?cg_and(args):((op==="or")?cg_or(args):((op==="quote")?cg_quote(args):((op==="set!")?cg_set_x(args):((op==="throw")?cg_throw(args):((op==="try")?cg_try(args):((op==="while")?cg_while(args):((op==="loop")?cg_loop(args):((op==="recur")?cg_recur(args):((op==="defstruct")?cg_defstruct(args):((op==="compose")?cg_compose(args):((op==="pipe")?cg_pipe(args):((op==="->")?cg_thread_first(args):((op==="->>")?cg_thread_last(args):((op==="|>")?cg_thread_first(args):((op==="call")?cg_call_form(args):((op==="async")?cg_async(args):((op==="await")?cg_await(args):((op==="+")?cg_binop(args,"+","0"):((op==="-")?cg_sub(args):((op==="*")?cg_binop(args,"*","1"):((op==="/")?cg_pair(args,"/"):((op==="%")?cg_pair(args,"%"):((op==="<")?cg_pair(args,"<"):((op===">")?cg_pair(args,">"):((op==="<=")?cg_pair(args,"<="):((op===">=")?cg_pair(args,">="):((op==="=")?cg_pair(args,"==="):((op==="!=")?cg_pair(args,"!=="):(true?cg_native(op,args):null))))))))))))))))))))))))))))))))))))));})());;
|
|
131
|
+
const runtime_prelude = ()=>_fl_str("const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');","const _fl_length = (x) => (x==null ? 0 : x.length);","const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));","const _fl_char_at = (s, i) => (s[i] || null);","const _fl_replace = (s, a, b) => s.split(a).join(b);","const _fl_starts_with = (s, p) => s.startsWith(p);","const _fl_ends_with = (s, p) => s.endsWith(p);","const _fl_contains = (s, p) => s.includes(p);","const _fl_split = (s, sep) => s.split(sep);","const _fl_join = (l, sep) => l.join(sep==null?'':sep);","const _fl_trim = (s) => s.trim();","const _fl_upper = (s) => s.toUpperCase();","const _fl_lower = (s) => s.toLowerCase();","const _fl_repeat = (s, n) => s.repeat(n);","const _fl_index_of = (s, p) => s.indexOf(p);","const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);","const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);","const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));","const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);","const _fl_slice = (l, a, b) => l.slice(a, b);","const _fl_map = (f, l) => l.map(x => f(x));","const _fl_filter = (f, l) => l.filter(x => f(x));","const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);","const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);","const _fl_every = (f, l) => l.every(x => f(x));","const _fl_some = (f, l) => l.some(x => f(x));","const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));","const _fl_reverse = (l) => [...l].reverse();","const _fl_flatten = (l) => l.flat(Infinity);","const _fl_distinct = (l) => [...new Set(l)];","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; };","const _fl_take = (n, l) => l.slice(0, n);","const _fl_drop = (n, l) => l.slice(n);","const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));","const _fl_keys = (o) => (o==null ? [] : Object.keys(o));","const _fl_values = (o) => (o==null ? [] : Object.values(o));","const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));","const _fl_has_key = (o, k) => (o!=null && k in o);","const _fl_map_set = (o, k, v) => ({...o, [k]: v});","const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };","const _fl_merge = (...os) => Object.assign({}, ...os);","const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));","const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);","const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);","const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);","const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);","const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');","const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);","const _fl_file_exists = (p) => require('fs').existsSync(p);","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}; } };","const _fl_empty_q = (x) => (x==null || x.length===0);","const __argv__ = process.argv.slice(2);");;
|
|
132
|
+
const codegen_loop = (ast,i,acc)=>((i>=_fl_length(ast))?acc:codegen_loop(ast,(i+1),_fl_str(acc,cg(_fl_get(ast,i)),";\n")));;
|
|
133
|
+
const fl__gtjs_code = (ast)=>codegen_loop(ast,0,"");;
|
|
134
|
+
const fl__gtjs_with_prelude = (ast)=>_fl_str(runtime_prelude(),"\n",codegen_loop(ast,0,""));;
|
|
135
|
+
const compile_v12 = (input,output)=>((()=>{let src=_fl_file_read(input);let tokens=lex(src);let ast=parse(tokens);let js=fl__gtjs_with_prelude(ast);_fl_file_write(output,js);return console.log(_fl_str("v12 compiled ",input," -> ",output," size=",_fl_length(js)));})());;
|
|
136
|
+
|
|
137
|
+
module.exports = { lex, parse, cg, cg_func_block, extract_params, extract_name, param_loop };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const make_variable = ()=>({});;
|
|
3
|
+
const v = make_variable("src",1);
|
|
4
|
+
console.log("v:",v);
|
|
5
|
+
console.log("kind:",_fl_get(v,"kind"));
|
|
6
|
+
console.log("name:",_fl_get(v,"name"));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
(define toks (lex "[FUNC f :params [n] :body 1]"))
|
|
2
|
+
(println "toks-len:" (length toks))
|
|
3
|
+
(define ast (parse toks))
|
|
4
|
+
(println "ast-len:" (length ast))
|
|
5
|
+
(define n (get ast 0))
|
|
6
|
+
(println "n.type:" (get n :type))
|
|
7
|
+
(define f (get n :fields))
|
|
8
|
+
(println "fields-keys-items:" (get f "items"))
|
|
9
|
+
(println "fields-params:" (get f "params"))
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
;; v12-candidate 내부적으로 self-parser 로 파싱 검증
|
|
2
|
+
(define src "[FUNC f :params [x] :body (* x 2)]")
|
|
3
|
+
(define toks (lex src))
|
|
4
|
+
(println "toks-len:" (length toks))
|
|
5
|
+
(define ast (parse toks))
|
|
6
|
+
(define n (get ast 0))
|
|
7
|
+
(println "n.type:" (get n :type))
|
|
8
|
+
(println "n.fields:" (get n :fields))
|
|
9
|
+
(define f (get n :fields))
|
|
10
|
+
(define pnode (get f "params"))
|
|
11
|
+
(println "pnode:" pnode)
|
|
12
|
+
(define pf (get pnode :fields))
|
|
13
|
+
(define pitems (get pf "items"))
|
|
14
|
+
(println "pitems-len:" (length pitems))
|
|
15
|
+
(define p0 (get pitems 0))
|
|
16
|
+
(println "p0:" p0)
|
|
17
|
+
(println "p0.kind:" (get p0 :kind))
|
|
18
|
+
(println "p0.name:" (get p0 :name))
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const double = ()=>(x*2);;
|
|
3
|
+
console.log(double(21));
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const myfn = ()=>(x*2);;
|
|
3
|
+
console.log(myfn(21));
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const coll_reverse = (lst)=>reverse_loop(lst,0,[]);;
|
|
3
|
+
const reverse_loop = (lst,i,acc)=>((i>=_fl_length(lst))?acc:reverse_loop(lst,(i+1),_fl_append([_fl_get(lst,i)],acc)));;
|
|
4
|
+
const coll_range = (start,end)=>range_loop(start,end,[]);;
|
|
5
|
+
const range_loop = (s,e,acc)=>((s>=e)?acc:range_loop((s+1),e,_fl_append(acc,[s])));;
|
|
6
|
+
const coll_sum = (lst)=>sum_loop(lst,0,0);;
|
|
7
|
+
const sum_loop = (lst,i,acc)=>((i>=_fl_length(lst))?acc:sum_loop(lst,(i+1),(acc+_fl_get(lst,i))));;
|
|
8
|
+
const coll_take = (lst,n)=>((n>=_fl_length(lst))?lst:_fl_slice(lst,0,n));;
|
|
9
|
+
const coll_drop = (lst,n)=>((n>=_fl_length(lst))?[]:_fl_slice(lst,n,_fl_length(lst)));;
|
|
10
|
+
const coll_flatten = (lst)=>flatten_loop(lst,0,[]);;
|
|
11
|
+
const flatten_loop = (lst,i,acc)=>((i>=_fl_length(lst))?acc:((()=>{let item=_fl_get(lst,i);return ((item==null)?flatten_loop(lst,(i+1),acc):flatten_loop(lst,(i+1),_fl_append(acc,item)));})()));;
|
|
12
|
+
const coll_contains_q = (lst,v)=>contains_loop(lst,v,0);;
|
|
13
|
+
const contains_loop = (lst,v,i)=>((i>=_fl_length(lst))?false:((_fl_get(lst,i)===v)?true:(true?contains_loop(lst,v,(i+1)):null)));;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
(do
|
|
2
|
+
(println "Phase 16 Final Verification")
|
|
3
|
+
(let [[nums (list 5 2 9 1 3)]
|
|
4
|
+
[sorted (sort nums)]
|
|
5
|
+
[reversed (reverse sorted)]
|
|
6
|
+
[strs (list "hello" "world")]
|
|
7
|
+
[joined (join strs " ")]
|
|
8
|
+
[now (now_ms)]]
|
|
9
|
+
(do
|
|
10
|
+
(println (str "list ops OK"))
|
|
11
|
+
(println (str "string ops OK"))
|
|
12
|
+
(println (str "time OK")))))
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const now = () => Date.now();const now_ms = () => Date.now();const now_iso = () => new Date().toISOString();const now_unix = () => Math.floor(Date.now()/1000);const regex_match = (s, p) => new RegExp(p).test(s);const regex_find = (s, p) => { const m = s.match(new RegExp(p)); return m ? m[0] : null; };const regex_find_all = (s, p) => s.match(new RegExp(p, 'g')) || [];const regex_replace = (s, p, r) => s.replace(new RegExp(p, 'g'), r);const regex_split = (s, p) => s.split(new RegExp(p));const regex_count = (s, p) => (s.match(new RegExp(p, 'g')) || []).length;const regex_extract = (s, p) => { const m = s.match(new RegExp(p)); return m ? m.slice(1) : []; };const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);const _fl_pg_exec = (db,sql,...args) => null;const _fl_pg_query = (db,sql,...args) => [];const _fl_pg_connect = (cfg) => null;const _fl_mariadb_exec = (db,sql,...args) => null;const _fl_mariadb_query = (db,sql,...args) => [];const _fl_mariadb_one = (db,sql,...args) => null;const _fl_db_query = (path,sql,...args) => [];const _fl_db_exec = (path,sql,...args) => null;
|
|
2
|
+
(()=>{console.log("Phase 16 Final Verification");return ((()=>{let nums=[5,2,9,1,3];let sorted=_fl_sort(nums);let reversed=_fl_reverse(sorted);let strs=["hello","world"];let joined=_fl_join(strs," ");let now=now_ms();return (()=>{console.log(_fl_str("list ops OK"));console.log(_fl_str("string ops OK"));return console.log(_fl_str("time OK"));})();})());})();
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
console.log("hello");
|
|
3
|
+
console.log((1+2+3));
|
|
4
|
+
console.log(_fl_str("pi ~= ",3.14));
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);
|
|
2
|
+
console.log("hello");
|
|
3
|
+
console.log((1+2+3));
|
|
4
|
+
console.log(_fl_str("pi ~= ",3.14));
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const fact = (n)=>((n===0)?1:(n*fact((n-1))));;
|
|
3
|
+
console.log(fact(10));
|
|
4
|
+
console.log(fact(15));
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);
|
|
2
|
+
const fact = (n)=>((n===0)?1:(n*fact((n-1))));;
|
|
3
|
+
console.log(fact(10));
|
|
4
|
+
console.log(fact(15));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const gcd = (a,b)=>((b===0)?a:gcd(b,(a%b)));;
|
|
3
|
+
const sum_to = (n,acc)=>((n===0)?acc:sum_to((n-1),(acc+n)));;
|
|
4
|
+
const fib = (n)=>((n===0)?0:((n===1)?1:(true?(fib((n-1))+fib((n-2))):null)));;
|
|
5
|
+
console.log(gcd(48,18));
|
|
6
|
+
console.log(sum_to(30,0));
|
|
7
|
+
console.log(fib(10));
|
|
8
|
+
console.log(_fl_str("ok: ",(gcd(48,18)===6)));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
[FUNC gcd :params [a b] :body (if (= b 0) a (gcd b (% a b)))]
|
|
2
|
+
[FUNC sum-to :params [n acc]
|
|
3
|
+
:body (if (= n 0) acc (sum-to (- n 1) (+ acc n)))]
|
|
4
|
+
[FUNC fib :params [n]
|
|
5
|
+
:body (cond [(= n 0) 0] [(= n 1) 1]
|
|
6
|
+
[true (+ (fib (- n 1)) (fib (- n 2)))])]
|
|
7
|
+
|
|
8
|
+
(println (gcd 48 18))
|
|
9
|
+
(println (sum-to 30 0))
|
|
10
|
+
(println (fib 10))
|
|
11
|
+
(println (str "ok: " (= (gcd 48 18) 6)))
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);
|
|
2
|
+
const gcd = (a,b)=>((b===0)?a:gcd(b,(a%b)));;
|
|
3
|
+
const sum_to = (n,acc)=>((n===0)?acc:sum_to((n-1),(acc+n)));;
|
|
4
|
+
const fib = (n)=>((n===0)?0:((n===1)?1:(true?(fib((n-1))+fib((n-2))):null)));;
|
|
5
|
+
console.log(gcd(48,18));
|
|
6
|
+
console.log(sum_to(30,0));
|
|
7
|
+
console.log(fib(10));
|
|
8
|
+
console.log(_fl_str("ok: ",(gcd(48,18)===6)));
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const map_entries = (m) => m instanceof Map ? [...m.entries()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.entries(m) : []);const map_keys = (m) => m instanceof Map ? [...m.keys()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.keys(m) : []);const map_values = (m) => m instanceof Map ? [...m.values()] : (m && typeof m === 'object' && !Array.isArray(m) ? Object.values(m) : []);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);const __argv__ = process.argv.slice(2);
|
|
2
|
+
const rev_str = (s)=>((_fl_length(s)===0)?"":_fl_str(rev_str(_fl_substring(s,1,_fl_length(s))),_fl_char_at(s,0)));;
|
|
3
|
+
console.log(rev_str("hello"));
|
|
4
|
+
console.log(_fl_str("u:",_fl_upper("hi")));
|
|
5
|
+
console.log(_fl_str("l:",_fl_lower("HI")));
|
|
6
|
+
console.log(_fl_contains("hello world","world"));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
;; string 조작
|
|
2
|
+
[FUNC rev-str :params [s]
|
|
3
|
+
:body (if (= (length s) 0) ""
|
|
4
|
+
(str (rev-str (substring s 1 (length s))) (char-at s 0)))]
|
|
5
|
+
|
|
6
|
+
(println (rev-str "hello"))
|
|
7
|
+
(println (str "u:" (upper "hi")))
|
|
8
|
+
(println (str "l:" (lower "HI")))
|
|
9
|
+
(println (contains? "hello world" "world"))
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);
|
|
2
|
+
const rev_str = (s)=>((_fl_length(s)===0)?"":_fl_str(rev_str(_fl_substring(s,1,_fl_length(s))),_fl_char_at(s,0)));;
|
|
3
|
+
console.log(rev_str("hello"));
|
|
4
|
+
console.log(_fl_str("u:",_fl_upper("hi")));
|
|
5
|
+
console.log(_fl_str("l:",_fl_lower("HI")));
|
|
6
|
+
console.log(_fl_contains("hello world","world"));
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const _fl_str = (...xs) => xs.map(x => x==null?'null':String(x)).join('');const _fl_length = (x) => (x==null ? 0 : x.length);const _fl_substring = (s, a, b) => (b==null ? s.slice(a) : s.slice(a, b));const _fl_char_at = (s, i) => (s[i] || null);const _fl_replace = (s, a, b) => s.split(a).join(b);const _fl_starts_with = (s, p) => s.startsWith(p);const _fl_ends_with = (s, p) => s.endsWith(p);const _fl_contains = (s, p) => s.includes(p);const _fl_split = (s, sep) => s.split(sep);const _fl_join = (l, sep) => l.join(sep==null?'':sep);const _fl_trim = (s) => s.trim();const _fl_upper = (s) => s.toUpperCase();const _fl_lower = (s) => s.toLowerCase();const _fl_repeat = (s, n) => s.repeat(n);const _fl_index_of = (s, p) => s.indexOf(p);const _fl_first = (l) => (l==null || l.length===0 ? null : l[0]);const _fl_last = (l) => (l==null || l.length===0 ? null : l[l.length-1]);const _fl_rest = (l) => (l==null || l.length===0 ? [] : l.slice(1));const _fl_append = (a, b) => (Array.isArray(b) ? [...a, ...b] : [...a, b]);const _fl_slice = (l, a, b) => l.slice(a, b);const _fl_map = (f, l) => l.map(x => f(x));const _fl_filter = (f, l) => l.filter(x => f(x));const _fl_reduce = (f, init, l) => l.reduce((acc, x) => f(acc, x), init);const _fl_find = (f, l) => (l.find(x => f(x)) ?? null);const _fl_every = (f, l) => l.every(x => f(x));const _fl_some = (f, l) => l.some(x => f(x));const _fl_sort = (l, cmp) => [...l].sort(cmp || ((a,b)=>a<b?-1:a>b?1:0));const _fl_reverse = (l) => [...l].reverse();const _fl_flatten = (l) => l.flat(Infinity);const _fl_distinct = (l) => [...new Set(l)];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; };const _fl_take = (n, l) => l.slice(0, n);const _fl_drop = (n, l) => l.slice(n);const _fl_get = (o, k) => (o==null ? null : (o[k]===undefined ? null : o[k]));const _fl_keys = (o) => (o==null ? [] : Object.keys(o));const _fl_values = (o) => (o==null ? [] : Object.values(o));const _fl_entries = (o) => (o==null ? [] : Object.entries(o).map(([k,v])=>[k,v]));const _fl_has_key = (o, k) => (o!=null && k in o);const _fl_map_set = (o, k, v) => ({...o, [k]: v});const _fl_map_delete = (o, k) => { const c={...o}; delete c[k]; return c; };const _fl_merge = (...os) => Object.assign({}, ...os);const _fl_is_map = (x) => (x!=null && typeof x==='object' && !Array.isArray(x));const _fl_type_of = (x) => (x==null?'null':Array.isArray(x)?'list':typeof x);const _fl_file_read = (p) => require('fs').readFileSync(p, 'utf8');const _fl_file_write = (p, c) => require('fs').writeFileSync(p, c);const _fl_file_exists = (p) => require('fs').existsSync(p);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}; } };const _fl_empty_q = (x) => (x==null || x.length===0);
|
|
2
|
+
console.log("hello from fl->js pipeline");
|
|
3
|
+
console.log((1+2+3));
|
|
4
|
+
console.log(_fl_str("fact(10)=",3628800));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(println "hello")
|