diff --git a/package.json b/package.json index 77a6a4f9f1..664f585e6e 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "connected-react-router": "^6.9.1", "flexboxgrid": "^6.3.1", "flexboxgrid-helpers": "^1.1.3", - "js-slang": "^0.5.5", + "js-slang": "^0.5.6", "konva": "^7.2.5", "lodash": "^4.17.21", "lz-string": "^1.4.4", diff --git a/src/commons/sagas/__tests__/WorkspaceSaga.ts b/src/commons/sagas/__tests__/WorkspaceSaga.ts index 08720a02f5..26efddfda4 100644 --- a/src/commons/sagas/__tests__/WorkspaceSaga.ts +++ b/src/commons/sagas/__tests__/WorkspaceSaga.ts @@ -858,7 +858,7 @@ describe('evalCode', () => { .call( reportInfiniteLoopError, 'source_protection_recursion', - 'function is_list(xs) {\n return is_null(xs) || is_pair(xs) && is_list(tail(xs));\n}\nfunction equal(xs, ys) {\n return is_pair(xs) ? is_pair(ys) && equal(head(xs), head(ys)) && equal(tail(xs), tail(ys)) : is_null(xs) ? is_null(ys) : is_number(xs) ? is_number(ys) && xs === ys : is_boolean(xs) ? is_boolean(ys) && (xs && ys || !xs && !ys) : is_string(xs) ? is_string(ys) && xs === ys : is_undefined(xs) ? is_undefined(ys) : is_function(ys) && xs === ys;\n}\nfunction length(xs) {\n return is_null(xs) ? 0 : 1 + length(tail(xs));\n}\nfunction map(f, xs) {\n return is_null(xs) ? null : pair(f(head(xs)), map(f, tail(xs)));\n}\nfunction build_list(fun, n) {\n function build(i, fun, already_built) {\n return i < 0 ? already_built : build(i - 1, fun, pair(fun(i), already_built));\n }\n return build(n - 1, fun, null);\n}\nfunction for_each(fun, xs) {\n if (is_null(xs)) {\n return true;\n } else {\n fun(head(xs));\n return for_each(fun, tail(xs));\n }\n}\nfunction list_to_string(xs) {\n return is_null(xs) ? "null" : is_pair(xs) ? "[" + list_to_string(head(xs)) + "," + list_to_string(tail(xs)) + "]" : stringify(xs);\n}\nfunction reverse(xs) {\n function rev(original, reversed) {\n return is_null(original) ? reversed : rev(tail(original), pair(head(original), reversed));\n }\n return rev(xs, null);\n}\nfunction append(xs, ys) {\n return is_null(xs) ? ys : pair(head(xs), append(tail(xs), ys));\n}\nfunction member(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? xs : member(v, tail(xs));\n}\nfunction remove(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? tail(xs) : pair(head(xs), remove(v, tail(xs)));\n}\nfunction remove_all(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? remove_all(v, tail(xs)) : pair(head(xs), remove_all(v, tail(xs)));\n}\nfunction filter(pred, xs) {\n return is_null(xs) ? xs : pred(head(xs)) ? pair(head(xs), filter(pred, tail(xs))) : filter(pred, tail(xs));\n}\nfunction enum_list(start, end) {\n return start > end ? null : pair(start, enum_list(start + 1, end));\n}\nfunction list_ref(xs, n) {\n return n === 0 ? head(xs) : list_ref(tail(xs), n - 1);\n}\nfunction accumulate(f, initial, xs) {\n return is_null(xs) ? initial : f(head(xs), accumulate(f, initial, tail(xs)));\n}\nfunction is_stream(xs) {\n return is_null(xs) || is_pair(xs) && is_stream(stream_tail(xs));\n}\nfunction list_to_stream(xs) {\n return is_null(xs) ? null : pair(head(xs), () => list_to_stream(tail(xs)));\n}\nfunction stream_to_list(xs) {\n return is_null(xs) ? null : pair(head(xs), stream_to_list(stream_tail(xs)));\n}\nfunction stream_length(xs) {\n return is_null(xs) ? 0 : 1 + stream_length(stream_tail(xs));\n}\nfunction stream_map(f, s) {\n return is_null(s) ? null : pair(f(head(s)), () => stream_map(f, stream_tail(s)));\n}\nfunction build_stream(fun, n) {\n function build(i) {\n return i >= n ? null : pair(fun(i), () => build(i + 1));\n }\n return build(0);\n}\nfunction stream_for_each(fun, xs) {\n if (is_null(xs)) {\n return true;\n } else {\n fun(head(xs));\n return stream_for_each(fun, stream_tail(xs));\n }\n}\nfunction stream_reverse(xs) {\n function rev(original, reversed) {\n return is_null(original) ? reversed : rev(stream_tail(original), pair(head(original), () => reversed));\n }\n return rev(xs, null);\n}\nfunction stream_append(xs, ys) {\n return is_null(xs) ? ys : pair(head(xs), () => stream_append(stream_tail(xs), ys));\n}\nfunction stream_member(x, s) {\n return is_null(s) ? null : head(s) === x ? s : stream_member(x, stream_tail(s));\n}\nfunction stream_remove(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? stream_tail(xs) : pair(head(xs), () => stream_remove(v, stream_tail(xs)));\n}\nfunction stream_remove_all(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? stream_remove_all(v, stream_tail(xs)) : pair(head(xs), () => stream_remove_all(v, stream_tail(xs)));\n}\nfunction stream_filter(p, s) {\n return is_null(s) ? null : p(head(s)) ? pair(head(s), () => stream_filter(p, stream_tail(s))) : stream_filter(p, stream_tail(s));\n}\nfunction enum_stream(start, end) {\n return start > end ? null : pair(start, () => enum_stream(start + 1, end));\n}\nfunction integers_from(n) {\n return pair(n, () => integers_from(n + 1));\n}\nfunction eval_stream(s, n) {\n function es(s, n) {\n return n === 1 ? list(head(s)) : pair(head(s), es(stream_tail(s), n - 1));\n }\n return n === 0 ? null : es(s, n);\n}\nfunction stream_ref(s, n) {\n return n === 0 ? head(s) : stream_ref(stream_tail(s), n - 1);\n}\nconst test=[x => x,2,3,[x => x],5];\nfunction f(x) {\n return f(x);\n}' + 'function is_list(xs) {\n return is_null(xs) || is_pair(xs) && is_list(tail(xs));\n}\nfunction equal(xs, ys) {\n return is_pair(xs) ? is_pair(ys) && equal(head(xs), head(ys)) && equal(tail(xs), tail(ys)) : is_null(xs) ? is_null(ys) : is_number(xs) ? is_number(ys) && xs === ys : is_boolean(xs) ? is_boolean(ys) && (xs && ys || !xs && !ys) : is_string(xs) ? is_string(ys) && xs === ys : is_undefined(xs) ? is_undefined(ys) : is_function(ys) && xs === ys;\n}\nfunction length_iter(xs, acc) {\n return is_null(xs) ? acc : length_iter(tail(xs), acc + 1);\n}\nfunction length(xs) {\n return length_iter(xs, 0);\n}\nfunction map_iter(f, xs, acc) {\n return is_null(xs) ? reverse(acc) : map_iter(f, tail(xs), pair(f(head(xs)), acc));\n}\nfunction map(f, xs) {\n return map_iter(f, xs, null);\n}\nfunction build_list(fun, n) {\n function build(i, fun, already_built) {\n return i < 0 ? already_built : build(i - 1, fun, pair(fun(i), already_built));\n }\n return build(n - 1, fun, null);\n}\nfunction for_each(fun, xs) {\n if (is_null(xs)) {\n return true;\n } else {\n fun(head(xs));\n return for_each(fun, tail(xs));\n }\n}\nfunction list_to_string(xs) {\n return is_null(xs) ? "null" : is_pair(xs) ? "[" + list_to_string(head(xs)) + "," + list_to_string(tail(xs)) + "]" : stringify(xs);\n}\nfunction reverse(xs) {\n function rev(original, reversed) {\n return is_null(original) ? reversed : rev(tail(original), pair(head(original), reversed));\n }\n return rev(xs, null);\n}\nfunction append_cps(xs, ys, cont) {\n return is_null(xs) ? cont(ys) : append_cps(tail(xs), ys, zs => cont(pair(head(xs), zs)));\n}\nfunction append(xs, ys) {\n return append_cps(xs, ys, xs => xs);\n}\nfunction member(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? xs : member(v, tail(xs));\n}\nfunction remove(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? tail(xs) : pair(head(xs), remove(v, tail(xs)));\n}\nfunction remove_all(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? remove_all(v, tail(xs)) : pair(head(xs), remove_all(v, tail(xs)));\n}\nfunction filter_iter(pred, xs, acc) {\n return is_null(xs) ? reverse(acc) : pred(head(xs)) ? filter_iter(pred, tail(xs), pair(head(xs), acc)) : filter_iter(pred, tail(xs), acc);\n}\nfunction filter(pred, xs) {\n return filter_iter(pred, xs, null);\n}\nfunction enum_list_iter(start, end, acc) {\n return start > end ? reverse(acc) : enum_list_iter(start + 1, end, pair(start, acc));\n}\nfunction enum_list(start, end) {\n return enum_list_iter(start, end, null);\n}\nfunction list_ref(xs, n) {\n return n === 0 ? head(xs) : list_ref(tail(xs), n - 1);\n}\nfunction accumulate(f, initial, xs) {\n return is_null(xs) ? initial : f(head(xs), accumulate(f, initial, tail(xs)));\n}\nfunction is_stream(xs) {\n return is_null(xs) || is_pair(xs) && is_stream(stream_tail(xs));\n}\nfunction list_to_stream(xs) {\n return is_null(xs) ? null : pair(head(xs), () => list_to_stream(tail(xs)));\n}\nfunction stream_to_list(xs) {\n return is_null(xs) ? null : pair(head(xs), stream_to_list(stream_tail(xs)));\n}\nfunction stream_length(xs) {\n return is_null(xs) ? 0 : 1 + stream_length(stream_tail(xs));\n}\nfunction stream_map(f, s) {\n return is_null(s) ? null : pair(f(head(s)), () => stream_map(f, stream_tail(s)));\n}\nfunction build_stream(fun, n) {\n function build(i) {\n return i >= n ? null : pair(fun(i), () => build(i + 1));\n }\n return build(0);\n}\nfunction stream_for_each(fun, xs) {\n if (is_null(xs)) {\n return true;\n } else {\n fun(head(xs));\n return stream_for_each(fun, stream_tail(xs));\n }\n}\nfunction stream_reverse(xs) {\n function rev(original, reversed) {\n return is_null(original) ? reversed : rev(stream_tail(original), pair(head(original), () => reversed));\n }\n return rev(xs, null);\n}\nfunction stream_append(xs, ys) {\n return is_null(xs) ? ys : pair(head(xs), () => stream_append(stream_tail(xs), ys));\n}\nfunction stream_member(x, s) {\n return is_null(s) ? null : head(s) === x ? s : stream_member(x, stream_tail(s));\n}\nfunction stream_remove(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? stream_tail(xs) : pair(head(xs), () => stream_remove(v, stream_tail(xs)));\n}\nfunction stream_remove_all(v, xs) {\n return is_null(xs) ? null : v === head(xs) ? stream_remove_all(v, stream_tail(xs)) : pair(head(xs), () => stream_remove_all(v, stream_tail(xs)));\n}\nfunction stream_filter(p, s) {\n return is_null(s) ? null : p(head(s)) ? pair(head(s), () => stream_filter(p, stream_tail(s))) : stream_filter(p, stream_tail(s));\n}\nfunction enum_stream(start, end) {\n return start > end ? null : pair(start, () => enum_stream(start + 1, end));\n}\nfunction integers_from(n) {\n return pair(n, () => integers_from(n + 1));\n}\nfunction eval_stream(s, n) {\n function es(s, n) {\n return n === 1 ? list(head(s)) : pair(head(s), es(stream_tail(s), n - 1));\n }\n return n === 0 ? null : es(s, n);\n}\nfunction stream_ref(s, n) {\n return n === 0 ? head(s) : stream_ref(stream_tail(s), n - 1);\n}\nconst test=[x => x,2,3,[x => x],5];\nfunction f(x) {\n return f(x);\n}' ) .silentRun(); }); diff --git a/src/features/envVisualizer/__tests__/__snapshots__/EnvVisualizer.tsx.snap b/src/features/envVisualizer/__tests__/__snapshots__/EnvVisualizer.tsx.snap index 10f1f48f1e..e63b2583ed 100644 --- a/src/features/envVisualizer/__tests__/__snapshots__/EnvVisualizer.tsx.snap +++ b/src/features/envVisualizer/__tests__/__snapshots__/EnvVisualizer.tsx.snap @@ -83,22 +83,27 @@ Array [ "head": Object { "accumulate": [Function], "append": [Function], + "append_cps": [Function], "build_list": [Function], "build_stream": [Function], "enum_list": [Function], + "enum_list_iter": [Function], "enum_stream": [Function], "equal": [Function], "eval_stream": [Function], "filter": [Function], + "filter_iter": [Function], "for_each": [Function], "integers_from": [Function], "is_list": [Function], "is_stream": [Function], "length": [Function], + "length_iter": [Function], "list_ref": [Function], "list_to_stream": [Function], "list_to_string": [Function], "map": [Function], + "map_iter": [Function], "member": [Function], "remove": [Function], "remove_all": [Function], @@ -288,22 +293,27 @@ Array [ "head": Object { "accumulate": [Function], "append": [Function], + "append_cps": [Function], "build_list": [Function], "build_stream": [Function], "enum_list": [Function], + "enum_list_iter": [Function], "enum_stream": [Function], "equal": [Function], "eval_stream": [Function], "filter": [Function], + "filter_iter": [Function], "for_each": [Function], "integers_from": [Function], "is_list": [Function], "is_stream": [Function], "length": [Function], + "length_iter": [Function], "list_ref": [Function], "list_to_stream": [Function], "list_to_string": [Function], "map": [Function], + "map_iter": [Function], "member": [Function], "remove": [Function], "remove_all": [Function], @@ -455,22 +465,27 @@ Array [ "head": Object { "accumulate": [Function], "append": [Function], + "append_cps": [Function], "build_list": [Function], "build_stream": [Function], "enum_list": [Function], + "enum_list_iter": [Function], "enum_stream": [Function], "equal": [Function], "eval_stream": [Function], "filter": [Function], + "filter_iter": [Function], "for_each": [Function], "integers_from": [Function], "is_list": [Function], "is_stream": [Function], "length": [Function], + "length_iter": [Function], "list_ref": [Function], "list_to_stream": [Function], "list_to_string": [Function], "map": [Function], + "map_iter": [Function], "member": [Function], "remove": [Function], "remove_all": [Function], @@ -620,22 +635,27 @@ Array [ "head": Object { "accumulate": [Function], "append": [Function], + "append_cps": [Function], "build_list": [Function], "build_stream": [Function], "enum_list": [Function], + "enum_list_iter": [Function], "enum_stream": [Function], "equal": [Function], "eval_stream": [Function], "filter": [Function], + "filter_iter": [Function], "for_each": [Function], "integers_from": [Function], "is_list": [Function], "is_stream": [Function], "length": [Function], + "length_iter": [Function], "list_ref": [Function], "list_to_stream": [Function], "list_to_string": [Function], "map": [Function], + "map_iter": [Function], "member": [Function], "remove": [Function], "remove_all": [Function], @@ -765,22 +785,27 @@ Array [ "head": Object { "accumulate": [Function], "append": [Function], + "append_cps": [Function], "build_list": [Function], "build_stream": [Function], "enum_list": [Function], + "enum_list_iter": [Function], "enum_stream": [Function], "equal": [Function], "eval_stream": [Function], "filter": [Function], + "filter_iter": [Function], "for_each": [Function], "integers_from": [Function], "is_list": [Function], "is_stream": [Function], "length": [Function], + "length_iter": [Function], "list_ref": [Function], "list_to_stream": [Function], "list_to_string": [Function], "map": [Function], + "map_iter": [Function], "member": [Function], "remove": [Function], "remove_all": [Function], @@ -897,22 +922,27 @@ Array [ "head": Object { "accumulate": [Function], "append": [Function], + "append_cps": [Function], "build_list": [Function], "build_stream": [Function], "enum_list": [Function], + "enum_list_iter": [Function], "enum_stream": [Function], "equal": [Function], "eval_stream": [Function], "filter": [Function], + "filter_iter": [Function], "for_each": [Function], "integers_from": [Function], "is_list": [Function], "is_stream": [Function], "length": [Function], + "length_iter": [Function], "list_ref": [Function], "list_to_stream": [Function], "list_to_string": [Function], "map": [Function], + "map_iter": [Function], "member": [Function], "remove": [Function], "remove_all": [Function], @@ -980,22 +1010,27 @@ Array [ "head": Object { "accumulate": [Function], "append": [Function], + "append_cps": [Function], "build_list": [Function], "build_stream": [Function], "enum_list": [Function], + "enum_list_iter": [Function], "enum_stream": [Function], "equal": [Function], "eval_stream": [Function], "filter": [Function], + "filter_iter": [Function], "for_each": [Function], "integers_from": [Function], "is_list": [Function], "is_stream": [Function], "length": [Function], + "length_iter": [Function], "list_ref": [Function], "list_to_stream": [Function], "list_to_string": [Function], "map": [Function], + "map_iter": [Function], "member": [Function], "remove": [Function], "remove_all": [Function], @@ -1058,22 +1093,27 @@ Array [ "head": Object { "accumulate": [Function], "append": [Function], + "append_cps": [Function], "build_list": [Function], "build_stream": [Function], "enum_list": [Function], + "enum_list_iter": [Function], "enum_stream": [Function], "equal": [Function], "eval_stream": [Function], "filter": [Function], + "filter_iter": [Function], "for_each": [Function], "integers_from": [Function], "is_list": [Function], "is_stream": [Function], "length": [Function], + "length_iter": [Function], "list_ref": [Function], "list_to_stream": [Function], "list_to_string": [Function], "map": [Function], + "map_iter": [Function], "member": [Function], "remove": [Function], "remove_all": [Function], diff --git a/yarn.lock b/yarn.lock index e4622aa2de..a8b8fc7332 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8181,10 +8181,10 @@ jest@26.6.0: import-local "^3.0.2" jest-cli "^26.6.0" -js-slang@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/js-slang/-/js-slang-0.5.5.tgz#edb70e68249c3143c1ad2d87f80423f223fd0d3f" - integrity sha512-FzGh2Q5xZN/MHi+F4Y9iN40eGs8g0FEYLxDP8rtpp0NPr40H6PeUxDNPXPiY7RnnZEqW1IBiEdKL+hcYU4IOHA== +js-slang@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/js-slang/-/js-slang-0.5.6.tgz#d3d7dec8a024c6fb2fdc57e9ce51782966a2ef24" + integrity sha512-hZ2tYctVnwdw6712kEhi+nvjw0fOXFv3iV8Sd9LFcXrE7TjGdszVtL0bxCnbALYnWjMwYnarI2aKjeWG7vNWsg== dependencies: "@types/estree" "0.0.47" acorn "^8.0.3"