From 522e8df2537d9bfb00aa91cdd11f966eeb087db0 Mon Sep 17 00:00:00 2001 From: Jan Klaas Kollhof Date: Wed, 14 Jul 2021 08:24:55 +0200 Subject: [PATCH] feat(iter): remove iter blocks BREAKING CHANGE: `fold`, `unfold`, `map`, `filter`, `while`, `until` removed in favor of using funcs from std-lib --- package-lock.json | 48 +++--- src/ast/analyze.test.fnk | 4 +- src/lang/block/init.fnk | 24 +-- src/lang/init.fnk | 2 - src/lang/iterable/init.fnk | 12 -- src/lang/iterable/init.test.fnk | 154 ------------------- src/lang/iterable/init.test.fnk.snap | 198 ------------------------- src/lang/literals/record.test.fnk | 2 +- src/lang/literals/record.test.fnk.snap | 30 ++-- src/lexer/tokens.fnk | 8 +- src/testing/snapshot.fnk | 4 +- 11 files changed, 51 insertions(+), 435 deletions(-) delete mode 100644 src/lang/iterable/init.fnk delete mode 100644 src/lang/iterable/init.test.fnk delete mode 100644 src/lang/iterable/init.test.fnk.snap diff --git a/package-lock.json b/package-lock.json index c12a748..7a72587 100644 --- a/package-lock.json +++ b/package-lock.json @@ -783,22 +783,22 @@ } }, "node_modules/@fink/larix": { - "version": "18.5.0", - "resolved": "https://registry.npmjs.org/@fink/larix/-/larix-18.5.0.tgz", - "integrity": "sha512-GHkBM3K8xE7piB9re7yQL/G3jEmEYu8NonAwS/pHEDBBUcRvi0mc826ixV7Yx+XkVHRj+invSAKcwbLT/2GuVg==", + "version": "18.5.1", + "resolved": "https://registry.npmjs.org/@fink/larix/-/larix-18.5.1.tgz", + "integrity": "sha512-0SilK26DlNnjKBxBrLe+vhuHlPMI26A5y1Q7DFjRtjH9HkR2dkllFC4PhqiJfgbJoayX5avhJL3OrEsD4KiMUQ==", "dev": true, "dependencies": { - "@fink/prattler": "^7.0.0", - "@fink/std-lib": "^8.0.1" + "@fink/prattler": "^7.2.0", + "@fink/std-lib": "^8.2.0" }, "engines": { "node": ">=14.13.0" } }, "node_modules/@fink/loxia": { - "version": "21.6.0", - "resolved": "https://registry.npmjs.org/@fink/loxia/-/loxia-21.6.0.tgz", - "integrity": "sha512-+cmvJjett+xDkkPV8HlsHnhlfsWot2ZsBeBU/e3+LRYCSYty4K6s6E2qcFFRd7pZQ0BiFTC2tkPnSiussjlDtg==", + "version": "21.6.1", + "resolved": "https://registry.npmjs.org/@fink/loxia/-/loxia-21.6.1.tgz", + "integrity": "sha512-yvZrKpGe9fQaBKpSd6qxj8ji2Rqh81bODMIQJ8UygDUFWHN5uQ0k/UYXHyJQjOChBneA1u0qUmqVwxjo++aPoA==", "dev": true, "dependencies": { "@babel/core": "^7.10.5", @@ -806,7 +806,7 @@ "@babel/types": "^7.10.5", "@fink/js-interop": ">2.2", "@fink/snippet": "^2.2.0", - "@fink/std-lib": "^8.0.1" + "@fink/std-lib": "^8.3.0" }, "engines": { "node": ">=14.13.0" @@ -839,9 +839,9 @@ } }, "node_modules/@fink/std-lib": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@fink/std-lib/-/std-lib-8.3.0.tgz", - "integrity": "sha512-5Tk8czfhGaT6XE//ufzGc7EO4TUEwAaZAVeV2QFfIijYfMqVrN4EqhifzA5IcUZuGx7nQt4X4V/m3xnsHbZ2Mw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@fink/std-lib/-/std-lib-8.5.0.tgz", + "integrity": "sha512-ouxm15qv8NOfLAkaOBSp19Y6IUdWNw8oDooa9SYZob+ZFa5P3LAYBHwrKV6L8xgYtpJUJmVf6I/Rd0jMzyblqQ==", "dependencies": { "@fink/js-interop": "^2.2.0" }, @@ -13417,19 +13417,19 @@ "integrity": "sha512-gmH8xhmiaB7wM2w5GHSqKJPm4Pi6HvmGUJgZ46wh6n3mHlSTsbld5Dxfo3VLo+dYBlm1iCVDrhdys5Z0w8f2gw==" }, "@fink/larix": { - "version": "18.5.0", - "resolved": "https://registry.npmjs.org/@fink/larix/-/larix-18.5.0.tgz", - "integrity": "sha512-GHkBM3K8xE7piB9re7yQL/G3jEmEYu8NonAwS/pHEDBBUcRvi0mc826ixV7Yx+XkVHRj+invSAKcwbLT/2GuVg==", + "version": "18.5.1", + "resolved": "https://registry.npmjs.org/@fink/larix/-/larix-18.5.1.tgz", + "integrity": "sha512-0SilK26DlNnjKBxBrLe+vhuHlPMI26A5y1Q7DFjRtjH9HkR2dkllFC4PhqiJfgbJoayX5avhJL3OrEsD4KiMUQ==", "dev": true, "requires": { - "@fink/prattler": "^7.0.0", - "@fink/std-lib": "^8.0.1" + "@fink/prattler": "^7.2.0", + "@fink/std-lib": "^8.2.0" } }, "@fink/loxia": { - "version": "21.6.0", - "resolved": "https://registry.npmjs.org/@fink/loxia/-/loxia-21.6.0.tgz", - "integrity": "sha512-+cmvJjett+xDkkPV8HlsHnhlfsWot2ZsBeBU/e3+LRYCSYty4K6s6E2qcFFRd7pZQ0BiFTC2tkPnSiussjlDtg==", + "version": "21.6.1", + "resolved": "https://registry.npmjs.org/@fink/loxia/-/loxia-21.6.1.tgz", + "integrity": "sha512-yvZrKpGe9fQaBKpSd6qxj8ji2Rqh81bODMIQJ8UygDUFWHN5uQ0k/UYXHyJQjOChBneA1u0qUmqVwxjo++aPoA==", "dev": true, "requires": { "@babel/core": "^7.10.5", @@ -13437,7 +13437,7 @@ "@babel/types": "^7.10.5", "@fink/js-interop": ">2.2", "@fink/snippet": "^2.2.0", - "@fink/std-lib": "^8.0.1" + "@fink/std-lib": "^8.3.0" } }, "@fink/prattler": { @@ -13458,9 +13458,9 @@ } }, "@fink/std-lib": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@fink/std-lib/-/std-lib-8.3.0.tgz", - "integrity": "sha512-5Tk8czfhGaT6XE//ufzGc7EO4TUEwAaZAVeV2QFfIijYfMqVrN4EqhifzA5IcUZuGx7nQt4X4V/m3xnsHbZ2Mw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@fink/std-lib/-/std-lib-8.5.0.tgz", + "integrity": "sha512-ouxm15qv8NOfLAkaOBSp19Y6IUdWNw8oDooa9SYZob+ZFa5P3LAYBHwrKV6L8xgYtpJUJmVf6I/Rd0jMzyblqQ==", "requires": { "@fink/js-interop": "^2.2.0" } diff --git a/src/ast/analyze.test.fnk b/src/ast/analyze.test.fnk index 1377956..ff28469 100644 --- a/src/ast/analyze.test.fnk +++ b/src/ast/analyze.test.fnk @@ -1,6 +1,6 @@ {describe, it, expect, to_match_snapshot} = import '@fink/jest/test.fnk' -{map, fold, flatten} = import '@fink/std-lib/iter.fnk' +{map, fold: fold_, flatten} = import '@fink/std-lib/iter.fnk' {parse} = import '../parser.fnk' @@ -10,7 +10,7 @@ -collect_exprs = fold fn [expr], , , ctx: [expr, ctx] +collect_exprs = fold_ [], fn [expr], , , ctx: [expr, ctx] collect_bindings = fn parsed: diff --git a/src/lang/block/init.fnk b/src/lang/block/init.fnk index 26e157a..3754728 100644 --- a/src/lang/block/init.fnk +++ b/src/lang/block/init.fnk @@ -1,4 +1,4 @@ -{advance, curr_loc, curr_value, next_is} = import '@fink/prattler/parser.fnk' +{curr_loc, curr_value} = import '@fink/prattler/parser.fnk' {add_separator, add_operator} = import '@fink/prattler/expressions.fnk' @@ -24,27 +24,13 @@ named_block = fn token_type, expr_type, block_expr: ...prefix token_type nud: fn: fn ctx: - {start, end} = curr_loc ctx + {start} = curr_loc ctx op = curr_value ctx - match ctx: - next_is ?, 'fn': - [expr, next_ctx] = single_expression ctx - args = [expr] - callee = {type: 'ident', value: token_type, loc: {start, end}} - [{type: 'call', callee, args, loc: {...expr.loc, start}}, next_ctx] + [{exprs: args}, body_ctx] = terminated_block ctx, ':' - next_is ?, '=': - op = '=' - left = {type: 'ident', value: token_type, loc: {start, end}} - [right, next_ctx] = single_expression advance ctx - [{type: 'assign', op, left, right, loc: {start, end: right.loc.end}}, next_ctx] - - else: - [{exprs: args}, body_ctx] = terminated_block ctx, ':' - - [{exprs, comments, loc}, next_ctx] = indented_block body_ctx, block_expr - [{type: expr_type, op, args, exprs, comments, loc: {start, end: loc.end}}, next_ctx] + [{exprs, comments, loc}, next_ctx] = indented_block body_ctx, block_expr + [{type: expr_type, op, args, exprs, comments, loc: {start, end: loc.end}}, next_ctx] diff --git a/src/lang/init.fnk b/src/lang/init.fnk index 145043e..c63b0c1 100644 --- a/src/lang/init.fnk +++ b/src/lang/init.fnk @@ -11,7 +11,6 @@ {add_func} = import './func/init.fnk' {add_group} = import './group/init.fnk' {add_assignment_operators} = import './assignment/init.fnk' -{add_iterables} = import './iterable/init.fnk' {add_spread_operator} = import './spread/init.fnk' {add_async} = import './async/init.fnk' {add_import} = import './import/init.fnk' @@ -32,7 +31,6 @@ init_language = fn ctx: add_func add_conditionals - add_iterables add_assignment_operators diff --git a/src/lang/iterable/init.fnk b/src/lang/iterable/init.fnk deleted file mode 100644 index 77d3ac0..0000000 --- a/src/lang/iterable/init.fnk +++ /dev/null @@ -1,12 +0,0 @@ -{add_named_block} = import '../block/init.fnk' - -add_iterables = fn ctx: - pipe ctx: - add_named_block 'fold' - add_named_block 'unfold' - - add_named_block 'map' - - add_named_block 'filter' - add_named_block 'while' - add_named_block 'until' diff --git a/src/lang/iterable/init.test.fnk b/src/lang/iterable/init.test.fnk deleted file mode 100644 index ebcacbe..0000000 --- a/src/lang/iterable/init.test.fnk +++ /dev/null @@ -1,154 +0,0 @@ -{describe, it, expect, to_match_snapshot} = import '@fink/jest/test.fnk' - -{parse, parse_expr} = import '../../parser.fnk' - - -describe 'fold item, accu: ...', fn: - - it 'parses', fn: - expect - parse_expr ' - fold item, accu=0: - item + accu - # trailing comment - ' - to_match_snapshot - - -describe 'unfold accu: ...', fn: - - it 'parses', fn: - expect - parse_expr ' - unfold curr=start: - start + accu - ' - to_match_snapshot - - it 'parses with item, accu result', fn: - expect - parse_expr ' - unfold prev, acc=0: - [acc + prev * 2, prev + 1] - ' - to_match_snapshot - - it 'parses no args', fn: - expect - parse_expr ' - unfold: - foo - # trailing comment - ' - to_match_snapshot - - -describe 'map item: ...', fn: - - it 'parses', fn: - expect - parse_expr ' - map item: - item * 2 - # trailing comment - ' - to_match_snapshot - - -describe 'filter item: ...', fn: - - it 'parses', fn: - expect - parse_expr ' - filter item: - item % 2 == 0 - # trailing comment - ' - to_match_snapshot - - -describe 'while item: ...', fn: - - it 'parses', fn: - expect - parse_expr ' - while item: - item % 2 == 0 - # trailing comment - ' - to_match_snapshot - - -describe 'until item: ...', fn: - - it 'parses', fn: - expect - parse_expr ' - until item: - item % 2 == 0 - ' - to_match_snapshot - - - -describe 'fn-blocks', fn: - it 'parses imports', fn: - expect - parse ' - {fold, unfold, map, filter, while, until} = import "@fink/std-lib/iter.fnk" - ' - to_match_snapshot - - it 'parses map', fn: - expect - parse ' - map = fn: false - map fn item: - item * 2 - ' - to_match_snapshot - - it 'parses filter', fn: - expect - parse ' - filter = fn: false - filter fn item: - item > 2 - ' - to_match_snapshot - - it 'parses unfold', fn: - expect - parse ' - unfold = fn: false - unfold fn item: - item - ' - to_match_snapshot - - it 'parses fold', fn: - expect - parse ' - fold = fn: false - fold fn item: - item - ' - to_match_snapshot - - it 'parses while', fn: - expect - parse ' - while = fn: false - while fn item: - item - ' - to_match_snapshot - - it 'parses until', fn: - expect - parse ' - until = fn: false - until fn item: - item - ' - to_match_snapshot diff --git a/src/lang/iterable/init.test.fnk.snap b/src/lang/iterable/init.test.fnk.snap deleted file mode 100644 index c3ca81c..0000000 --- a/src/lang/iterable/init.test.fnk.snap +++ /dev/null @@ -1,198 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`filter item: ... parses 1`] = ` -block filter (1:0-4:0) - ident (1:7-1:11) item - : - comp == (2:2-2:15) - arithm % (2:2-2:10) - ident (2:2-2:6) item - number (2:9-2:10) 2 - number (2:14-2:15) 0 -`; - -exports[`fn-blocks parses filter 1`] = ` -module (1:0-4:0) - assign = (1:0-1:18) - ident (1:0-1:6) filter - block fn (1:9-1:18): - literal (1:13-1:18) false - call (2:0-4:0) - ident (2:0-2:6) filter - block fn (2:7-4:0) - ident (2:10-2:14) item - : - comp > (3:2-3:10) - ident (3:2-3:6) item - number (3:9-3:10) 2 -`; - -exports[`fn-blocks parses fold 1`] = ` -module (1:0-4:0) - assign = (1:0-1:16) - ident (1:0-1:4) fold - block fn (1:7-1:16): - literal (1:11-1:16) false - call (2:0-4:0) - ident (2:0-2:4) fold - block fn (2:5-4:0) - ident (2:8-2:12) item - : - ident (3:2-3:6) item -`; - -exports[`fn-blocks parses imports 1`] = ` -module (1:0-2:0) - assign = (1:0-1:75) - rec (1:0-1:41) - rec:kv (1:1-1:5) - ident (1:1-1:5) fold - rec:kv (1:7-1:13) - ident (1:7-1:13) unfold - rec:kv (1:15-1:18) - ident (1:15-1:18) map - rec:kv (1:20-1:26) - ident (1:20-1:26) filter - rec:kv (1:28-1:33) - ident (1:28-1:33) while - rec:kv (1:35-1:40) - ident (1:35-1:40) until - prefix import (1:44-1:75) - string " (1:51-1:75) - '@fink/std-lib/iter.fnk' -`; - -exports[`fn-blocks parses map 1`] = ` -module (1:0-4:0) - assign = (1:0-1:15) - ident (1:0-1:3) map - block fn (1:6-1:15): - literal (1:10-1:15) false - call (2:0-4:0) - ident (2:0-2:3) map - block fn (2:4-4:0) - ident (2:7-2:11) item - : - arithm * (3:2-3:10) - ident (3:2-3:6) item - number (3:9-3:10) 2 -`; - -exports[`fn-blocks parses unfold 1`] = ` -module (1:0-4:0) - assign = (1:0-1:18) - ident (1:0-1:6) unfold - block fn (1:9-1:18): - literal (1:13-1:18) false - call (2:0-4:0) - ident (2:0-2:6) unfold - block fn (2:7-4:0) - ident (2:10-2:14) item - : - ident (3:2-3:6) item -`; - -exports[`fn-blocks parses until 1`] = ` -module (1:0-4:0) - assign = (1:0-1:17) - ident (1:0-1:5) until - block fn (1:8-1:17): - literal (1:12-1:17) false - call (2:0-4:0) - ident (2:0-2:5) until - block fn (2:6-4:0) - ident (2:9-2:13) item - : - ident (3:2-3:6) item -`; - -exports[`fn-blocks parses while 1`] = ` -module (1:0-4:0) - assign = (1:0-1:17) - ident (1:0-1:5) while - block fn (1:8-1:17): - literal (1:12-1:17) false - call (2:0-4:0) - ident (2:0-2:5) while - block fn (2:6-4:0) - ident (2:9-2:13) item - : - ident (3:2-3:6) item -`; - -exports[`fold item, accu: ... parses 1`] = ` -block fold (1:0-4:0) - ident (1:5-1:9) item - assign = (1:11-1:17) - ident (1:11-1:15) accu - number (1:16-1:17) 0 - : - arithm + (2:2-2:13) - ident (2:2-2:6) item - ident (2:9-2:13) accu -`; - -exports[`map item: ... parses 1`] = ` -block map (1:0-4:0) - ident (1:4-1:8) item - : - arithm * (2:2-2:10) - ident (2:2-2:6) item - number (2:9-2:10) 2 -`; - -exports[`unfold accu: ... parses 1`] = ` -block unfold (1:0-3:0) - assign = (1:7-1:17) - ident (1:7-1:11) curr - ident (1:12-1:17) start - : - arithm + (2:2-2:14) - ident (2:2-2:7) start - ident (2:10-2:14) accu -`; - -exports[`unfold accu: ... parses no args 1`] = ` -block unfold (1:0-4:0): - ident (2:2-2:5) foo -`; - -exports[`unfold accu: ... parses with item, accu result 1`] = ` -block unfold (1:0-3:0) - ident (1:7-1:11) prev - assign = (1:13-1:18) - ident (1:13-1:16) acc - number (1:17-1:18) 0 - : - list (2:2-2:28) - arithm + (2:3-2:17) - ident (2:3-2:6) acc - arithm * (2:9-2:17) - ident (2:9-2:13) prev - number (2:16-2:17) 2 - arithm + (2:19-2:27) - ident (2:19-2:23) prev - number (2:26-2:27) 1 -`; - -exports[`until item: ... parses 1`] = ` -block until (1:0-3:0) - ident (1:6-1:10) item - : - comp == (2:2-2:15) - arithm % (2:2-2:10) - ident (2:2-2:6) item - number (2:9-2:10) 2 - number (2:14-2:15) 0 -`; - -exports[`while item: ... parses 1`] = ` -block while (1:0-4:0) - ident (1:6-1:10) item - : - comp == (2:2-2:15) - arithm % (2:2-2:10) - ident (2:2-2:6) item - number (2:9-2:10) 2 - number (2:14-2:15) 0 -`; diff --git a/src/lang/literals/record.test.fnk b/src/lang/literals/record.test.fnk index 81be000..8b6666c 100644 --- a/src/lang/literals/record.test.fnk +++ b/src/lang/literals/record.test.fnk @@ -70,7 +70,7 @@ describe 'record {...}', fn: it 'parses keywords as keys', fn: expect parse_expr ' - {fn, match, fold, unfold, map, find, filter, await, attempt, rec, list} + {fn, match, pipe, rec, list, await, throw, try} ' to_match_snapshot diff --git a/src/lang/literals/record.test.fnk.snap b/src/lang/literals/record.test.fnk.snap index 1e1a4b6..a13be4d 100644 --- a/src/lang/literals/record.test.fnk.snap +++ b/src/lang/literals/record.test.fnk.snap @@ -280,29 +280,23 @@ rec (1:0-1:2) `; exports[`record {...} parses keywords as keys 1`] = ` -rec (1:0-1:71) +rec (1:0-1:47) rec:kv (1:1-1:3) ident (1:1-1:3) fn rec:kv (1:5-1:10) ident (1:5-1:10) match rec:kv (1:12-1:16) - ident (1:12-1:16) fold - rec:kv (1:18-1:24) - ident (1:18-1:24) unfold - rec:kv (1:26-1:29) - ident (1:26-1:29) map - rec:kv (1:31-1:35) - ident (1:31-1:35) find - rec:kv (1:37-1:43) - ident (1:37-1:43) filter - rec:kv (1:45-1:50) - ident (1:45-1:50) await - rec:kv (1:52-1:59) - ident (1:52-1:59) attempt - rec:kv (1:61-1:64) - ident (1:61-1:64) rec - rec:kv (1:66-1:70) - ident (1:66-1:70) list + ident (1:12-1:16) pipe + rec:kv (1:18-1:21) + ident (1:18-1:21) rec + rec:kv (1:23-1:27) + ident (1:23-1:27) list + rec:kv (1:29-1:34) + ident (1:29-1:34) await + rec:kv (1:36-1:41) + ident (1:36-1:41) throw + rec:kv (1:43-1:46) + ident (1:43-1:46) try `; exports[`record {...} parses keywords as keys 2`] = ` diff --git a/src/lexer/tokens.fnk b/src/lexer/tokens.fnk index 16e796b..58938af 100644 --- a/src/lexer/tokens.fnk +++ b/src/lexer/tokens.fnk @@ -24,8 +24,11 @@ get_loc = fn start, text: fink_lex = rx' ^( (?( - fn|match|fold|unfold|else|map|filter|while|until - |await|import|try|throw|rec|list|pipe + fn|pipe|match|else| + rec|list| + import| + await| + try|throw )(?=\s|:)) |(?(in|or|and|not)(?=\s)) |(?(true|false)\b) @@ -262,7 +265,6 @@ tokenize = fn code, start={pos: 0, line: 1, column: 0}: # testing type in keywords or just use 'ident' for keywords keywords = list: 'import', 'fn', 'pipe', 'match', 'else' - 'fold', 'unfold', 'map', 'filter', 'while', 'until' 'list', 'rec', 'await', 'try', 'throw', 'and', 'or', 'not', 'in', 'true', 'false' diff --git a/src/testing/snapshot.fnk b/src/testing/snapshot.fnk index 4f7978e..b05ad29 100644 --- a/src/testing/snapshot.fnk +++ b/src/testing/snapshot.fnk @@ -1,4 +1,4 @@ -{map, fold} = import '@fink/std-lib/iter.fnk' +{map, fold: fold_} = import '@fink/std-lib/iter.fnk' {serialize} = import './serialize.fnk' @@ -11,7 +11,7 @@ print = fn ast: errors_text = pipe errors: map fn {error}: error - fold fn err, str='': + fold_ '', fn err, str: '${str}${err}\n' '