functionalscript 0.3.3 → 0.3.5
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/com/cpp/module.f.d.ts +10 -0
- package/com/cpp/module.f.js +107 -0
- package/com/cpp/test.f.d.ts +2 -0
- package/com/cpp/{test.f.ts → test.f.js} +9 -11
- package/com/cpp/testlib.f.d.ts +2 -0
- package/com/cpp/testlib.f.js +5 -0
- package/com/cs/module.f.d.ts +12 -0
- package/com/cs/module.f.js +80 -0
- package/com/cs/test.f.d.ts +2 -0
- package/com/cs/{test.f.ts → test.f.js} +9 -11
- package/com/cs/testlib.f.d.ts +2 -0
- package/com/cs/testlib.f.js +5 -0
- package/com/rust/module.f.d.ts +15 -0
- package/com/rust/module.f.js +169 -0
- package/com/rust/test.f.d.ts +2 -0
- package/com/rust/{test.f.ts → test.f.js} +7 -7
- package/com/rust/testlib.f.d.ts +2 -0
- package/com/rust/testlib.f.js +5 -0
- package/com/test/build.f.d.ts +20 -0
- package/com/test/build.f.js +58 -0
- package/com/types/module.f.d.ts +28 -0
- package/com/types/module.f.js +8 -0
- package/com/types/testlib.f.d.ts +44 -0
- package/com/types/{testlib.f.ts → testlib.f.js} +2 -3
- package/commonjs/build/module.f.d.ts +6 -0
- package/commonjs/build/module.f.js +69 -0
- package/commonjs/build/test.f.d.ts +2 -0
- package/commonjs/build/test.f.js +96 -0
- package/commonjs/module/function/{module.f.ts → module.f.d.ts} +5 -10
- package/commonjs/module/function/module.f.js +4 -0
- package/commonjs/module/module.f.d.ts +18 -0
- package/commonjs/module/module.f.js +12 -0
- package/commonjs/module.f.d.ts +6 -0
- package/commonjs/module.f.js +1 -0
- package/commonjs/package/dependencies/module.f.d.ts +7 -0
- package/commonjs/package/dependencies/module.f.js +13 -0
- package/commonjs/package/dependencies/test.f.d.ts +2 -0
- package/commonjs/package/dependencies/test.f.js +15 -0
- package/commonjs/package/module.f.d.ts +17 -0
- package/commonjs/package/module.f.js +18 -0
- package/commonjs/package/test.f.d.ts +2 -0
- package/commonjs/package/test.f.js +27 -0
- package/commonjs/path/module.f.d.ts +24 -0
- package/commonjs/path/module.f.js +114 -0
- package/commonjs/path/test.f.d.ts +25 -0
- package/commonjs/path/{test.f.ts → test.f.js} +123 -89
- package/crypto/prime_field/module.f.d.ts +43 -0
- package/crypto/prime_field/module.f.js +78 -0
- package/crypto/prime_field/test.f.d.ts +13 -0
- package/crypto/prime_field/test.f.js +149 -0
- package/crypto/secp/module.f.d.ts +68 -0
- package/crypto/secp/module.f.js +127 -0
- package/crypto/secp/test.f.d.ts +5 -0
- package/crypto/secp/test.f.js +72 -0
- package/crypto/sha2/module.f.d.ts +13 -0
- package/crypto/sha2/module.f.js +145 -0
- package/crypto/sha2/test.f.d.ts +9 -0
- package/crypto/sha2/test.f.js +82 -0
- package/dev/module.f.d.ts +1 -0
- package/dev/module.f.js +1 -0
- package/dev/test/module.f.d.ts +20 -0
- package/dev/test/module.f.js +75 -0
- package/dev/test.f.d.ts +9 -0
- package/dev/{test.f.ts → test.f.js} +22 -24
- package/djs/module.f.d.ts +17 -0
- package/djs/module.f.js +63 -0
- package/djs/parser/module.f.d.ts +12 -0
- package/djs/parser/module.f.js +333 -0
- package/djs/parser/test.f.d.ts +12 -0
- package/djs/parser/test.f.js +717 -0
- package/djs/serializer/module.f.d.ts +9 -0
- package/djs/serializer/module.f.js +81 -0
- package/djs/test/input.f.d.ts +2 -0
- package/djs/test/input.f.js +4 -0
- package/djs/test/m.f.d.ts +2 -0
- package/djs/test/m.f.js +1 -0
- package/djs/test.f.d.ts +12 -0
- package/djs/test.f.js +84 -0
- package/djs/tokenizer/module.f.d.ts +8 -0
- package/djs/tokenizer/module.f.js +60 -0
- package/djs/tokenizer/test.f.d.ts +7 -0
- package/djs/tokenizer/test.f.js +529 -0
- package/fsc/module.f.d.ts +5 -0
- package/fsc/module.f.js +75 -0
- package/fsc/test.f.d.ts +4 -0
- package/fsc/test.f.js +19 -0
- package/fsm/module.f.d.ts +13 -0
- package/fsm/module.f.js +59 -0
- package/fsm/test.f.d.ts +5 -0
- package/fsm/test.f.js +137 -0
- package/html/module.f.d.ts +13 -0
- package/html/module.f.js +58 -0
- package/html/test.f.d.ts +9 -0
- package/html/test.f.js +42 -0
- package/issues/test.f.d.ts +16 -0
- package/issues/test.f.js +70 -0
- package/js/tokenizer/module.f.d.ts +86 -0
- package/js/tokenizer/module.f.js +503 -0
- package/js/tokenizer/test.f.d.ts +9 -0
- package/js/tokenizer/test.f.js +905 -0
- package/json/module.f.d.ts +20 -0
- package/json/module.f.js +68 -0
- package/json/parser/module.f.d.ts +5 -0
- package/json/parser/module.f.js +155 -0
- package/json/parser/test.f.d.ts +5 -0
- package/json/parser/test.f.js +328 -0
- package/json/serializer/module.f.d.ts +7 -0
- package/json/serializer/module.f.js +21 -0
- package/json/serializer/test.f.d.ts +8 -0
- package/json/serializer/test.f.js +87 -0
- package/json/test.f.d.ts +8 -0
- package/json/test.f.js +61 -0
- package/json/tokenizer/module.f.d.ts +8 -0
- package/json/tokenizer/module.f.js +52 -0
- package/json/tokenizer/test.f.d.ts +6 -0
- package/json/tokenizer/test.f.js +419 -0
- package/nanvm-lib/tests/test.f.d.ts +27 -0
- package/nanvm-lib/tests/test.f.js +84 -0
- package/nodejs/version/module.f.d.ts +11 -0
- package/nodejs/version/module.f.js +16 -0
- package/nodejs/version/test.f.d.ts +2 -0
- package/nodejs/version/{test.f.ts → test.f.js} +13 -22
- package/package.json +9 -5
- package/text/ascii/module.f.d.ts +129 -0
- package/text/ascii/module.f.js +148 -0
- package/text/ascii/test.f.d.ts +4 -0
- package/text/ascii/test.f.js +14 -0
- package/text/module.f.d.ts +8 -0
- package/text/module.f.js +10 -0
- package/text/sgr/module.f.d.ts +8 -0
- package/text/sgr/module.f.js +8 -0
- package/text/test.f.d.ts +2 -0
- package/text/test.f.js +18 -0
- package/text/utf16/module.f.d.ts +9 -0
- package/text/utf16/module.f.js +66 -0
- package/text/utf16/test.f.d.ts +6 -0
- package/text/utf16/test.f.js +144 -0
- package/text/utf8/module.f.d.ts +6 -0
- package/text/utf8/module.f.js +112 -0
- package/text/utf8/test.f.d.ts +6 -0
- package/text/utf8/test.f.js +175 -0
- package/types/array/module.f.d.ts +21 -0
- package/types/array/module.f.js +23 -0
- package/types/array/test.f.d.ts +10 -0
- package/types/array/test.f.js +116 -0
- package/types/bigfloat/module.f.d.ts +3 -0
- package/types/bigfloat/module.f.js +66 -0
- package/types/bigfloat/test.f.d.ts +6 -0
- package/types/bigfloat/test.f.js +349 -0
- package/types/bigint/module.f.d.ts +54 -0
- package/types/bigint/{module.f.ts → module.f.js} +42 -65
- package/types/bigint/test.f.d.ts +16 -0
- package/types/bigint/test.f.js +199 -0
- package/types/bit_vec/module.f.d.ts +134 -0
- package/types/bit_vec/{module.f.ts → module.f.js} +47 -65
- package/types/bit_vec/test.f.d.ts +22 -0
- package/types/bit_vec/test.f.js +210 -0
- package/types/btree/find/module.f.d.ts +20 -0
- package/types/btree/find/module.f.js +84 -0
- package/types/btree/find/test.f.d.ts +2 -0
- package/types/btree/find/test.f.js +152 -0
- package/types/btree/module.f.d.ts +4 -0
- package/types/btree/module.f.js +31 -0
- package/types/btree/remove/module.f.d.ts +4 -0
- package/types/btree/remove/module.f.js +174 -0
- package/types/btree/remove/test.f.d.ts +5 -0
- package/types/btree/remove/test.f.js +634 -0
- package/types/btree/set/module.f.d.ts +3 -0
- package/types/btree/set/module.f.js +103 -0
- package/types/btree/set/test.f.d.ts +2 -0
- package/types/btree/set/test.f.js +360 -0
- package/types/btree/test.f.d.ts +8 -0
- package/types/btree/test.f.js +75 -0
- package/types/btree/types/module.f.d.ts +11 -0
- package/types/btree/types/module.f.js +1 -0
- package/types/byte_set/module.f.d.ts +16 -0
- package/types/byte_set/module.f.js +28 -0
- package/types/byte_set/test.f.d.ts +12 -0
- package/types/byte_set/test.f.js +122 -0
- package/types/function/compare/module.f.d.ts +10 -0
- package/types/function/compare/module.f.js +7 -0
- package/types/function/compare/test.f.d.ts +2 -0
- package/types/function/compare/test.f.js +8 -0
- package/types/function/module.f.d.ts +28 -0
- package/types/function/module.f.js +19 -0
- package/types/function/operator/module.f.d.ts +20 -0
- package/types/function/operator/module.f.js +18 -0
- package/types/function/test.f.d.ts +2 -0
- package/types/function/test.f.js +12 -0
- package/types/list/module.f.d.ts +50 -0
- package/types/list/module.f.js +171 -0
- package/types/list/test.f.d.ts +22 -0
- package/types/list/test.f.js +395 -0
- package/types/map/module.f.d.ts +14 -0
- package/types/map/module.f.js +31 -0
- package/types/map/test.f.d.ts +5 -0
- package/types/map/test.f.js +114 -0
- package/types/nibble_set/module.f.d.ts +10 -0
- package/types/nibble_set/module.f.js +9 -0
- package/types/nibble_set/test.f.d.ts +12 -0
- package/types/nibble_set/test.f.js +90 -0
- package/types/nullable/module.f.d.ts +3 -0
- package/types/nullable/module.f.js +2 -0
- package/types/nullable/test.f.d.ts +2 -0
- package/types/nullable/test.f.js +12 -0
- package/types/number/module.f.d.ts +6 -0
- package/types/number/module.f.js +8 -0
- package/types/number/test.f.d.ts +11 -0
- package/types/number/test.f.js +124 -0
- package/types/object/module.f.d.ts +10 -0
- package/types/object/module.f.js +12 -0
- package/types/object/test.f.d.ts +5 -0
- package/types/object/test.f.js +17 -0
- package/types/range/module.f.d.ts +3 -0
- package/types/range/module.f.js +2 -0
- package/types/range/test.f.d.ts +2 -0
- package/types/range/test.f.js +18 -0
- package/types/range_map/module.f.d.ts +14 -0
- package/types/range_map/module.f.js +51 -0
- package/types/range_map/test.f.d.ts +6 -0
- package/types/range_map/test.f.js +176 -0
- package/types/result/module.f.d.ts +7 -0
- package/types/result/module.f.js +8 -0
- package/types/sorted_list/module.f.d.ts +16 -0
- package/types/sorted_list/module.f.js +56 -0
- package/types/sorted_list/test.f.d.ts +5 -0
- package/types/sorted_list/test.f.js +64 -0
- package/types/sorted_set/module.f.d.ts +7 -0
- package/types/sorted_set/module.f.js +14 -0
- package/types/sorted_set/test.f.d.ts +6 -0
- package/types/sorted_set/test.f.js +78 -0
- package/types/string/module.f.d.ts +6 -0
- package/types/string/module.f.js +11 -0
- package/types/string/test.f.d.ts +15 -0
- package/types/string/test.f.js +58 -0
- package/types/string_set/module.f.d.ts +9 -0
- package/types/string_set/module.f.js +22 -0
- package/types/string_set/test.f.d.ts +5 -0
- package/types/string_set/test.f.js +65 -0
- package/.github/FUNDING.yml +0 -12
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -88
- package/.github/workflows/npm-publish.yml +0 -53
- package/CHANGELOG.md +0 -29
- package/Cargo.lock +0 -18
- package/Cargo.toml +0 -7
- package/com/README.md +0 -3
- package/com/cpp/README.md +0 -80
- package/com/cpp/module.f.ts +0 -180
- package/com/cpp/nanocom.hpp +0 -195
- package/com/cpp/testlib.f.ts +0 -8
- package/com/cs/module.f.ts +0 -145
- package/com/cs/testlib.f.ts +0 -8
- package/com/proposals.md +0 -28
- package/com/rust/module.f.ts +0 -287
- package/com/rust/nanocom/Cargo.lock +0 -7
- package/com/rust/nanocom/Cargo.toml +0 -15
- package/com/rust/nanocom/README.md +0 -56
- package/com/rust/nanocom/src/class.rs +0 -6
- package/com/rust/nanocom/src/cobject.rs +0 -90
- package/com/rust/nanocom/src/guid.rs +0 -15
- package/com/rust/nanocom/src/hresult.rs +0 -7
- package/com/rust/nanocom/src/interface.rs +0 -9
- package/com/rust/nanocom/src/iunknown.rs +0 -13
- package/com/rust/nanocom/src/lib.rs +0 -20
- package/com/rust/nanocom/src/object.rs +0 -34
- package/com/rust/nanocom/src/ref.rs +0 -57
- package/com/rust/nanocom/src/vmt.rs +0 -7
- package/com/rust/nanocom/tests/it.rs +0 -186
- package/com/rust/nanocom/tests/itmod.rs +0 -195
- package/com/rust/testlib.f.ts +0 -8
- package/com/test/build.f.ts +0 -111
- package/com/test/build.ts +0 -45
- package/com/test/cpp/main.cpp +0 -74
- package/com/test/cs/Program.cs +0 -31
- package/com/test/cs/cs.csproj +0 -16
- package/com/test/rust/Cargo.toml +0 -12
- package/com/test/rust/src/lib.rs +0 -56
- package/com/types/module.f.ts +0 -62
- package/commonjs/README.md +0 -94
- package/commonjs/build/module.f.ts +0 -100
- package/commonjs/build/test.f.ts +0 -107
- package/commonjs/module/module.f.ts +0 -41
- package/commonjs/module.f.ts +0 -7
- package/commonjs/module.ts +0 -31
- package/commonjs/package/dependencies/module.f.ts +0 -22
- package/commonjs/package/dependencies/test.f.ts +0 -8
- package/commonjs/package/module.f.ts +0 -31
- package/commonjs/package/test.f.ts +0 -12
- package/commonjs/path/README.md +0 -17
- package/commonjs/path/module.f.ts +0 -171
- package/commonjs/test.ts +0 -64
- package/crypto/README.md +0 -3
- package/crypto/prime_field/module.f.ts +0 -114
- package/crypto/prime_field/test.f.ts +0 -95
- package/crypto/secp/module.f.ts +0 -182
- package/crypto/secp/test.f.ts +0 -68
- package/crypto/sha2/module.f.ts +0 -215
- package/crypto/sha2/test.f.ts +0 -83
- package/deno.json +0 -71
- package/dev/README.md +0 -8
- package/dev/index.ts +0 -3
- package/dev/module.f.ts +0 -1
- package/dev/module.ts +0 -196
- package/dev/test/module.f.ts +0 -135
- package/dev/test.ts +0 -53
- package/djs/README.md +0 -54
- package/djs/module.f.ts +0 -76
- package/djs/parser/module.f.ts +0 -509
- package/djs/parser/test.f.ts +0 -461
- package/djs/serializer/module.f.ts +0 -90
- package/djs/test.f.ts +0 -67
- package/djs/tokenizer/module.f.ts +0 -99
- package/djs/tokenizer/test.f.ts +0 -364
- package/doc/LANGUAGE.md +0 -255
- package/doc/README.md +0 -61
- package/doc/byte-code.md +0 -59
- package/doc/fa.md +0 -174
- package/doc/predefined.md +0 -143
- package/doc/proposals.md +0 -21
- package/doc/vm/README.md +0 -24
- package/doc/vm-rearchitecture.md +0 -129
- package/doc/vm.md +0 -150
- package/fsc/README.md +0 -111
- package/fsc/module.f.ts +0 -122
- package/fsc/test.f.ts +0 -21
- package/fsm/README.md +0 -113
- package/fsm/module.f.ts +0 -107
- package/fsm/test.f.ts +0 -139
- package/funding.json +0 -61
- package/html/README.md +0 -32
- package/html/module.f.ts +0 -109
- package/html/test.f.ts +0 -37
- package/issues/01-test-debug.md +0 -3
- package/issues/02-esm.md +0 -8
- package/issues/03-djs.md +0 -57
- package/issues/05-publish.md +0 -40
- package/issues/11-fs-load.md +0 -13
- package/issues/17-djs-extension.md +0 -6
- package/issues/README.md +0 -42
- package/issues/lang/1000-json.md +0 -50
- package/issues/lang/2110-default-export.md +0 -11
- package/issues/lang/2120-const.md +0 -14
- package/issues/lang/2130-default-import.md +0 -10
- package/issues/lang/2210-block-comment.md +0 -12
- package/issues/lang/2220-namespace-import.md +0 -25
- package/issues/lang/2310-undefined.md +0 -7
- package/issues/lang/2320-bigint.md +0 -7
- package/issues/lang/2330-property-accessor.md +0 -225
- package/issues/lang/2340-operators.md +0 -41
- package/issues/lang/2350-grouping.md +0 -11
- package/issues/lang/2360-built-in.md +0 -81
- package/issues/lang/2410-identifier-property.md +0 -9
- package/issues/lang/2420-line-comment.md +0 -10
- package/issues/lang/2430-trailing-comma.md +0 -13
- package/issues/lang/2440-shorthand.md +0 -8
- package/issues/lang/2450-destructuring.md +0 -12
- package/issues/lang/3110-function.md +0 -35
- package/issues/lang/3120-parameters.md +0 -9
- package/issues/lang/3130-body-const.md +0 -12
- package/issues/lang/3220-let.md +0 -11
- package/issues/lang/3240-export.md +0 -44
- package/issues/lang/3370-type-inference.md +0 -69
- package/issues/lang/3380-promise.md +0 -22
- package/issues/lang/3390-class.md +0 -3
- package/issues/lang/3410-expression.md +0 -12
- package/issues/lang/3420-one-parameter.md +0 -10
- package/issues/lang/3430-assignments.md +0 -23
- package/issues/lang/README.md +0 -193
- package/issues/test.f.ts +0 -58
- package/js/tokenizer/module.f.ts +0 -882
- package/js/tokenizer/test.f.ts +0 -617
- package/json/html/README.md +0 -49
- package/json/module.f.ts +0 -94
- package/json/parser/module.f.ts +0 -221
- package/json/parser/test.f.ts +0 -255
- package/json/serializer/module.f.ts +0 -74
- package/json/serializer/test.f.ts +0 -64
- package/json/test.f.ts +0 -48
- package/json/tokenizer/module.f.ts +0 -85
- package/json/tokenizer/test.f.ts +0 -290
- package/nanvm-lib/Cargo.toml +0 -6
- package/nanvm-lib/src/extension.rs +0 -130
- package/nanvm-lib/src/interface.rs +0 -133
- package/nanvm-lib/src/lib.rs +0 -7
- package/nanvm-lib/src/naive.rs +0 -236
- package/nanvm-lib/src/nanenum.rs +0 -236
- package/nanvm-lib/src/nullish.rs +0 -7
- package/nanvm-lib/src/sign.rs +0 -5
- package/nanvm-lib/src/simple.rs +0 -32
- package/nanvm-lib/tests/test.f.ts +0 -80
- package/nanvm-lib/tests/test.rs +0 -108
- package/nodejs/version/main.ts +0 -4
- package/nodejs/version/module.f.ts +0 -42
- package/text/README.md +0 -110
- package/text/ascii/module.f.ts +0 -222
- package/text/ascii/test.f.ts +0 -14
- package/text/module.f.ts +0 -30
- package/text/sgr/README.md +0 -3
- package/text/sgr/module.f.ts +0 -13
- package/text/test.f.ts +0 -19
- package/text/utf16/module.f.ts +0 -120
- package/text/utf16/test.f.ts +0 -107
- package/text/utf8/module.f.ts +0 -116
- package/text/utf8/test.f.ts +0 -125
- package/tsconfig.json +0 -104
- package/types/array/module.f.ts +0 -89
- package/types/array/test.f.ts +0 -88
- package/types/bigfloat/module.f.ts +0 -93
- package/types/bigfloat/test.f.ts +0 -218
- package/types/bigint/README.md +0 -35
- package/types/bigint/test.f.ts +0 -144
- package/types/bit_vec/README.md +0 -18
- package/types/bit_vec/test.f.ts +0 -129
- package/types/btree/README.md +0 -160
- package/types/btree/find/module.f.ts +0 -92
- package/types/btree/find/test.f.ts +0 -122
- package/types/btree/module.f.ts +0 -35
- package/types/btree/remove/module.f.ts +0 -151
- package/types/btree/remove/test.f.ts +0 -498
- package/types/btree/set/module.f.ts +0 -89
- package/types/btree/set/test.f.ts +0 -415
- package/types/btree/test.f.ts +0 -92
- package/types/btree/types/module.f.ts +0 -27
- package/types/byte_set/module.f.ts +0 -73
- package/types/byte_set/test.f.ts +0 -84
- package/types/function/compare/module.f.ts +0 -26
- package/types/function/compare/test.f.ts +0 -7
- package/types/function/module.f.ts +0 -43
- package/types/function/operator/module.f.ts +0 -65
- package/types/function/test.f.ts +0 -20
- package/types/list/module.f.ts +0 -350
- package/types/list/test.f.ts +0 -327
- package/types/map/module.f.ts +0 -65
- package/types/map/test.f.ts +0 -76
- package/types/nibble_set/module.f.ts +0 -34
- package/types/nibble_set/test.f.ts +0 -57
- package/types/nullable/module.f.ts +0 -9
- package/types/nullable/test.f.ts +0 -9
- package/types/number/module.f.ts +0 -20
- package/types/number/test.f.ts +0 -194
- package/types/object/module.f.ts +0 -30
- package/types/object/test.f.ts +0 -14
- package/types/range/module.f.ts +0 -10
- package/types/range/test.f.ts +0 -9
- package/types/range_map/module.f.ts +0 -70
- package/types/range_map/test.f.ts +0 -189
- package/types/result/module.f.ts +0 -20
- package/types/result/module.ts +0 -18
- package/types/sorted_list/module.f.ts +0 -83
- package/types/sorted_list/test.f.ts +0 -57
- package/types/sorted_set/module.f.ts +0 -36
- package/types/sorted_set/test.f.ts +0 -67
- package/types/string/module.f.ts +0 -26
- package/types/string/test.f.ts +0 -43
- package/types/string_set/module.f.ts +0 -37
- package/types/string_set/test.f.ts +0 -34
package/doc/vm/README.md
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# VM
|
|
2
|
-
|
|
3
|
-
Two options:
|
|
4
|
-
- using instances
|
|
5
|
-
- using types. In this case, if we need multiple VMs in the same process, we need multiple types.
|
|
6
|
-
|
|
7
|
-
## Rust Interface
|
|
8
|
-
|
|
9
|
-
```rust
|
|
10
|
-
trait Any {
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
trait String {
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
trait Bigint {
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
trait Object {
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
trait Array {
|
|
23
|
-
}
|
|
24
|
-
```
|
package/doc/vm-rearchitecture.md
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# NaNVM Re-Architecture
|
|
2
|
-
|
|
3
|
-
About a year ago (Nov 2023), the FunctionalScript team started a new project called [NaNVM](https://github.com/functionalscript/nanvm). We have limited resources (⌛💰) for the projects, so progress has been slow. Since then, we’ve implemented several components from scratch in Rust:
|
|
4
|
-
- An interface and multiple implementations for [Memory Management](https://github.com/functionalscript/nanvm/tree/main/nanvm-lib/src/mem), such as a [global](https://github.com/functionalscript/nanvm/blob/main/nanvm-lib/src/mem/global.rs) memory manager using standard `alloc/dealloc`, a [local](https://github.com/functionalscript/nanvm/blob/main/nanvm-lib/src/mem/local.rs) manager with a reference counter, and a simple [arena](https://github.com/functionalscript/nanvm/blob/main/nanvm-lib/src/mem/arena.rs) implementation.
|
|
5
|
-
- [All FS data types](https://github.com/functionalscript/nanvm/tree/main/nanvm-lib/src/js) in the VM, such as [string](https://github.com/functionalscript/nanvm/blob/main/nanvm-lib/src/js/js_string.rs), [bigint](https://github.com/functionalscript/nanvm/blob/main/nanvm-lib/src/js/js_bigint.rs), [array](https://github.com/functionalscript/nanvm/blob/main/nanvm-lib/src/js/js_array.rs), [object](https://github.com/functionalscript/nanvm/blob/main/nanvm-lib/src/js/js_object.rs), and [any](https://github.com/functionalscript/nanvm/blob/main/nanvm-lib/src/js/any.rs).
|
|
6
|
-
- And, of course, we've implemented a parser for JSON and DJS in Rust, which works well. See [this article about DJS](https://medium.com/@sasha.gil/bridging-the-gap-from-json-to-javascript-without-dsls-fee273573f1b) for more information.
|
|
7
|
-
|
|
8
|
-
All of this code is written in Rust. Rust excels at runtime performance and system-level programming. However, developers often struggle when working with high-level and business logic. Its verbosity and various memory management models make developing components like parsers in Rust slow and complex. It’s great for implementing a memory manager, a VM, or a big integer but less suited for tasks like implementing a parser efficiently (and yes, we are aware of third-party parser generators). That’s why we want to use a high-level language for this purpose. Of course, we don't need to search for one because we already have FunctionalScript and JavaScript as glue. Additionally, because of our limited resources, we aim to use only a few repositories. As a result, we plan to merge the NaNVM code into the [FunctionalScript repo](https://github.com/functionalscript/functionalscript).
|
|
9
|
-
|
|
10
|
-
## Stage 0: Current State
|
|
11
|
-
|
|
12
|
-
Before we start rearchitecting the project, we should understand our current architecture. Here's the current module dependency graph for [nanvm_lib](https://github.com/functionalscript/nanvm/tree/main/nanvm-lib/src):
|
|
13
|
-
|
|
14
|
-
```mermaid
|
|
15
|
-
flowchart TB
|
|
16
|
-
app[Application] --> parser[Parser] --> js[VM] --> mem[Memory Manager]
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
The parser is written in Rust using VM types, such as `JsString` and `JsBigInt`. The application can parse JSON and DJS files and output in any of these formats as a standalone module.
|
|
20
|
-
|
|
21
|
-
## Stage 1: Using a Third-Party JS Engine for Parsing
|
|
22
|
-
|
|
23
|
-
Because FunctionalScript is a subset of JavaScript, we can use third-party JavaScript engines to bootstrap our parser, written on FunctionalScript, without circular dependencies. In Rust, we only need to implement a generic byte code deserializer that reads byte code and invokes VM API functions. We selected [Deno](https://deno.com/) and its [deno_core](https://crates.io/crates/deno_core/) package as a third-party JS engine because it's also written in Rust, has a crate and it's easy to integrate with our project.
|
|
24
|
-
|
|
25
|
-
```mermaid
|
|
26
|
-
flowchart TB
|
|
27
|
-
app[Application] --> deno(deno_core)
|
|
28
|
-
app --> bcd[Byte Code Deserializer] --> js[VM] --> mem[Memory Manager]
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Requirements
|
|
32
|
-
1. To restore previous functionality, we still need a parser that can convert FunctionalScript or DJS into byte code,
|
|
33
|
-
2. We have to design byte code for FunctionalScript and implement its deserializer in Rust.
|
|
34
|
-
|
|
35
|
-
### Build Process
|
|
36
|
-
|
|
37
|
-
To satisfy the first requirement, we need a parser written in FunctionalScript. The build process should then take the parser source code and embed it into the application. See [include_str](https://doc.rust-lang.org/std/macro.include_str.html) for more details.
|
|
38
|
-
|
|
39
|
-
```mermaid
|
|
40
|
-
flowchart TB
|
|
41
|
-
app[Application] --> deno(deno_core)
|
|
42
|
-
app --> bcd[Byte Code Deserializer] --> js[VM] --> mem[Memory Manager]
|
|
43
|
-
app --> fsp[(Functional Script Parser Source Code)]
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### Run-Time Process
|
|
47
|
-
|
|
48
|
-
1. The application loads the parser source code from memory into the Deno engine.
|
|
49
|
-
2. The application executes the parser in the JS engine with the command-line parameters provided by the user.
|
|
50
|
-
3. After the parser generates the byte code, the application sends this byte code to the VM.
|
|
51
|
-
|
|
52
|
-
This stage provides an interim solution to parse FunctionalScript using Deno while we develop the self-hosted parser.
|
|
53
|
-
|
|
54
|
-
## Stage 2: Moving the Deno into `dev-dependencies`
|
|
55
|
-
|
|
56
|
-
Once our parser can parse itself and convert it into byte code, we can move the `deno_core` to development dependencies. This means that we need it only for build time. This transition eliminates the runtime dependency on Deno, streamlining deployment and reducing overhead in production environments.
|
|
57
|
-
|
|
58
|
-
### Build Process
|
|
59
|
-
|
|
60
|
-
1. Run the parser on itself using Deno and generate byte code for the parser.
|
|
61
|
-
2. Embed the generated byte code into our application ([include_bytes](https://doc.rust-lang.org/std/macro.include_bytes.html)).
|
|
62
|
-
|
|
63
|
-
### Run-Time Process
|
|
64
|
-
|
|
65
|
-
```mermaid
|
|
66
|
-
flowchart TB
|
|
67
|
-
app[Application] --> bcd[Byte Code Deserializer] --> js[VM] --> mem[Memory Manager]
|
|
68
|
-
app --> fspbc[(Functional Script Parser Byte Code)]
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
The application can do two things:
|
|
72
|
-
1. Convert FunctionalScript code into byte code using the parser source code and the VM.
|
|
73
|
-
2. Execute byte code using the VM.
|
|
74
|
-
|
|
75
|
-
## Byte code
|
|
76
|
-
|
|
77
|
-
The byte code format is designed for fast and straightforward deserialization and doesn't depend on a particular VM implementation. This design ensures that the byte code remains portable and does not rely on a specific VM implementation, allowing flexibility in integrating with other environments, including content-addressable implementation of FunctionalScript.
|
|
78
|
-
|
|
79
|
-
### Requirements
|
|
80
|
-
|
|
81
|
-
- **Simple deserialization**: `string` is UTF16, `number` and `bigint` in a binary format, `usize` is 32 bits.
|
|
82
|
-
- **No imports**: byte code describes a standalone module without dependencies. A parser should resolve all imports.
|
|
83
|
-
- **No syntax sugar**: a parser should convert all syntax sugar operations into basic commands.
|
|
84
|
-
- **One unit is one byte**: Byte code can be serialized into a byte array or a file.
|
|
85
|
-
- **Least significant byte first**: Our `bigint` implementation is LSB first, and most current CPU architectures are.
|
|
86
|
-
|
|
87
|
-
### Pseudo-Code for the byte code binary format
|
|
88
|
-
|
|
89
|
-
We use syntax that looks like Rust to describe the binary format.
|
|
90
|
-
|
|
91
|
-
```rust
|
|
92
|
-
struct Array<T> {
|
|
93
|
-
len: u32,
|
|
94
|
-
array: [T; self.len],
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
type String = Array<u16>;
|
|
98
|
-
|
|
99
|
-
// LSB first.
|
|
100
|
-
type BigUInt = Array<u64>;
|
|
101
|
-
|
|
102
|
-
type Object = Array<(String, Any)>;
|
|
103
|
-
|
|
104
|
-
type Tag = u8
|
|
105
|
-
|
|
106
|
-
// This is the main structure for serialization.
|
|
107
|
-
type Code = Array<u8>;
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### Tags/commands for JSON and DJS.
|
|
111
|
-
|
|
112
|
-
|format|any |Tag| |
|
|
113
|
-
|------|--------------|---|-----------------------|
|
|
114
|
-
|JSON |null | 00| |
|
|
115
|
-
| |number | 01|u64 |
|
|
116
|
-
| |false | 02| |
|
|
117
|
-
| |true | 03| |
|
|
118
|
-
| |string | 04|String |
|
|
119
|
-
| |object | 05|Object |
|
|
120
|
-
| |array | 06|Array<Any> |
|
|
121
|
-
|DJS |reference | 07|u32 |
|
|
122
|
-
| |bigint+ | 08|BigUInt |
|
|
123
|
-
| |bigint- | 09|BigUInt |
|
|
124
|
-
|
|
125
|
-
We will add new tags for FunctionalScript byte code in the future as they are not needed for Stage 1.
|
|
126
|
-
|
|
127
|
-
## Summary
|
|
128
|
-
|
|
129
|
-
If you find this architecture promising and want to support the development of a standalone FunctionalScript VM, please consider [sponsoring the project ❤️](https://opencollective.com/functionalscript). Additionally, we welcome contributions and feedback from the open-source community to accelerate this initiative.
|
package/doc/vm.md
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
# NaNVM
|
|
2
|
-
|
|
3
|
-
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
|
|
4
|
-
|
|
5
|
-
https://anniecherkaev.com/the-secret-life-of-nan
|
|
6
|
-
https://brionv.com/log/2018/05/17/javascript-engine-internals-nan-boxing/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- 1 bit - sign (S)
|
|
10
|
-
- 11 bit - exponent (E)
|
|
11
|
-
- 52 bit - fraction (F)
|
|
12
|
-
|
|
13
|
-
|SE |F |Value |
|
|
14
|
-
|---|--------------|----------------|
|
|
15
|
-
|000|00000_00000000|+000000_00000000|
|
|
16
|
-
|...| | |
|
|
17
|
-
|3FF|00000_00000000|+000000_00000001|
|
|
18
|
-
|...| | |
|
|
19
|
-
|434|00000_00000000|+200000_00000000|
|
|
20
|
-
|...| | |
|
|
21
|
-
|7FF|00000_00000000|+inf |
|
|
22
|
-
|...| |NaN |
|
|
23
|
-
|800|00000_00000000|-0.0 |
|
|
24
|
-
|...| | |
|
|
25
|
-
|BFF|00000_00000000|-000000_00000001|
|
|
26
|
-
|...| | |
|
|
27
|
-
|C34|00000_00000000|-200000_00000000|
|
|
28
|
-
|...| | |
|
|
29
|
-
|FFF|00000_00000000|-inf |
|
|
30
|
-
|...| |NaN |
|
|
31
|
-
|
|
32
|
-
integer range: `[-2^53; +2^53]`.
|
|
33
|
-
|
|
34
|
-
## 6-bit Id String
|
|
35
|
-
|
|
36
|
-
|symbol |code |# |sum|
|
|
37
|
-
|--------|--------------|--|---|
|
|
38
|
-
|`$` |`\x24` | 1| 1|
|
|
39
|
-
|`0`..`9`|`\x30`..`\x39`| A| B|
|
|
40
|
-
|`A`..`Z`|`\x41`..`\x5A`|1A| 25|
|
|
41
|
-
|`_` |`\x5F` | 1| 26|
|
|
42
|
-
|`a`..`z`|`\x61`..`\x7A`|1A| 40|
|
|
43
|
-
|
|
44
|
-
## 7FF & FFF
|
|
45
|
-
|
|
46
|
-
53 bits.
|
|
47
|
-
|
|
48
|
-
Other values:
|
|
49
|
-
|
|
50
|
-
- `NaN`
|
|
51
|
-
- `+Inf`: 0x7FF00000_00000000
|
|
52
|
-
- `-Inf`: 0xFFF00000_00000000
|
|
53
|
-
- pointer + null:
|
|
54
|
-
- 32 bit for 32 bit platforms.
|
|
55
|
-
- 48 bit for current AMD64 https://en.wikipedia.org/wiki/X86-64#Canonical_form_addresses and ARM64
|
|
56
|
-
note: with alignments it can be further narrowed to 44-45 bit.
|
|
57
|
-
- `true`
|
|
58
|
-
- `false`
|
|
59
|
-
- `undefined`
|
|
60
|
-
|
|
61
|
-
Optimization for
|
|
62
|
-
- string
|
|
63
|
-
- bigInt
|
|
64
|
-
|
|
65
|
-
Least used letters in English: Q, J, Z and X.
|
|
66
|
-
|
|
67
|
-
### Layout 52
|
|
68
|
-
|
|
69
|
-
Starts with `0xFFF`
|
|
70
|
-
|
|
71
|
-
| | | |type |
|
|
72
|
-
|------|--|-------------|-----------|
|
|
73
|
-
|`1111`|48|stringUInt48 |`string` |
|
|
74
|
-
|`1110`|48|8 x 6 string | |
|
|
75
|
-
|`1101`|48|7 x 7 stringA| |
|
|
76
|
-
|`1100`|48|7 x 7 stringB| |
|
|
77
|
-
|`1011`|48|6 x 8 string | |
|
|
78
|
-
|`1010`|45|5 x 9 string | |
|
|
79
|
-
|`1001`|48|4 x 12 string| |
|
|
80
|
-
|`1000`|48|3 x 16 string| |
|
|
81
|
-
|`0111`|32|2 x 16 string| |
|
|
82
|
-
|`0110`|16|1 x 16 string| |
|
|
83
|
-
|`0101`| 0|empty string | |
|
|
84
|
-
|`0100`|48|ptr |? |
|
|
85
|
-
|`0011`| 0|undefined |`undefined`|
|
|
86
|
-
|`0010`|48|bigInt48 |`bigint` |
|
|
87
|
-
|`0001`| 0|bool |`bool` |
|
|
88
|
-
|`0000`| 0|-inf |`number` |
|
|
89
|
-
|
|
90
|
-
## Pointer Kind
|
|
91
|
-
|
|
92
|
-
Alignment 8 bytes. 3 bits.
|
|
93
|
-
|
|
94
|
-
| |type | |
|
|
95
|
-
|----|----------|---------------|
|
|
96
|
-
|00.0|`object` |object |
|
|
97
|
-
|00.1| |array |
|
|
98
|
-
|01.0|`string` |string |
|
|
99
|
-
|01.1| | |
|
|
100
|
-
|10.0|`function`|function |
|
|
101
|
-
|10.1| |static function|
|
|
102
|
-
|11.0|`bigint` |bigint |
|
|
103
|
-
|11.1| | |
|
|
104
|
-
|
|
105
|
-
## Object
|
|
106
|
-
|
|
107
|
-
```rust
|
|
108
|
-
struct Object {
|
|
109
|
-
propertySet: PropertySet
|
|
110
|
-
iterable: Func<Iterator>
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
struct Array {
|
|
114
|
-
length: u32,
|
|
115
|
-
array: [Value; self.length],
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## String
|
|
120
|
-
|
|
121
|
-
```rust
|
|
122
|
-
struct String {
|
|
123
|
-
length: u32,
|
|
124
|
-
array: [u16; self.length],
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Function
|
|
129
|
-
|
|
130
|
-
```rust
|
|
131
|
-
struct Function {
|
|
132
|
-
pointer: FunctionBody,
|
|
133
|
-
array: [Value; length],
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## BigInt
|
|
138
|
-
|
|
139
|
-
```rust
|
|
140
|
-
struct BigInt {
|
|
141
|
-
length: u32,
|
|
142
|
-
array: [u64; self.length],
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## Order of object properties
|
|
147
|
-
|
|
148
|
-
See https://262.ecma-international.org/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys and https://262.ecma-international.org/6.0/#sec-object-type
|
|
149
|
-
|
|
150
|
-
An integer index for Node.js, Deno and Bun means a value from `0` to `4294967294` including. 4_294_967_294 = 0xFFFF_FFFE. But an integer index in the ES6 standard is +0..2^53-1.
|
package/fsc/README.md
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
# FunctionalScript Compiler
|
|
2
|
-
|
|
3
|
-
## Tokenizer
|
|
4
|
-
|
|
5
|
-
- `!` - logicalNot
|
|
6
|
-
- `!=` - nonStrictNotEqual
|
|
7
|
-
- `!==` - notEqual
|
|
8
|
-
- `"` - doubleStringBegin
|
|
9
|
-
- `$` - idBegin
|
|
10
|
-
- `%` - remainder
|
|
11
|
-
- `%=` - remainder assignment
|
|
12
|
-
- `&` - bitwiseAnd
|
|
13
|
-
- `&&` - logicalAnd
|
|
14
|
-
- `&&=` - logicalAndAssignment
|
|
15
|
-
- `&=` - bitwiseAndAssignment
|
|
16
|
-
- `'` - singleStringBegin
|
|
17
|
-
- `(` - groupingBegin
|
|
18
|
-
- `)` - groupingEnd
|
|
19
|
-
- `*` - multiplication
|
|
20
|
-
- `**` - exponential
|
|
21
|
-
- `**=` - exponentialAssignment
|
|
22
|
-
- `*/` - commentEnd
|
|
23
|
-
- `*=` - multiplicationAssignment
|
|
24
|
-
- `+` - addition
|
|
25
|
-
- `++` - increment
|
|
26
|
-
- `+=` - additionAssignment
|
|
27
|
-
- `,` - comma
|
|
28
|
-
- `-` - subtraction
|
|
29
|
-
- `--` - decrement
|
|
30
|
-
- `-=` - subtractionAssignment
|
|
31
|
-
- `.` - dot
|
|
32
|
-
- `...` - spread
|
|
33
|
-
- `/` - division
|
|
34
|
-
- `/*` - commentBegin
|
|
35
|
-
- `//` - oneLineComment
|
|
36
|
-
- `/=` - divisionAssignment
|
|
37
|
-
- `0..9` - numberBegin
|
|
38
|
-
- `:` - colon
|
|
39
|
-
- `;` - semicolon
|
|
40
|
-
- `<` - less
|
|
41
|
-
- `<<` - leftShift
|
|
42
|
-
- `<<=` - leftShiftAssignment
|
|
43
|
-
- `<=` - lessEqual
|
|
44
|
-
- `=` - assignment
|
|
45
|
-
- `==` - nonStrictEqual ?
|
|
46
|
-
- `===` - equal
|
|
47
|
-
- `=>` - arrow
|
|
48
|
-
- `>` - greater
|
|
49
|
-
- `<=` - greaterEqual
|
|
50
|
-
- `>>` - rightShift
|
|
51
|
-
- `>>>` - unsignedRightShift
|
|
52
|
-
- `>>>=` unsignedRightShiftAssignment
|
|
53
|
-
- `?` - question
|
|
54
|
-
- `?.` - optional chaining
|
|
55
|
-
- `??` - nullish coalescing
|
|
56
|
-
- `A..Z` - idBegin
|
|
57
|
-
- `Infinity` - infinity
|
|
58
|
-
- `NaN` - nan
|
|
59
|
-
- `[` - propertyBegin
|
|
60
|
-
- `]` - propertyEnd`
|
|
61
|
-
- `^` - bitwiseXor
|
|
62
|
-
- `^=` - bitwiseXorAssignment
|
|
63
|
-
- `_` - idBegin
|
|
64
|
-
- '`' - templateBegin
|
|
65
|
-
- `a..z` - idBegin
|
|
66
|
-
- `async` ?
|
|
67
|
-
- `await` ?
|
|
68
|
-
- `break`
|
|
69
|
-
- `case`
|
|
70
|
-
- `catch`
|
|
71
|
-
- `class`
|
|
72
|
-
- `const`
|
|
73
|
-
- `continue`
|
|
74
|
-
- `debugger`
|
|
75
|
-
- `delete` ?
|
|
76
|
-
- `do` ?
|
|
77
|
-
- `else`
|
|
78
|
-
- `export`
|
|
79
|
-
- `false`
|
|
80
|
-
- `function` ?
|
|
81
|
-
- `globalThis` ?
|
|
82
|
-
- `for`
|
|
83
|
-
- `if`
|
|
84
|
-
- `import`
|
|
85
|
-
- `in`
|
|
86
|
-
- `instanceof`
|
|
87
|
-
- `let`
|
|
88
|
-
- `new` ?
|
|
89
|
-
- `null`
|
|
90
|
-
- `of`
|
|
91
|
-
- `return`
|
|
92
|
-
- `super`
|
|
93
|
-
- `switch`
|
|
94
|
-
- `this` ?
|
|
95
|
-
- `throw`
|
|
96
|
-
- `true`
|
|
97
|
-
- `try`
|
|
98
|
-
- `typeof`
|
|
99
|
-
- `undefined`
|
|
100
|
-
- `var`
|
|
101
|
-
- `void`
|
|
102
|
-
- `while`
|
|
103
|
-
- `yield`
|
|
104
|
-
- `{` - objectBegin
|
|
105
|
-
- `|` - bitwiseOr
|
|
106
|
-
- `|=` - bitwiseOrAssignment
|
|
107
|
-
- `||` - logicalOr
|
|
108
|
-
- `||=` - logicalOrAssignment
|
|
109
|
-
- `}` - objectEnd
|
|
110
|
-
- `~` - bitwiseNot
|
|
111
|
-
- `~=` - bitwiseNotAssignment
|
package/fsc/module.f.ts
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import * as operator from '../types/function/operator/module.f.ts'
|
|
2
|
-
import {
|
|
3
|
-
merge as rangeMapMerge,
|
|
4
|
-
fromRange,
|
|
5
|
-
get,
|
|
6
|
-
type RangeMapArray,
|
|
7
|
-
type RangeMerge,
|
|
8
|
-
} from '../types/range_map/module.f.ts'
|
|
9
|
-
import * as list from '../types/list/module.f.ts'
|
|
10
|
-
const { reduce: listReduce } = list
|
|
11
|
-
import { range as asciiRange } from '../text/ascii/module.f.ts'
|
|
12
|
-
import { fn } from '../types/function/module.f.ts'
|
|
13
|
-
import { one, type Range } from '../types/range/module.f.ts'
|
|
14
|
-
const { toArray, map } = list
|
|
15
|
-
|
|
16
|
-
const fromCharCode = String.fromCharCode
|
|
17
|
-
|
|
18
|
-
type Result = readonly[readonly string[], ToResult]
|
|
19
|
-
|
|
20
|
-
type ToResult = (codePoint: number) => Result
|
|
21
|
-
|
|
22
|
-
type CreateToResult<T> = (state: T) => ToResult
|
|
23
|
-
|
|
24
|
-
type State<T> = RangeMapArray<CreateToResult<T>>
|
|
25
|
-
|
|
26
|
-
const unexpectedSymbol
|
|
27
|
-
: ToResult
|
|
28
|
-
= codePoint => [[`unexpected symbol ${codePoint}`], unexpectedSymbol]
|
|
29
|
-
|
|
30
|
-
const def
|
|
31
|
-
: <T>(state: T) => ToResult
|
|
32
|
-
= () => unexpectedSymbol
|
|
33
|
-
|
|
34
|
-
const union
|
|
35
|
-
: <T>(a: CreateToResult<T>) => (b: CreateToResult<T>) => CreateToResult<T>
|
|
36
|
-
= a => b => {
|
|
37
|
-
if (a === def || a === b) { return b }
|
|
38
|
-
if (b === def) { return a }
|
|
39
|
-
throw [a, b]
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const empty
|
|
43
|
-
: readonly never[]
|
|
44
|
-
= []
|
|
45
|
-
|
|
46
|
-
const reduce = <T>(a: list.List<State<T>>): State<T> => {
|
|
47
|
-
const merge
|
|
48
|
-
: RangeMerge<CreateToResult<T>>
|
|
49
|
-
= rangeMapMerge({
|
|
50
|
-
union,
|
|
51
|
-
equal: operator.strictEqual,
|
|
52
|
-
})
|
|
53
|
-
return toArray(listReduce(merge)(empty)(a))
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const codePointRange = fromRange(def)
|
|
57
|
-
|
|
58
|
-
const range = fn(asciiRange).then(codePointRange).result
|
|
59
|
-
|
|
60
|
-
const rangeSet
|
|
61
|
-
= (l: readonly string[]) => <T>(f: CreateToResult<T>): State<T> => {
|
|
62
|
-
|
|
63
|
-
const codePointRange
|
|
64
|
-
: (a: Range) => (f: CreateToResult<T>) => State<T>
|
|
65
|
-
= fromRange(def)
|
|
66
|
-
|
|
67
|
-
const g
|
|
68
|
-
: (r: string) => State<T>
|
|
69
|
-
= r => codePointRange(asciiRange(r))(f)
|
|
70
|
-
|
|
71
|
-
return reduce(map(g)(l))
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const create = <T>(a: list.List<State<T>>): CreateToResult<T> => {
|
|
75
|
-
const i = reduce(a)
|
|
76
|
-
const x
|
|
77
|
-
: (v: number) => (i: State<T>) => (v: T) => ToResult
|
|
78
|
-
= get(def)
|
|
79
|
-
return v => c => x(c)(i)(v)(c)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export const terminal = -1
|
|
83
|
-
|
|
84
|
-
const toInit
|
|
85
|
-
: () => ToResult
|
|
86
|
-
= () => () => [[], init]
|
|
87
|
-
|
|
88
|
-
export const init
|
|
89
|
-
: ToResult
|
|
90
|
-
= create([
|
|
91
|
-
codePointRange(one(terminal))(toInit),
|
|
92
|
-
rangeSet(['\t', ' ', '\n', '\r'])(toInit),
|
|
93
|
-
range('!')(() => () => [['!'], unexpectedSymbol]),
|
|
94
|
-
range('"')(() => () => [['"'], unexpectedSymbol]),
|
|
95
|
-
rangeSet(['$', '_', 'AZ', 'az'])(() => c => [[fromCharCode(c)], unexpectedSymbol]),
|
|
96
|
-
range('%')(() => () => [['%'], unexpectedSymbol]),
|
|
97
|
-
range('&')(() => () => [['&'], unexpectedSymbol]),
|
|
98
|
-
range("'")(() => () => [["'"], unexpectedSymbol]),
|
|
99
|
-
range('(')(() => () => [['('], unexpectedSymbol]),
|
|
100
|
-
range(')')(() => () => [[')'], unexpectedSymbol]),
|
|
101
|
-
range('*')(() => () => [['*'], unexpectedSymbol]),
|
|
102
|
-
range('+')(() => () => [['+'], unexpectedSymbol]),
|
|
103
|
-
range(',')(() => () => [[','], unexpectedSymbol]),
|
|
104
|
-
range('-')(() => () => [['-'], unexpectedSymbol]),
|
|
105
|
-
range('.')(() => () => [['.'], unexpectedSymbol]),
|
|
106
|
-
range('/')(() => () => [['/'], unexpectedSymbol]),
|
|
107
|
-
range('09')(() => a => [[fromCharCode(a)], unexpectedSymbol]),
|
|
108
|
-
range(':')(() => () => [[':'], unexpectedSymbol]),
|
|
109
|
-
range(';')(() => () => [[';'], unexpectedSymbol]),
|
|
110
|
-
range('<')(() => () => [['<'], unexpectedSymbol]),
|
|
111
|
-
range('=')(() => () => [['='], unexpectedSymbol]),
|
|
112
|
-
range('>')(() => () => [['>'], unexpectedSymbol]),
|
|
113
|
-
range('?')(() => () => [['?'], unexpectedSymbol]),
|
|
114
|
-
range('[')(() => () => [['['], unexpectedSymbol]),
|
|
115
|
-
range(']')(() => () => [[']'], unexpectedSymbol]),
|
|
116
|
-
range('^')(() => () => [['^'], unexpectedSymbol]),
|
|
117
|
-
range('`')(() => () => [['`'], unexpectedSymbol]),
|
|
118
|
-
range('{')(() => () => [['{'], unexpectedSymbol]),
|
|
119
|
-
range('|')(() => () => [['|'], unexpectedSymbol]),
|
|
120
|
-
range('}')(() => () => [['}'], unexpectedSymbol]),
|
|
121
|
-
range('~')(() => () => [['~'], unexpectedSymbol]),
|
|
122
|
-
])(undefined)
|
package/fsc/test.f.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import * as _ from './module.f.ts'
|
|
2
|
-
import * as ascii from '../text/ascii/module.f.ts'
|
|
3
|
-
const { one } = ascii
|
|
4
|
-
import * as j from '../json/module.f.ts'
|
|
5
|
-
const { stringify } = j
|
|
6
|
-
const s = stringify(i => i)
|
|
7
|
-
|
|
8
|
-
/** @type {} */
|
|
9
|
-
const f
|
|
10
|
-
: (v: string) => string
|
|
11
|
-
= v => {
|
|
12
|
-
const n = one(v)
|
|
13
|
-
return s(_.init(n)[0])
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export default {
|
|
17
|
-
a: () => {
|
|
18
|
-
const x = f('1')
|
|
19
|
-
if (x != '["1"]') { throw x }
|
|
20
|
-
}
|
|
21
|
-
}
|
package/fsm/README.md
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# FSM
|
|
2
|
-
|
|
3
|
-
This module is about a [finite-state machine](https://en.wikipedia.org/wiki/Finite-state_machine). It's not about
|
|
4
|
-
[Flying Spaghetti Monster](https://en.wikipedia.org/wiki/Flying_Spaghetti_Monster).
|
|
5
|
-
|
|
6
|
-
## FA Expression
|
|
7
|
-
|
|
8
|
-
- `symbol(s)`
|
|
9
|
-
- `next state`
|
|
10
|
-
|
|
11
|
-
## FA Rule
|
|
12
|
-
|
|
13
|
-
- `init state`
|
|
14
|
-
- `FA Epression`
|
|
15
|
-
|
|
16
|
-
## Example
|
|
17
|
-
|
|
18
|
-
FunctionalScript Identifier
|
|
19
|
-
|
|
20
|
-
### Grammar (EBNF)
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
id ::= `_$a..zA..Z` id2
|
|
24
|
-
id2 ::= `_$a..zA..Z0..9` id2
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### FA
|
|
28
|
-
|
|
29
|
-
```js
|
|
30
|
-
const lowercaseAlpha = byteSet.range('a')('z')
|
|
31
|
-
const uppercaseAlpha = byteSet.range('A')('Z')
|
|
32
|
-
const alpha = byteSet.union(lowercaseAlpha)(uppercaseAlpha)
|
|
33
|
-
const idSymbol = byteSet.union(byteSet.one('_'))(byteSet.one('$'))
|
|
34
|
-
const idBegin = byteSet.union(alpha)(idSymbol)
|
|
35
|
-
|
|
36
|
-
const digit = byteSet.range('0')('9')
|
|
37
|
-
const idNext = byteSet.union(idBegin)(digit)
|
|
38
|
-
|
|
39
|
-
const dot = byteSet('.')
|
|
40
|
-
|
|
41
|
-
const grammar = [
|
|
42
|
-
['', digit, 'int'],
|
|
43
|
-
['int', digit, 'int'],
|
|
44
|
-
//
|
|
45
|
-
['', digit, 'floatBegin'],
|
|
46
|
-
['floatBegin', digit, 'floatBegin'],
|
|
47
|
-
['floatBegin', dot, 'floatDot'],
|
|
48
|
-
['floatDot', digit, 'float'],
|
|
49
|
-
['float', digit, 'float'],
|
|
50
|
-
//
|
|
51
|
-
['', idBegin, 'id'],
|
|
52
|
-
['id', idNext, 'id'],
|
|
53
|
-
]
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
```js
|
|
57
|
-
const result = {
|
|
58
|
-
"['']": {
|
|
59
|
-
digit: "['floatBegin','int']",
|
|
60
|
-
idBegin: "['id']"
|
|
61
|
-
},
|
|
62
|
-
"['floatBegin','int']": {
|
|
63
|
-
digit: "['floatBegin','int']",
|
|
64
|
-
dot: "['floatDot']",
|
|
65
|
-
},
|
|
66
|
-
"['floatDot']": {
|
|
67
|
-
digit: "['float']"
|
|
68
|
-
},
|
|
69
|
-
"['float']": {
|
|
70
|
-
digit: "['float']"
|
|
71
|
-
},
|
|
72
|
-
"['id']": {
|
|
73
|
-
idNext: "['id']"
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
```js
|
|
79
|
-
const result = [
|
|
80
|
-
{ // 0
|
|
81
|
-
digit: 1,
|
|
82
|
-
idBegin: 4
|
|
83
|
-
},
|
|
84
|
-
{ // 1
|
|
85
|
-
digit: 1,
|
|
86
|
-
dot: 2,
|
|
87
|
-
},
|
|
88
|
-
{ // 2
|
|
89
|
-
digit: 3
|
|
90
|
-
},
|
|
91
|
-
{ // 3
|
|
92
|
-
digit: 3
|
|
93
|
-
},
|
|
94
|
-
{ // 4
|
|
95
|
-
idNext: 4
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## How to Add a Property # 1
|
|
101
|
-
|
|
102
|
-
```js
|
|
103
|
-
const a = { x: 5, y: 6 }
|
|
104
|
-
const b = { ...a, z: 7 }
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## How to Add a Property # 2
|
|
108
|
-
|
|
109
|
-
```js
|
|
110
|
-
import map from './types/map/module.f.mjs'
|
|
111
|
-
const a = map.fromEntries(Object.entries({ x: 5, y: 6 }))
|
|
112
|
-
const b = map.setReplace('z')(7)(a)
|
|
113
|
-
```
|