diff options
Diffstat (limited to '')
-rw-r--r-- | new-luxc/source/luxc/lang/translation/js/runtime.jvm.lux | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/new-luxc/source/luxc/lang/translation/js/runtime.jvm.lux b/new-luxc/source/luxc/lang/translation/js/runtime.jvm.lux index 0ff5e46b9..8c33b2a82 100644 --- a/new-luxc/source/luxc/lang/translation/js/runtime.jvm.lux +++ b/new-luxc/source/luxc/lang/translation/js/runtime.jvm.lux @@ -18,9 +18,17 @@ (%t "") "null")) +(def: (variant-js tag last? value) + (-> //.Expression //.Expression //.Expression //.Expression) + (format "{" + //.variant-tag-field ": " tag "," + //.variant-flag-field ": " last? "," + //.variant-value-field ": " value + "}")) + (def: #export (variant tag last? value) (-> Nat Bool //.Expression //.Expression) - (format "[" (%i (nat-to-int tag)) "," (flag last?) "," value "]")) + (variant-js (%i (nat-to-int tag)) (flag last?) value)) (def: none //.Expression @@ -132,20 +140,25 @@ (runtime: sum//get "sum_get" (let [no-match "return null;" - extact-match "return sum[2];" - test-recursion (format "if(sum[1] === '') {" + sum-tag (format "sum." //.variant-tag-field) + sum-flag (format "sum." //.variant-flag-field) + sum-value (format "sum." //.variant-value-field) + is-last? (format sum-flag " === ''") + extact-match (format "return " sum-value ";") + test-recursion (format "if(" is-last? ") {" ## Must recurse. - "return " @ "(sum[2], (wantedTag - sum[0]), wantsLast);" + "return " @ "(" sum-value ", (wantedTag - " sum-tag "), wantsLast);" "}" "else { " no-match " }")] (format "(function " @ "(sum,wantedTag,wantsLast) {" - "if(wantedTag === sum[0]) {" - (format "if(sum[1] === wantsLast) {" extact-match "}" + "if(wantedTag === " sum-tag ") {" + (format "if(" sum-flag " === wantsLast) {" extact-match "}" "else {" test-recursion "}") "}" - (format "else if(wantedTag > sum[0]) {" test-recursion "}") - (format "else if(wantedTag < sum[0] && wantsLast === '') {" - "return [(sum[0]-wantedTag),sum[1],sum[2]];" + (format "else if(wantedTag > " sum-tag ") {" test-recursion "}") + (format "else if(wantedTag < " sum-tag " && wantsLast === '') {" + (let [updated-sum (variant-js (format "(" sum-tag " - wantedTag)") sum-flag sum-value)] + (format "return " updated-sum ";")) "}") "else { " no-match " }" "})"))) @@ -235,7 +248,7 @@ "})"))) (bit-operation: bit//and "andI64" "&") -(bit-operation: bit//or "orI64" "|") +(bit-operation: bit//or "orI64" "|") (bit-operation: bit//xor "xorI64" "^") (runtime: bit//not "notI64" |