koatl 0.3.7__tar.gz → 0.3.9__tar.gz
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.
- {koatl-0.3.7 → koatl-0.3.9}/Cargo.lock +1 -1
- {koatl-0.3.7 → koatl-0.3.9}/PKG-INFO +1 -1
- {koatl-0.3.7 → koatl-0.3.9}/koatl/Cargo.toml +1 -1
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/notebook/magic.py +1 -2
- koatl-0.3.9/koatl/python/koatl/prelude/__init__.tl +38 -0
- {koatl-0.3.7 → koatl-0.3.9/koatl}/python/koatl/std/data/list.tl +1 -1
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/iter.tl +3 -3
- koatl-0.3.9/koatl/python/koatl/std/re.tl +41 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/coal.tl +6 -3
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/ast.rs +2 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/inference.rs +3 -1
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/lift_cst.rs +12 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/resolve_scopes.rs +14 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/transform.rs +30 -1
- {koatl-0.3.7 → koatl-0.3.9}/koatl-parser/src/cst.rs +7 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-parser/src/parser.rs +25 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-parser/src/simple_fmt.rs +14 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/notebook/magic.py +1 -2
- koatl-0.3.9/python/koatl/prelude/__init__.tl +38 -0
- {koatl-0.3.7/koatl → koatl-0.3.9}/python/koatl/std/data/list.tl +1 -1
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/iter.tl +3 -3
- koatl-0.3.9/python/koatl/std/re.tl +41 -0
- koatl-0.3.7/koatl/python/koatl/prelude/__init__.tl +0 -42
- koatl-0.3.7/koatl/python/koatl/std/re.tl +0 -48
- koatl-0.3.7/python/koatl/prelude/__init__.tl +0 -42
- koatl-0.3.7/python/koatl/std/re.tl +0 -48
- {koatl-0.3.7 → koatl-0.3.9}/Cargo.toml +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/README.md +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/.github/workflows/CI.yml +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/.gitignore +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/LICENSE +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/README.md +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/__init__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/__main__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/cli.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/notebook/__init__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/runtime/__init__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/runtime/meta_finder.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/runtime/record.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/runtime/vattr.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/__init__.tl +0 -0
- {koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/__init__.tl +0 -0
- {koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/async.tl +0 -0
- {koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/base.tl +0 -0
- {koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/do.tl +0 -0
- {koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/env.tl +0 -0
- {koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/memo.tl +0 -0
- {koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/result.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/data/__init__.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/data/record.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/ext.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/io.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/json.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/lazy_module.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/pickle.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/python/koatl/std/trait.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/requirements.txt +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/src/emit_py.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/src/lib.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/containers.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/data.txt +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/decorators.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/destructure-for-and-fn.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/destructure.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/escape_ident.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/fstr.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/functions.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/generator.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/if_expr.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/loops.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/match.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/nary-list.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/placeholder.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/precedence.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/scopes.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/semantic_whitespace.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/short_circuit.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/base/with.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/async.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/aug_assign.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/env.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/imports.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/iterables.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/list.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/memo.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/record.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/result.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/slice.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/try.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/prelude/virtual.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/util/__init__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/util/module0.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/util/module1.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/e2e/util/module2.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/parse/arith.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/parse/assign.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/parse/block-comments.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/parse/deco.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/parse/func.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/parse/matches.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/parse/numbers.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/test_e2e.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl/tests/test_parse.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/Cargo.toml +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/ast_builder.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/lib.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/main.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/py/ast.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/py/ast_builder.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/py/emit.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/py/mod.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/types.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-core/src/util.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-parser/Cargo.toml +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-parser/src/lexer.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/koatl-parser/src/lib.rs +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/pyproject.toml +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/__init__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/__main__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/cli.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/notebook/__init__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/runtime/__init__.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/runtime/meta_finder.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/runtime/record.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/runtime/vattr.py +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/__init__.tl +0 -0
- {koatl-0.3.7/python/koatl/std/alg → koatl-0.3.9/python/koatl/std/control}/__init__.tl +0 -0
- {koatl-0.3.7/python/koatl/std/alg → koatl-0.3.9/python/koatl/std/control}/async.tl +0 -0
- {koatl-0.3.7/python/koatl/std/alg → koatl-0.3.9/python/koatl/std/control}/base.tl +0 -0
- {koatl-0.3.7/python/koatl/std/alg → koatl-0.3.9/python/koatl/std/control}/do.tl +0 -0
- {koatl-0.3.7/python/koatl/std/alg → koatl-0.3.9/python/koatl/std/control}/env.tl +0 -0
- {koatl-0.3.7/python/koatl/std/alg → koatl-0.3.9/python/koatl/std/control}/memo.tl +0 -0
- {koatl-0.3.7/python/koatl/std/alg → koatl-0.3.9/python/koatl/std/control}/result.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/data/__init__.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/data/record.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/ext.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/io.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/json.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/lazy_module.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/pickle.tl +0 -0
- {koatl-0.3.7 → koatl-0.3.9}/python/koatl/std/trait.py +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export import koatl.std.(
|
|
2
|
+
trait.*
|
|
3
|
+
ext.*
|
|
4
|
+
data.*
|
|
5
|
+
iter.*
|
|
6
|
+
control.(Result, Ok, Err, Env, Memo, Async, AsyncMemo, do)
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
import koatl.std.(
|
|
10
|
+
re.Pattern
|
|
11
|
+
lazy_module.(LazyModule, RootModulesProxy)
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
export std = LazyModule("koatl.std")
|
|
15
|
+
export mod = RootModulesProxy()
|
|
16
|
+
|
|
17
|
+
Extension.trait(Iterable)
|
|
18
|
+
|
|
19
|
+
Extension.property(list, "len")! List.len.fget
|
|
20
|
+
|
|
21
|
+
Extension.property(object, "result")! self => Result(self)
|
|
22
|
+
|
|
23
|
+
Extension.method(str, "match")! (regex, str) => Pattern(regex).match(str)
|
|
24
|
+
Extension.method(str, "matches")! (str, regex) => Pattern(regex).match(str)
|
|
25
|
+
|
|
26
|
+
__tl__.do = koatl.std.control.do.do
|
|
27
|
+
|
|
28
|
+
__tl__.op_map = koatl.std.control.result.op_map
|
|
29
|
+
__tl__.op_coal = koatl.std.control.result.op_coal
|
|
30
|
+
|
|
31
|
+
__tl__.Ok = koatl.std.control.result.Ok
|
|
32
|
+
__tl__.Err = koatl.std.control.result.Err
|
|
33
|
+
__tl__.Result = koatl.std.control.result.Result
|
|
34
|
+
|
|
35
|
+
__tl__.MatchError = koatl.std.MatchError
|
|
36
|
+
|
|
37
|
+
__tl__.memo_value = koatl.std.control.memo.Memo.value
|
|
38
|
+
__tl__.async_memo_value = koatl.std.control.memo.AsyncMemo.value
|
|
@@ -3,14 +3,14 @@ import builtins
|
|
|
3
3
|
|
|
4
4
|
import koatl.std.data.Record
|
|
5
5
|
import koatl.std.trait.Trait
|
|
6
|
-
import .
|
|
6
|
+
import .control.(Traversable, Ok, Err, Memo, Async, AsyncMemo, Result)
|
|
7
7
|
|
|
8
8
|
export Iterable = class(Traversable, Trait):
|
|
9
9
|
iter = Trait.abstract! self => None
|
|
10
10
|
|
|
11
11
|
skip = (self, n) =>
|
|
12
12
|
let it = self.iter
|
|
13
|
-
for _ in
|
|
13
|
+
for _ in..n:
|
|
14
14
|
next(it, None)
|
|
15
15
|
it
|
|
16
16
|
|
|
@@ -27,7 +27,7 @@ export Iterable = class(Traversable, Trait):
|
|
|
27
27
|
take = (self, n) =>
|
|
28
28
|
let impl = () =>
|
|
29
29
|
let it = self.iter
|
|
30
|
-
for _ in
|
|
30
|
+
for _ in..n:
|
|
31
31
|
try:
|
|
32
32
|
yield next(it)
|
|
33
33
|
except StopIteration(value=value) =>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import collections
|
|
3
|
+
import .control.Result
|
|
4
|
+
|
|
5
|
+
export Pattern = class:
|
|
6
|
+
__slots__ = ("pattern",)
|
|
7
|
+
|
|
8
|
+
__init__ = (self, pattern) =>
|
|
9
|
+
pattern match:
|
|
10
|
+
re.Pattern() => self.pattern = pattern
|
|
11
|
+
str() => self.pattern = re.compile(pattern)
|
|
12
|
+
Pattern(pattern=pattern) => self.pattern = pattern
|
|
13
|
+
default => raise TypeError(
|
|
14
|
+
f"Expected a str or pattern, but got {type(pattern).__name__}"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__repr__ = self => f"Pattern({self.pattern})"
|
|
18
|
+
|
|
19
|
+
match = (self, string, flags=0) =>
|
|
20
|
+
if not isinstance(string, str):
|
|
21
|
+
raise TypeError(f"Expected a string, but got {type(string).__name__}")
|
|
22
|
+
|
|
23
|
+
self.pattern.match(string, flags).result.map(Match)
|
|
24
|
+
|
|
25
|
+
export Match = collections.abc.Sequence.register! class:
|
|
26
|
+
__slots__ = ("_match",)
|
|
27
|
+
__match_args__ = ("match",)
|
|
28
|
+
|
|
29
|
+
__init__ = (self, match) =>
|
|
30
|
+
if not isinstance(match, re.Match):
|
|
31
|
+
raise TypeError(f"Expected a re.Match, but got {type(match).__name__}")
|
|
32
|
+
|
|
33
|
+
self._match = match
|
|
34
|
+
|
|
35
|
+
__iter__ = self => iter(self._match.groups())
|
|
36
|
+
__len__ = self => len(self._match.groups())
|
|
37
|
+
__getitem__ = (self, index) => self._match[index]
|
|
38
|
+
|
|
39
|
+
match = property! self => self._match.group(0)
|
|
40
|
+
|
|
41
|
+
__repr__ = self => f"Match({self._match})"
|
|
@@ -4,7 +4,7 @@ none = None
|
|
|
4
4
|
assert_eq(none?(1)?(2), None)
|
|
5
5
|
assert_eq(none?[1]?.a, None)
|
|
6
6
|
assert_eq(none?.a, None)
|
|
7
|
-
assert_eq(none?.(a), None)
|
|
7
|
+
assert_eq(none?. (a), None)
|
|
8
8
|
|
|
9
9
|
obj = (class:
|
|
10
10
|
a = 1
|
|
@@ -13,7 +13,7 @@ obj = (class:
|
|
|
13
13
|
assert_eq((x => x)?(1), 1)
|
|
14
14
|
assert_eq([1]?[0], 1)
|
|
15
15
|
assert_eq(obj?.a, 1)
|
|
16
|
-
assert_eq(1?.($ + 1), 2)
|
|
16
|
+
assert_eq(1?. ($ + 1), 2)
|
|
17
17
|
|
|
18
18
|
assert_eq(None ?? 1, 1)
|
|
19
19
|
assert_eq(int(5) ?? 1, 5)
|
|
@@ -25,4 +25,7 @@ f = () =>
|
|
|
25
25
|
f() ?? 1
|
|
26
26
|
|
|
27
27
|
# should only call once
|
|
28
|
-
assert_eq(counts, 1)
|
|
28
|
+
assert_eq(counts, 1)
|
|
29
|
+
|
|
30
|
+
assert_eq((1).?f, None)
|
|
31
|
+
assert_eq(None.?f, None)
|
|
@@ -186,12 +186,14 @@ pub enum Expr<'a, TTree: Tree> {
|
|
|
186
186
|
RawAttribute(TTree::Expr, SIdent<'a>),
|
|
187
187
|
ScopedAttribute(TTree::Expr, TTree::Expr),
|
|
188
188
|
Attribute(TTree::Expr, SIdent<'a>),
|
|
189
|
+
MaybeAttribute(TTree::Expr, SIdent<'a>),
|
|
189
190
|
|
|
190
191
|
MappedCall(TTree::Expr, Vec<CallItem<'a, TTree>>),
|
|
191
192
|
MappedSubscript(TTree::Expr, Vec<ListItem<TTree>>),
|
|
192
193
|
MappedRawAttribute(TTree::Expr, SIdent<'a>),
|
|
193
194
|
MappedScopedAttribute(TTree::Expr, TTree::Expr),
|
|
194
195
|
MappedAttribute(TTree::Expr, SIdent<'a>),
|
|
196
|
+
MappedMaybeAttribute(TTree::Expr, SIdent<'a>),
|
|
195
197
|
|
|
196
198
|
Try(TTree::Expr, Vec<MatchCase<TTree>>, Option<TTree::Expr>),
|
|
197
199
|
Checked(TTree::Expr, Option<TTree::Pattern>),
|
|
@@ -229,7 +229,9 @@ impl<'src, 'ast> SExprExt<'src, 'ast> for Indirect<SExpr<'src>> {
|
|
|
229
229
|
Expr::RawAttribute(expr, _)
|
|
230
230
|
| Expr::MappedRawAttribute(expr, _)
|
|
231
231
|
| Expr::Attribute(expr, _)
|
|
232
|
-
| Expr::MappedAttribute(expr, _)
|
|
232
|
+
| Expr::MappedAttribute(expr, _)
|
|
233
|
+
| Expr::MaybeAttribute(expr, _)
|
|
234
|
+
| Expr::MappedMaybeAttribute(expr, _) => {
|
|
233
235
|
expr.traverse(ctx);
|
|
234
236
|
Type::Any
|
|
235
237
|
}
|
|
@@ -317,6 +317,18 @@ impl<'src, 'tok> Lift<Indirect<ast::SExpr<'src>>> for cst::SExpr<'src, 'tok> {
|
|
|
317
317
|
ast::Expr::Attribute(expr.lift(), attr.lift_as_ident())
|
|
318
318
|
}
|
|
319
319
|
}
|
|
320
|
+
cst::Expr::MaybeAttribute {
|
|
321
|
+
expr,
|
|
322
|
+
attr,
|
|
323
|
+
question,
|
|
324
|
+
..
|
|
325
|
+
} => {
|
|
326
|
+
if question.is_some() {
|
|
327
|
+
ast::Expr::MappedMaybeAttribute(expr.lift(), attr.lift_as_ident())
|
|
328
|
+
} else {
|
|
329
|
+
ast::Expr::MaybeAttribute(expr.lift(), attr.lift_as_ident())
|
|
330
|
+
}
|
|
331
|
+
}
|
|
320
332
|
cst::Expr::Call {
|
|
321
333
|
expr,
|
|
322
334
|
args,
|
|
@@ -1410,6 +1410,20 @@ impl<'src> SExprExt<'src> for Indirect<SExpr<'src>> {
|
|
|
1410
1410
|
|
|
1411
1411
|
return traversed;
|
|
1412
1412
|
}
|
|
1413
|
+
Expr::MaybeAttribute(expr, attr) => {
|
|
1414
|
+
Expr::MaybeAttribute(expr.traverse(state), attr.clone())
|
|
1415
|
+
}
|
|
1416
|
+
Expr::MappedMaybeAttribute(expr, attr) => {
|
|
1417
|
+
let traversed = Expr::MappedMaybeAttribute(expr.traverse(state), attr)
|
|
1418
|
+
.spanned(span)
|
|
1419
|
+
.indirect();
|
|
1420
|
+
|
|
1421
|
+
state
|
|
1422
|
+
.mapped_fninfo
|
|
1423
|
+
.insert(traversed.as_ref().into(), FnInfo::new());
|
|
1424
|
+
|
|
1425
|
+
return traversed;
|
|
1426
|
+
}
|
|
1413
1427
|
Expr::RawAttribute(expr, attr) => Expr::RawAttribute(expr.traverse(state), attr),
|
|
1414
1428
|
Expr::MappedRawAttribute(expr, spanned) => {
|
|
1415
1429
|
let traversed = Expr::MappedRawAttribute(expr.traverse(state), spanned)
|
|
@@ -1314,11 +1314,13 @@ fn transform_postfix_expr<'src, 'ast>(
|
|
|
1314
1314
|
Expr::Call(obj, _) => (false, obj),
|
|
1315
1315
|
Expr::ScopedAttribute(obj, _) => (false, obj),
|
|
1316
1316
|
Expr::Attribute(obj, _) => (false, obj),
|
|
1317
|
+
Expr::MaybeAttribute(obj, _) => (false, obj),
|
|
1317
1318
|
Expr::MappedRawAttribute(obj, _) => (true, obj),
|
|
1318
1319
|
Expr::MappedSubscript(obj, _) => (true, obj),
|
|
1319
1320
|
Expr::MappedCall(obj, _) => (true, obj),
|
|
1320
1321
|
Expr::MappedScopedAttribute(obj, _) => (true, obj),
|
|
1321
1322
|
Expr::MappedAttribute(obj, _) => (true, obj),
|
|
1323
|
+
Expr::MappedMaybeAttribute(obj, _) => (true, obj),
|
|
1322
1324
|
_ => {
|
|
1323
1325
|
return Err(simple_err(
|
|
1324
1326
|
"Internal error: Postfix expressions can only be attributes, subscripts, calls, or extensions",
|
|
@@ -1364,6 +1366,29 @@ fn transform_postfix_expr<'src, 'ast>(
|
|
|
1364
1366
|
a.attribute(lhs, rhs.value.escape(), access_ctx)
|
|
1365
1367
|
}
|
|
1366
1368
|
}
|
|
1369
|
+
Expr::MaybeAttribute(_, rhs) | Expr::MappedMaybeAttribute(_, rhs) => {
|
|
1370
|
+
let temp_var = ctx.create_aux_var("attr", expr.span.start);
|
|
1371
|
+
|
|
1372
|
+
inner_pre.push(a.try_(
|
|
1373
|
+
PyBlock(vec![a.assign(
|
|
1374
|
+
a.ident(temp_var.clone(), PyAccessCtx::Store),
|
|
1375
|
+
a.call(
|
|
1376
|
+
a.tl_builtin("vget"),
|
|
1377
|
+
vec![a.call_arg(lhs), a.call_arg(a.str(rhs.value.escape()))],
|
|
1378
|
+
),
|
|
1379
|
+
)]),
|
|
1380
|
+
vec![PyExceptHandler {
|
|
1381
|
+
typ: None,
|
|
1382
|
+
name: None,
|
|
1383
|
+
body: PyBlock(vec![
|
|
1384
|
+
a.assign(a.ident(temp_var.clone(), PyAccessCtx::Store), a.none()),
|
|
1385
|
+
]),
|
|
1386
|
+
}],
|
|
1387
|
+
None,
|
|
1388
|
+
));
|
|
1389
|
+
|
|
1390
|
+
a.load_ident(temp_var)
|
|
1391
|
+
}
|
|
1367
1392
|
_ => {
|
|
1368
1393
|
panic!()
|
|
1369
1394
|
}
|
|
@@ -1905,7 +1930,11 @@ impl<'src, 'ast> SExprExt<'src, 'ast> for SExpr<'src> {
|
|
|
1905
1930
|
| Expr::ScopedAttribute(..)
|
|
1906
1931
|
| Expr::MappedScopedAttribute(..)
|
|
1907
1932
|
| Expr::Attribute(..)
|
|
1908
|
-
| Expr::MappedAttribute(..)
|
|
1933
|
+
| Expr::MappedAttribute(..)
|
|
1934
|
+
| Expr::MaybeAttribute(..)
|
|
1935
|
+
| Expr::MappedMaybeAttribute(..) => {
|
|
1936
|
+
pre.bind(transform_postfix_expr(ctx, self, access_ctx)?)
|
|
1937
|
+
}
|
|
1909
1938
|
Expr::With(pattern, value, body) => {
|
|
1910
1939
|
let temp_var = ctx.create_aux_var("with", span.start);
|
|
1911
1940
|
let value = pre.bind(value.transform(ctx)?);
|
|
@@ -465,6 +465,13 @@ pub enum Expr<TTree: Tree> {
|
|
|
465
465
|
rhs: TTree::Expr,
|
|
466
466
|
rparen: TTree::Token,
|
|
467
467
|
},
|
|
468
|
+
MaybeAttribute {
|
|
469
|
+
expr: TTree::Expr,
|
|
470
|
+
question: Option<TTree::Token>,
|
|
471
|
+
dot: TTree::Token,
|
|
472
|
+
question2: TTree::Token,
|
|
473
|
+
attr: TTree::Token,
|
|
474
|
+
},
|
|
468
475
|
Attribute {
|
|
469
476
|
expr: TTree::Expr,
|
|
470
477
|
question: Option<TTree::Token>,
|
|
@@ -1276,6 +1276,11 @@ impl<'src: 'tok, 'tok> ParseCtx<'src, 'tok> {
|
|
|
1276
1276
|
rhs: SExpr<'src, 'tok>,
|
|
1277
1277
|
rparen: &'tok SToken<'src>,
|
|
1278
1278
|
},
|
|
1279
|
+
MaybeAttribute {
|
|
1280
|
+
question: &'tok SToken<'src>,
|
|
1281
|
+
dot: &'tok SToken<'src>,
|
|
1282
|
+
attr: &'tok SToken<'src>,
|
|
1283
|
+
},
|
|
1279
1284
|
Attribute {
|
|
1280
1285
|
dot: &'tok SToken<'src>,
|
|
1281
1286
|
attr: &'tok SToken<'src>,
|
|
@@ -1341,6 +1346,15 @@ impl<'src: 'tok, 'tok> ParseCtx<'src, 'tok> {
|
|
|
1341
1346
|
ctx.listing("(", ")", Token::Symbol(","), |ctx| ctx.call_item())?;
|
|
1342
1347
|
Ok(Postfix::MethodCall { dot, method, args })
|
|
1343
1348
|
},
|
|
1349
|
+
|ctx| {
|
|
1350
|
+
let question = ctx.symbol("?")?;
|
|
1351
|
+
let attr = ctx.any_ident()?;
|
|
1352
|
+
Ok(Postfix::MaybeAttribute {
|
|
1353
|
+
question,
|
|
1354
|
+
dot,
|
|
1355
|
+
attr,
|
|
1356
|
+
})
|
|
1357
|
+
},
|
|
1344
1358
|
|ctx| {
|
|
1345
1359
|
let attr = ctx.any_ident()?;
|
|
1346
1360
|
Ok(Postfix::Attribute { dot, attr })
|
|
@@ -1411,6 +1425,17 @@ impl<'src: 'tok, 'tok> ParseCtx<'src, 'tok> {
|
|
|
1411
1425
|
dot,
|
|
1412
1426
|
attr,
|
|
1413
1427
|
},
|
|
1428
|
+
Postfix::MaybeAttribute {
|
|
1429
|
+
question: question2,
|
|
1430
|
+
dot,
|
|
1431
|
+
attr,
|
|
1432
|
+
} => Expr::MaybeAttribute {
|
|
1433
|
+
expr: expr.boxed(),
|
|
1434
|
+
question,
|
|
1435
|
+
dot,
|
|
1436
|
+
question2,
|
|
1437
|
+
attr,
|
|
1438
|
+
},
|
|
1414
1439
|
Postfix::Decorator { op, decorator } => {
|
|
1415
1440
|
if question.is_some() {
|
|
1416
1441
|
return Err(self.set_error(
|
|
@@ -190,6 +190,20 @@ impl<'src, 'tok> SimpleFmt for SExprInner<'src, 'tok> {
|
|
|
190
190
|
attr.simple_fmt()
|
|
191
191
|
)
|
|
192
192
|
}
|
|
193
|
+
Expr::MaybeAttribute {
|
|
194
|
+
expr,
|
|
195
|
+
question,
|
|
196
|
+
attr,
|
|
197
|
+
..
|
|
198
|
+
} => {
|
|
199
|
+
let question_str = if question.is_some() { "?" } else { "" };
|
|
200
|
+
format!(
|
|
201
|
+
"{}{}.?{}",
|
|
202
|
+
expr.simple_fmt(),
|
|
203
|
+
question_str,
|
|
204
|
+
attr.simple_fmt()
|
|
205
|
+
)
|
|
206
|
+
}
|
|
193
207
|
Expr::Slice {
|
|
194
208
|
start,
|
|
195
209
|
dots: _,
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export import koatl.std.(
|
|
2
|
+
trait.*
|
|
3
|
+
ext.*
|
|
4
|
+
data.*
|
|
5
|
+
iter.*
|
|
6
|
+
control.(Result, Ok, Err, Env, Memo, Async, AsyncMemo, do)
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
import koatl.std.(
|
|
10
|
+
re.Pattern
|
|
11
|
+
lazy_module.(LazyModule, RootModulesProxy)
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
export std = LazyModule("koatl.std")
|
|
15
|
+
export mod = RootModulesProxy()
|
|
16
|
+
|
|
17
|
+
Extension.trait(Iterable)
|
|
18
|
+
|
|
19
|
+
Extension.property(list, "len")! List.len.fget
|
|
20
|
+
|
|
21
|
+
Extension.property(object, "result")! self => Result(self)
|
|
22
|
+
|
|
23
|
+
Extension.method(str, "match")! (regex, str) => Pattern(regex).match(str)
|
|
24
|
+
Extension.method(str, "matches")! (str, regex) => Pattern(regex).match(str)
|
|
25
|
+
|
|
26
|
+
__tl__.do = koatl.std.control.do.do
|
|
27
|
+
|
|
28
|
+
__tl__.op_map = koatl.std.control.result.op_map
|
|
29
|
+
__tl__.op_coal = koatl.std.control.result.op_coal
|
|
30
|
+
|
|
31
|
+
__tl__.Ok = koatl.std.control.result.Ok
|
|
32
|
+
__tl__.Err = koatl.std.control.result.Err
|
|
33
|
+
__tl__.Result = koatl.std.control.result.Result
|
|
34
|
+
|
|
35
|
+
__tl__.MatchError = koatl.std.MatchError
|
|
36
|
+
|
|
37
|
+
__tl__.memo_value = koatl.std.control.memo.Memo.value
|
|
38
|
+
__tl__.async_memo_value = koatl.std.control.memo.AsyncMemo.value
|
|
@@ -3,14 +3,14 @@ import builtins
|
|
|
3
3
|
|
|
4
4
|
import koatl.std.data.Record
|
|
5
5
|
import koatl.std.trait.Trait
|
|
6
|
-
import .
|
|
6
|
+
import .control.(Traversable, Ok, Err, Memo, Async, AsyncMemo, Result)
|
|
7
7
|
|
|
8
8
|
export Iterable = class(Traversable, Trait):
|
|
9
9
|
iter = Trait.abstract! self => None
|
|
10
10
|
|
|
11
11
|
skip = (self, n) =>
|
|
12
12
|
let it = self.iter
|
|
13
|
-
for _ in
|
|
13
|
+
for _ in..n:
|
|
14
14
|
next(it, None)
|
|
15
15
|
it
|
|
16
16
|
|
|
@@ -27,7 +27,7 @@ export Iterable = class(Traversable, Trait):
|
|
|
27
27
|
take = (self, n) =>
|
|
28
28
|
let impl = () =>
|
|
29
29
|
let it = self.iter
|
|
30
|
-
for _ in
|
|
30
|
+
for _ in..n:
|
|
31
31
|
try:
|
|
32
32
|
yield next(it)
|
|
33
33
|
except StopIteration(value=value) =>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import collections
|
|
3
|
+
import .control.Result
|
|
4
|
+
|
|
5
|
+
export Pattern = class:
|
|
6
|
+
__slots__ = ("pattern",)
|
|
7
|
+
|
|
8
|
+
__init__ = (self, pattern) =>
|
|
9
|
+
pattern match:
|
|
10
|
+
re.Pattern() => self.pattern = pattern
|
|
11
|
+
str() => self.pattern = re.compile(pattern)
|
|
12
|
+
Pattern(pattern=pattern) => self.pattern = pattern
|
|
13
|
+
default => raise TypeError(
|
|
14
|
+
f"Expected a str or pattern, but got {type(pattern).__name__}"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__repr__ = self => f"Pattern({self.pattern})"
|
|
18
|
+
|
|
19
|
+
match = (self, string, flags=0) =>
|
|
20
|
+
if not isinstance(string, str):
|
|
21
|
+
raise TypeError(f"Expected a string, but got {type(string).__name__}")
|
|
22
|
+
|
|
23
|
+
self.pattern.match(string, flags).result.map(Match)
|
|
24
|
+
|
|
25
|
+
export Match = collections.abc.Sequence.register! class:
|
|
26
|
+
__slots__ = ("_match",)
|
|
27
|
+
__match_args__ = ("match",)
|
|
28
|
+
|
|
29
|
+
__init__ = (self, match) =>
|
|
30
|
+
if not isinstance(match, re.Match):
|
|
31
|
+
raise TypeError(f"Expected a re.Match, but got {type(match).__name__}")
|
|
32
|
+
|
|
33
|
+
self._match = match
|
|
34
|
+
|
|
35
|
+
__iter__ = self => iter(self._match.groups())
|
|
36
|
+
__len__ = self => len(self._match.groups())
|
|
37
|
+
__getitem__ = (self, index) => self._match[index]
|
|
38
|
+
|
|
39
|
+
match = property! self => self._match.group(0)
|
|
40
|
+
|
|
41
|
+
__repr__ = self => f"Match({self._match})"
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export import koatl.std.(
|
|
2
|
-
trait.*
|
|
3
|
-
ext.*
|
|
4
|
-
data.*
|
|
5
|
-
iter.*
|
|
6
|
-
alg.(Result, Ok, Err, Env, Memo, Async, AsyncMemo)
|
|
7
|
-
alg.do
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
import koatl.std.(
|
|
11
|
-
re.Pattern
|
|
12
|
-
lazy_module.(LazyModule, RootModulesProxy)
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
export std = LazyModule("koatl.std")
|
|
16
|
-
export mod = RootModulesProxy()
|
|
17
|
-
|
|
18
|
-
Extension.trait(Iterable)
|
|
19
|
-
|
|
20
|
-
Extension.property(list, "len")! List.len.fget
|
|
21
|
-
|
|
22
|
-
Extension.property(object, "result")! self => Result(self)
|
|
23
|
-
|
|
24
|
-
Extension.method(str, "match")! (regex, str) => Pattern(regex).match(str)
|
|
25
|
-
|
|
26
|
-
# Note: the below methods have arguments in reverse order to Python's re module.
|
|
27
|
-
Extension.method(str, "matches")! (str, regex) => Pattern(regex).match(str)
|
|
28
|
-
Extension.method(str, "search")! (str, regex) => Pattern(regex).search(str)
|
|
29
|
-
|
|
30
|
-
__tl__.do = koatl.std.alg.do.do
|
|
31
|
-
|
|
32
|
-
__tl__.op_map = koatl.std.alg.result.op_map
|
|
33
|
-
__tl__.op_coal = koatl.std.alg.result.op_coal
|
|
34
|
-
|
|
35
|
-
__tl__.Ok = koatl.std.alg.result.Ok
|
|
36
|
-
__tl__.Err = koatl.std.alg.result.Err
|
|
37
|
-
__tl__.Result = koatl.std.alg.result.Result
|
|
38
|
-
|
|
39
|
-
__tl__.MatchError = koatl.std.MatchError
|
|
40
|
-
|
|
41
|
-
__tl__.memo_value = koatl.std.alg.memo.Memo.value
|
|
42
|
-
__tl__.async_memo_value = koatl.std.alg.memo.AsyncMemo.value
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import re
|
|
2
|
-
import collections
|
|
3
|
-
import .alg.Result
|
|
4
|
-
|
|
5
|
-
export Pattern = class:
|
|
6
|
-
__slots__ = ("pattern",)
|
|
7
|
-
|
|
8
|
-
__init__ = (self, pattern) =>
|
|
9
|
-
pattern match:
|
|
10
|
-
re.Pattern() => self.pattern = pattern
|
|
11
|
-
str() => self.pattern = re.compile(pattern)
|
|
12
|
-
Regex(pattern=pattern) => self.pattern = pattern
|
|
13
|
-
default => raise TypeError(
|
|
14
|
-
f"Expected a str or pattern, but got {type(pattern).__name__}"
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
__repr__ = self => f"Regex({self.pattern})"
|
|
18
|
-
|
|
19
|
-
match = (self, string) =>
|
|
20
|
-
if not isinstance(string, str):
|
|
21
|
-
raise TypeError(f"Expected a string, but got {type(string).__name__}")
|
|
22
|
-
|
|
23
|
-
self.pattern.match(string).result.map(Regex.Match)
|
|
24
|
-
|
|
25
|
-
search = (self, string) =>
|
|
26
|
-
if not isinstance(string, str):
|
|
27
|
-
raise TypeError(f"Expected a string, but got {type(string).__name__}")
|
|
28
|
-
|
|
29
|
-
self.pattern.search(string).result.map(Regex.Match)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Match = collections.abc.Sequence.register! class:
|
|
33
|
-
__slots__ = ("_match",)
|
|
34
|
-
__match_args__ = ("match",)
|
|
35
|
-
|
|
36
|
-
__init__ = (self, match) =>
|
|
37
|
-
if not isinstance(match, re.Match):
|
|
38
|
-
raise TypeError(f"Expected a re.Match, but got {type(match).__name__}")
|
|
39
|
-
|
|
40
|
-
self._match = match
|
|
41
|
-
|
|
42
|
-
__iter__ = self => iter(self._match.groups())
|
|
43
|
-
__len__ = self => len(self._match.groups())
|
|
44
|
-
__getitem__ = (self, index) => self._match[index]
|
|
45
|
-
|
|
46
|
-
match = property! self => self._match.group(0)
|
|
47
|
-
|
|
48
|
-
__repr__ = self => f"Match({self._match})"
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export import koatl.std.(
|
|
2
|
-
trait.*
|
|
3
|
-
ext.*
|
|
4
|
-
data.*
|
|
5
|
-
iter.*
|
|
6
|
-
alg.(Result, Ok, Err, Env, Memo, Async, AsyncMemo)
|
|
7
|
-
alg.do
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
import koatl.std.(
|
|
11
|
-
re.Pattern
|
|
12
|
-
lazy_module.(LazyModule, RootModulesProxy)
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
export std = LazyModule("koatl.std")
|
|
16
|
-
export mod = RootModulesProxy()
|
|
17
|
-
|
|
18
|
-
Extension.trait(Iterable)
|
|
19
|
-
|
|
20
|
-
Extension.property(list, "len")! List.len.fget
|
|
21
|
-
|
|
22
|
-
Extension.property(object, "result")! self => Result(self)
|
|
23
|
-
|
|
24
|
-
Extension.method(str, "match")! (regex, str) => Pattern(regex).match(str)
|
|
25
|
-
|
|
26
|
-
# Note: the below methods have arguments in reverse order to Python's re module.
|
|
27
|
-
Extension.method(str, "matches")! (str, regex) => Pattern(regex).match(str)
|
|
28
|
-
Extension.method(str, "search")! (str, regex) => Pattern(regex).search(str)
|
|
29
|
-
|
|
30
|
-
__tl__.do = koatl.std.alg.do.do
|
|
31
|
-
|
|
32
|
-
__tl__.op_map = koatl.std.alg.result.op_map
|
|
33
|
-
__tl__.op_coal = koatl.std.alg.result.op_coal
|
|
34
|
-
|
|
35
|
-
__tl__.Ok = koatl.std.alg.result.Ok
|
|
36
|
-
__tl__.Err = koatl.std.alg.result.Err
|
|
37
|
-
__tl__.Result = koatl.std.alg.result.Result
|
|
38
|
-
|
|
39
|
-
__tl__.MatchError = koatl.std.MatchError
|
|
40
|
-
|
|
41
|
-
__tl__.memo_value = koatl.std.alg.memo.Memo.value
|
|
42
|
-
__tl__.async_memo_value = koatl.std.alg.memo.AsyncMemo.value
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import re
|
|
2
|
-
import collections
|
|
3
|
-
import .alg.Result
|
|
4
|
-
|
|
5
|
-
export Pattern = class:
|
|
6
|
-
__slots__ = ("pattern",)
|
|
7
|
-
|
|
8
|
-
__init__ = (self, pattern) =>
|
|
9
|
-
pattern match:
|
|
10
|
-
re.Pattern() => self.pattern = pattern
|
|
11
|
-
str() => self.pattern = re.compile(pattern)
|
|
12
|
-
Regex(pattern=pattern) => self.pattern = pattern
|
|
13
|
-
default => raise TypeError(
|
|
14
|
-
f"Expected a str or pattern, but got {type(pattern).__name__}"
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
__repr__ = self => f"Regex({self.pattern})"
|
|
18
|
-
|
|
19
|
-
match = (self, string) =>
|
|
20
|
-
if not isinstance(string, str):
|
|
21
|
-
raise TypeError(f"Expected a string, but got {type(string).__name__}")
|
|
22
|
-
|
|
23
|
-
self.pattern.match(string).result.map(Regex.Match)
|
|
24
|
-
|
|
25
|
-
search = (self, string) =>
|
|
26
|
-
if not isinstance(string, str):
|
|
27
|
-
raise TypeError(f"Expected a string, but got {type(string).__name__}")
|
|
28
|
-
|
|
29
|
-
self.pattern.search(string).result.map(Regex.Match)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Match = collections.abc.Sequence.register! class:
|
|
33
|
-
__slots__ = ("_match",)
|
|
34
|
-
__match_args__ = ("match",)
|
|
35
|
-
|
|
36
|
-
__init__ = (self, match) =>
|
|
37
|
-
if not isinstance(match, re.Match):
|
|
38
|
-
raise TypeError(f"Expected a re.Match, but got {type(match).__name__}")
|
|
39
|
-
|
|
40
|
-
self._match = match
|
|
41
|
-
|
|
42
|
-
__iter__ = self => iter(self._match.groups())
|
|
43
|
-
__len__ = self => len(self._match.groups())
|
|
44
|
-
__getitem__ = (self, index) => self._match[index]
|
|
45
|
-
|
|
46
|
-
match = property! self => self._match.group(0)
|
|
47
|
-
|
|
48
|
-
__repr__ = self => f"Match({self._match})"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/__init__.tl
RENAMED
|
File without changes
|
{koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/async.tl
RENAMED
|
File without changes
|
{koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/base.tl
RENAMED
|
File without changes
|
|
File without changes
|
{koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/env.tl
RENAMED
|
File without changes
|
{koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/memo.tl
RENAMED
|
File without changes
|
{koatl-0.3.7/koatl/python/koatl/std/alg → koatl-0.3.9/koatl/python/koatl/std/control}/result.tl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|