patterns: support embedded literals
This commit is contained in:
parent
a05cfa37eb
commit
79c621e979
|
@ -66,43 +66,42 @@ proc grab*(pr: Value): Pattern =
|
||||||
$(grab parsePreserves"""<foo "bar" #"00" [0 1 2.0] {maybe: #t} <_>>""") ==
|
$(grab parsePreserves"""<foo "bar" #"00" [0 1 2.0] {maybe: #t} <_>>""") ==
|
||||||
"""<rec foo [<lit "bar"> <lit #"00"> <arr [<lit 0> <lit 1> <lit 2.0>]> <dict {maybe: <lit #t>}> <_>]>"""
|
"""<rec foo [<lit "bar"> <lit #"00"> <arr [<lit 0> <lit 1> <lit 2.0>]> <dict {maybe: <lit #t>}> <_>]>"""
|
||||||
|
|
||||||
if pr.embedded: drop()
|
case pr.kind
|
||||||
else:
|
of pkBoolean:
|
||||||
case pr.kind
|
AnyAtom(orKind: AnyAtomKind.`bool`, bool: pr.bool).toPattern
|
||||||
of pkBoolean:
|
of pkFloat:
|
||||||
AnyAtom(orKind: AnyAtomKind.`bool`, bool: pr.bool).toPattern
|
AnyAtom(orKind: AnyAtomKind.`float`, float: pr.float).toPattern
|
||||||
of pkFloat:
|
of pkDouble:
|
||||||
AnyAtom(orKind: AnyAtomKind.`float`, float: pr.float).toPattern
|
AnyAtom(orKind: AnyAtomKind.`double`, double: pr.double).toPattern
|
||||||
of pkDouble:
|
of pkRegister:
|
||||||
AnyAtom(orKind: AnyAtomKind.`double`, double: pr.double).toPattern
|
AnyAtom(orKind: AnyAtomKind.`int`, int: pr.register).toPattern
|
||||||
of pkRegister:
|
of pkString:
|
||||||
AnyAtom(orKind: AnyAtomKind.`int`, int: pr.register).toPattern
|
AnyAtom(orKind: AnyAtomKind.`string`, string: pr.string).toPattern
|
||||||
of pkString:
|
of pkByteString:
|
||||||
AnyAtom(orKind: AnyAtomKind.`string`, string: pr.string).toPattern
|
AnyAtom(orKind: AnyAtomKind.`bytes`, bytes: pr.bytes).toPattern
|
||||||
of pkByteString:
|
of pkSymbol:
|
||||||
AnyAtom(orKind: AnyAtomKind.`bytes`, bytes: pr.bytes).toPattern
|
AnyAtom(orKind: AnyAtomKind.`symbol`, symbol: pr.symbol).toPattern
|
||||||
of pkSymbol:
|
of pkRecord:
|
||||||
AnyAtom(orKind: AnyAtomKind.`symbol`, symbol: pr.symbol).toPattern
|
if (pr.isRecord("_") and pr.arity == 0) or (pr.isRecord("bind") and pr.arity == 1):
|
||||||
of pkRecord:
|
|
||||||
if (pr.isRecord("_") and pr.arity == 0) or (pr.isRecord("bind") and pr.arity == 1):
|
|
||||||
drop()
|
|
||||||
else:
|
|
||||||
DCompoundRec(
|
|
||||||
label: pr.label,
|
|
||||||
fields: map[Value, Pattern](pr.fields, grab)).toPattern
|
|
||||||
of pkSequence:
|
|
||||||
DCompoundArr(items: map(pr.sequence, grab)).toPattern
|
|
||||||
of pkSet:
|
|
||||||
raiseAssert "cannot construct a pattern over a set literal"
|
|
||||||
of pkDictionary:
|
|
||||||
var dict = DCompoundDict()
|
|
||||||
for key, val in pr.pairs: dict.entries[key] = grab val
|
|
||||||
dict.toPattern
|
|
||||||
of pkEmbedded:
|
|
||||||
# TODO: can patterns be constructed over embedded literals?
|
|
||||||
drop()
|
drop()
|
||||||
else:
|
else:
|
||||||
raise newException(ValueError, "cannot generate a pattern for unhandled Value type")
|
DCompoundRec(
|
||||||
|
label: pr.label,
|
||||||
|
fields: map[Value, Pattern](pr.fields, grab)).toPattern
|
||||||
|
of pkSequence:
|
||||||
|
DCompoundArr(items: map(pr.sequence, grab)).toPattern
|
||||||
|
of pkSet:
|
||||||
|
raiseAssert "cannot construct a pattern over a set literal"
|
||||||
|
of pkDictionary:
|
||||||
|
var dict = DCompoundDict()
|
||||||
|
for key, val in pr.pairs: dict.entries[key] = grab val
|
||||||
|
dict.toPattern
|
||||||
|
of pkEmbedded:
|
||||||
|
if pr.embeddedRef.isNil: drop()
|
||||||
|
else:
|
||||||
|
AnyAtom(orKind: AnyAtomKind.`embedded`, embedded: pr.embeddedRef).toPattern
|
||||||
|
else:
|
||||||
|
raise newException(ValueError, "cannot generate a pattern for unhandled Value type")
|
||||||
|
|
||||||
proc grab*[T](x: T): Pattern =
|
proc grab*[T](x: T): Pattern =
|
||||||
## Construct a `Pattern` from value of type `T`.
|
## Construct a `Pattern` from value of type `T`.
|
||||||
|
|
|
@ -82,8 +82,8 @@ suite "protocol":
|
||||||
|
|
||||||
test "later-than":
|
test "later-than":
|
||||||
let
|
let
|
||||||
obsA = parsePreserves"""<Observe <rec later-than [<lit 1704113731.419243>]> #!#f>"""
|
obsA = parsePreserves"""<Observe <rec later-than [<lit 1704113731.419243>]> #f>"""
|
||||||
obsB = parsePreserves"""<Observe <rec Observe [<rec rec [<lit later-than> <arr [<rec lit [<bind <_>>]>]>]> <_>]> #!#f>"""
|
obsB = parsePreserves"""<Observe <rec Observe [<rec rec [<lit later-than> <arr [<rec lit [<bind <_>>]>]>]> <_>]> #f>"""
|
||||||
patA = """<rec later-than [<lit 1704113731.419243>]>""".parsePreserves.preservesTo(Pattern).get
|
patA = """<rec later-than [<lit 1704113731.419243>]>""".parsePreserves.preservesTo(Pattern).get
|
||||||
patB = """<rec Observe [<rec rec [<lit later-than> <arr [<rec lit [<bind <_>>]>]>]> <_>]>""".parsePreserves.preservesTo(Pattern).get
|
patB = """<rec Observe [<rec rec [<lit later-than> <arr [<rec lit [<bind <_>>]>]>]> <_>]>""".parsePreserves.preservesTo(Pattern).get
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue