From 4a039138dd87e2c2f232f9ce7198b4e36ca403f9 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Thu, 12 Jan 2017 23:10:38 -0400 Subject: - Simplified the macros for asking about or ensuring AST tokens. --- stdlib/source/lux/concurrency/actor.lux | 6 +- stdlib/source/lux/control/effect.lux | 2 +- stdlib/source/lux/host.lux | 92 +++++++++++++++---------------- stdlib/source/lux/macro.lux | 2 +- stdlib/source/lux/macro/syntax.lux | 77 +++++++++++++------------- stdlib/source/lux/macro/syntax/common.lux | 20 +++---- stdlib/source/lux/math.lux | 2 +- stdlib/source/lux/test.lux | 4 +- 8 files changed, 103 insertions(+), 102 deletions(-) (limited to 'stdlib/source') diff --git a/stdlib/source/lux/concurrency/actor.lux b/stdlib/source/lux/concurrency/actor.lux index 650065a0e..e55386d9d 100644 --- a/stdlib/source/lux/concurrency/actor.lux +++ b/stdlib/source/lux/concurrency/actor.lux @@ -133,7 +133,7 @@ (wrap (#;Right new-server)))) )))) #end (lambda [_ server] (exec (io;run (poison server)) - (:: Monad wrap [])))})))] + (:: Monad wrap [])))})))] (update@ #obituary (: (-> (P;Promise [(Maybe Text) (Actor ($ +0) ($ +1)) (List ($ +1))]) (P;Promise [(Maybe Text) ($ +0) (List ($ +1))])) (lambda [process] @@ -154,7 +154,7 @@ (def: method^ (Syntax Method) (s;form (do s;Monad - [_ (s;symbol! ["" "method:"]) + [_ (s;sample! (' method:)) vars (s;default (list) (s;tuple (s;some s;local-symbol))) [name args] (s;form ($_ s;seq s;local-symbol @@ -171,7 +171,7 @@ (def: stop^ (Syntax AST) (s;form (do s;Monad - [_ (s;symbol! ["" "stop:"])] + [_ (s;sample! (' stop:))] s;any))) (def: actor-decl^ diff --git a/stdlib/source/lux/control/effect.lux b/stdlib/source/lux/control/effect.lux index bf98b9391..2b81ad543 100644 --- a/stdlib/source/lux/control/effect.lux +++ b/stdlib/source/lux/control/effect.lux @@ -217,7 +217,7 @@ (def: translation^ (Syntax Translation) (s;form (do s;Monad - [_ (s;symbol! ["" "=>"])] + [_ (s;sample! (' =>))] (s;seq s;symbol (s;tuple (s;seq s;any s;any)))))) diff --git a/stdlib/source/lux/host.lux b/stdlib/source/lux/host.lux index 7c0180ec1..ededaa0a4 100644 --- a/stdlib/source/lux/host.lux +++ b/stdlib/source/lux/host.lux @@ -561,14 +561,14 @@ (-> Text Text (Syntax AST)) (do s;Monad [#let [dotted-name (format "." field-name)] - _ (s;symbol! ["" dotted-name])] + _ (s;sample! (ast;symbol ["" dotted-name]))] (wrap (`' (_lux_proc ["jvm" (~ (ast;text (format "getstatic" ":" class-name ":" field-name)))] []))))) (def: (make-get-var-parser class-name field-name) (-> Text Text (Syntax AST)) (do s;Monad [#let [dotted-name (format "." field-name)] - _ (s;symbol! ["" dotted-name])] + _ (s;sample! (ast;symbol ["" dotted-name]))] (wrap (`' (_lux_proc ["jvm" (~ (ast;text (format "getfield" ":" class-name ":" field-name)))] [_jvm_this]))))) (def: (make-put-var-parser class-name field-name) @@ -576,7 +576,7 @@ (do s;Monad [#let [dotted-name (format "." field-name)] [_ _ value] (: (Syntax [Unit Unit AST]) - (s;form ($_ s;seq (s;symbol! ["" ":="]) (s;symbol! ["" dotted-name]) s;any)))] + (s;form ($_ s;seq (s;sample! (' :=)) (s;sample! (ast;symbol ["" dotted-name])) s;any)))] (wrap (`' (_lux_proc ["jvm" (~ (ast;text (format "putfield" ":" class-name ":" field-name)))] [_jvm_this (~ value)]))))) (def: (pre-walk-replace f input) @@ -621,7 +621,7 @@ (-> (List TypeParam) Text (List ArgDecl) (Syntax AST)) (do s;Monad [[_ args] (: (Syntax [Unit (List AST)]) - (s;form ($_ s;seq (s;symbol! ["" ".new!"]) (s;tuple (s;exactly (list;size arg-decls) s;any))))) + (s;form ($_ s;seq (s;sample! (' .new!)) (s;tuple (s;exactly (list;size arg-decls) s;any))))) #let [arg-decls' (: (List Text) (map (. (simple-class$ params) product;right) arg-decls))]] (wrap (` (;_lux_proc ["jvm" (~ (ast;text (format "new" ":" class-name ":" (text;join-with "," arg-decls'))))] [(~@ args)]))))) @@ -631,7 +631,7 @@ (do s;Monad [#let [dotted-name (format "." method-name "!")] [_ args] (: (Syntax [Unit (List AST)]) - (s;form ($_ s;seq (s;symbol! ["" dotted-name]) (s;tuple (s;exactly (list;size arg-decls) s;any))))) + (s;form ($_ s;seq (s;sample! (ast;symbol ["" dotted-name])) (s;tuple (s;exactly (list;size arg-decls) s;any))))) #let [arg-decls' (: (List Text) (map (. (simple-class$ params) product;right) arg-decls))]] (wrap (`' (;_lux_proc ["jvm" (~ (ast;text (format "invokestatic" ":" class-name ":" method-name ":" (text;join-with "," arg-decls'))))] [(~@ args)]))))) @@ -642,7 +642,7 @@ (do s;Monad [#let [dotted-name (format "." method-name "!")] [_ args] (: (Syntax [Unit (List AST)]) - (s;form ($_ s;seq (s;symbol! ["" dotted-name]) (s;tuple (s;exactly (list;size arg-decls) s;any))))) + (s;form ($_ s;seq (s;sample! (ast;symbol ["" dotted-name])) (s;tuple (s;exactly (list;size arg-decls) s;any))))) #let [arg-decls' (: (List Text) (map (. (simple-class$ params) product;right) arg-decls))]] (wrap (`' (;_lux_proc ["jvm" (~ (ast;text (format ":" class-name ":" method-name ":" (text;join-with "," arg-decls'))))] [(~' _jvm_this) (~@ args)])))))] @@ -680,32 +680,32 @@ (Syntax PrivacyModifier) (let [(^open) s;Monad] ($_ s;alt - (s;tag! ["" "public"]) - (s;tag! ["" "private"]) - (s;tag! ["" "protected"]) + (s;sample! (' #public)) + (s;sample! (' #private)) + (s;sample! (' #protected)) (wrap [])))) (def: inheritance-modifier^ (Syntax InheritanceModifier) (let [(^open) s;Monad] ($_ s;alt - (s;tag! ["" "final"]) - (s;tag! ["" "abstract"]) + (s;sample! (' #final)) + (s;sample! (' #abstract)) (wrap [])))) (def: bound-kind^ (Syntax BoundKind) - (s;alt (s;symbol! ["" "<"]) - (s;symbol! ["" ">"]))) + (s;alt (s;sample! (' <)) + (s;sample! (' >)))) (def: (generic-type^ imports type-vars) (-> ClassImports (List TypeParam) (Syntax GenericType)) ($_ s;either (do s;Monad - [_ (s;symbol! ["" "?"])] + [_ (s;sample! (' ?))] (wrap (#GenericWildcard #;None))) (s;tuple (do s;Monad - [_ (s;symbol! ["" "?"]) + [_ (s;sample! (' ?)) bound-kind bound-kind^ bound (generic-type^ imports type-vars)] (wrap (#GenericWildcard (#;Some [bound-kind bound]))))) @@ -731,7 +731,7 @@ ## else (wrap (#GenericClass name (list)))))) (s;form (do s;Monad - [name (s;symbol! ["" "Array"]) + [name (s;sample! (' Array)) component (generic-type^ imports type-vars)] (case component (^template [ ] @@ -763,7 +763,7 @@ (wrap [param-name (list)])) (s;tuple (do s;Monad [param-name s;local-symbol - _ (s;symbol! ["" "<"]) + _ (s;sample! (' <)) bounds (s;many (generic-type^ imports (list)))] (wrap [param-name bounds]))))) @@ -807,7 +807,7 @@ (def: (annotations^' imports) (-> ClassImports (Syntax (List Annotation))) (do s;Monad - [_ (s;tag! ["" "ann"])] + [_ (s;sample! (' #ann))] (s;tuple (s;some (annotation^ imports))))) (def: (annotations^ imports) @@ -819,7 +819,7 @@ (def: (throws-decl'^ imports type-vars) (-> ClassImports (List TypeParam) (Syntax (List GenericType))) (do s;Monad - [_ (s;tag! ["" "throws"])] + [_ (s;sample! (' #throws))] (s;tuple (s;some (generic-type^ imports type-vars))))) (def: (throws-decl^ imports type-vars) @@ -845,14 +845,14 @@ (def: state-modifier^ (Syntax StateModifier) ($_ s;alt - (s;tag! ["" "volatile"]) - (s;tag! ["" "final"]) + (s;sample! (' #volatile)) + (s;sample! (' #final)) (:: s;Monad wrap []))) (def: (field-decl^ imports type-vars) (-> ClassImports (List TypeParam) (Syntax [MemberDecl FieldDecl])) (s;either (s;form (do s;Monad - [_ (s;tag! ["" "const"]) + [_ (s;sample! (' #const)) name s;local-symbol anns (annotations^ imports) type (generic-type^ imports type-vars) @@ -887,10 +887,10 @@ (-> ClassImports (List TypeParam) (Syntax [MemberDecl MethodDef])) (s;form (do s;Monad [pm privacy-modifier^ - strict-fp? (s;tag? ["" "strict"]) + strict-fp? (s;sample? (' #strict)) method-vars (s;default (list) (type-params^ imports)) #let [total-vars (List/append class-vars method-vars)] - [_ arg-decls] (s;form (s;seq (s;symbol! ["" "new"]) + [_ arg-decls] (s;form (s;seq (s;sample! (' new)) (arg-decls^ imports total-vars))) constructor-args (constructor-args^ imports total-vars) exs (throws-decl^ imports total-vars) @@ -905,8 +905,8 @@ (-> ClassImports (List TypeParam) (Syntax [MemberDecl MethodDef])) (s;form (do s;Monad [pm privacy-modifier^ - strict-fp? (s;tag? ["" "strict"]) - final? (s;tag? ["" "final"]) + strict-fp? (s;sample? (' #strict)) + final? (s;sample? (' #final)) method-vars (s;default (list) (type-params^ imports)) #let [total-vars (List/append class-vars method-vars)] [name arg-decls] (s;form (s;seq s;local-symbol @@ -923,7 +923,7 @@ (def: (overriden-method-def^ imports) (-> ClassImports (Syntax [MemberDecl MethodDef])) (s;form (do s;Monad - [strict-fp? (s;tag? ["" "strict"]) + [strict-fp? (s;sample? (' #strict)) owner-class (class-decl^ imports) method-vars (s;default (list) (type-params^ imports)) #let [total-vars (List/append (product;right owner-class) method-vars)] @@ -942,8 +942,8 @@ (-> ClassImports (Syntax [MemberDecl MethodDef])) (s;form (do s;Monad [pm privacy-modifier^ - strict-fp? (s;tag? ["" "strict"]) - _ (s;tag! ["" "static"]) + strict-fp? (s;sample? (' #strict)) + _ (s;sample! (' #static)) method-vars (s;default (list) (type-params^ imports)) #let [total-vars method-vars] [name arg-decls] (s;form (s;seq s;local-symbol @@ -961,7 +961,7 @@ (-> ClassImports (Syntax [MemberDecl MethodDef])) (s;form (do s;Monad [pm privacy-modifier^ - _ (s;tag! ["" "abstract"]) + _ (s;sample! (' #abstract)) method-vars (s;default (list) (type-params^ imports)) #let [total-vars method-vars] [name arg-decls] (s;form (s;seq s;local-symbol @@ -978,7 +978,7 @@ (-> ClassImports (Syntax [MemberDecl MethodDef])) (s;form (do s;Monad [pm privacy-modifier^ - _ (s;tag! ["" "native"]) + _ (s;sample! (' #native)) method-vars (s;default (list) (type-params^ imports)) #let [total-vars method-vars] [name arg-decls] (s;form (s;seq s;local-symbol @@ -1008,42 +1008,42 @@ (def: class-kind^ (Syntax ClassKind) (s;either (do s;Monad - [_ (s;tag! ["" "class"])] + [_ (s;sample! (' #class))] (wrap #Class)) (do s;Monad - [_ (s;tag! ["" "interface"])] + [_ (s;sample! (' #interface))] (wrap #Interface)) )) (def: import-member-alias^ (Syntax (Maybe Text)) (s;opt (do s;Monad - [_ (s;tag! ["" "as"])] + [_ (s;sample! (' #as))] s;local-symbol))) (def: (import-member-args^ imports type-vars) (-> ClassImports (List TypeParam) (Syntax (List [Bool GenericType]))) - (s;tuple (s;some (s;seq (s;tag? ["" "?"]) (generic-type^ imports type-vars))))) + (s;tuple (s;some (s;seq (s;sample? (' #?)) (generic-type^ imports type-vars))))) (def: import-member-return-flags^ (Syntax [Bool Bool Bool]) - ($_ s;seq (s;tag? ["" "io"]) (s;tag? ["" "try"]) (s;tag? ["" "?"]))) + ($_ s;seq (s;sample? (' #io)) (s;sample? (' #try)) (s;sample? (' #?)))) (def: primitive-mode^ (Syntax Primitive-Mode) - (s;alt (s;tag! ["" "manual"]) - (s;tag! ["" "auto"]))) + (s;alt (s;sample! (' #manual)) + (s;sample! (' #auto)))) (def: (import-member-decl^ imports owner-vars) (-> ClassImports (List TypeParam) (Syntax ImportMemberDecl)) ($_ s;either (s;form (do s;Monad - [_ (s;tag! ["" "enum"]) + [_ (s;sample! (' #enum)) enum-members (s;some s;local-symbol)] (wrap (#EnumDecl enum-members)))) (s;form (do s;Monad [tvars (s;default (list) (type-params^ imports)) - _ (s;symbol! ["" "new"]) + _ (s;sample! (' new)) ?alias import-member-alias^ #let [total-vars (List/append owner-vars tvars)] ?prim-mode (s;opt primitive-mode^) @@ -1061,7 +1061,7 @@ )) (s;form (do s;Monad [kind (: (Syntax ImportMethodKind) - (s;alt (s;tag! ["" "static"]) + (s;alt (s;sample! (' #static)) (wrap []))) tvars (s;default (list) (type-params^ imports)) name s;local-symbol @@ -1083,12 +1083,12 @@ #import-method-return return }])))) (s;form (do s;Monad - [static? (s;tag? ["" "static"]) + [static? (s;sample? (' #static)) name s;local-symbol ?prim-mode (s;opt primitive-mode^) gtype (generic-type^ imports owner-vars) - maybe? (s;tag? ["" "?"]) - setter? (s;tag? ["" "!"])] + maybe? (s;sample? (' #?)) + setter? (s;sample? (' #!))] (wrap (#FieldAccessDecl {#import-field-mode (default #AutoPrM ?prim-mode) #import-field-name name #import-field-static? static? @@ -1251,7 +1251,7 @@ (#OverridenMethod strict-fp? class-decl type-vars arg-decls return-type body exs) (let [super-replacer (parser->replacer (s;form (do s;Monad - [_ (s;symbol! ["" ".super!"]) + [_ (s;sample! (' .super!)) args (s;tuple (s;exactly (list;size arg-decls) s;any)) #let [arg-decls' (: (List Text) (map (. (simple-class$ (list)) product;right) arg-decls))]] @@ -1944,7 +1944,7 @@ (compiler;fail (format "Unknown class: " class-name)))) (syntax: #export (jvm-import [#let [imports (class-imports *compiler*)]] - [long-name? (s;tag? ["" "long"])] + [long-name? (s;sample? (' #long))] [class-decl (class-decl^ imports)] [#let [full-class-name (product;left class-decl) imports (add-import [(short-class-name full-class-name) full-class-name] diff --git a/stdlib/source/lux/macro.lux b/stdlib/source/lux/macro.lux index f9cfce416..b06deedb7 100644 --- a/stdlib/source/lux/macro.lux +++ b/stdlib/source/lux/macro.lux @@ -13,7 +13,7 @@ (def: omit^ (Syntax Bool) - (s;tag? ["" "omit"])) + (s;sample? (' #omit))) (do-template [ ] [(syntax: #export ( [? omit^] token) diff --git a/stdlib/source/lux/macro/syntax.lux b/stdlib/source/lux/macro/syntax.lux index dd7a3ac06..45aaee1bb 100644 --- a/stdlib/source/lux/macro/syntax.lux +++ b/stdlib/source/lux/macro/syntax.lux @@ -18,7 +18,7 @@ (struct [list #* "" Functor Fold "List/" Monoid]) [product] [error #- fail])) - (.. [ast])) + (.. [ast "AST/" Eq])) ## [Utils] (def: (join-pairs pairs) @@ -78,7 +78,7 @@ ## [Utils] (def: (remaining-inputs asts) (-> (List AST) Text) - ($_ Text/append " | Remaining input: " + ($_ Text/append "\nRemaining input: " (|> asts (map ast;to-text) (interpose " ") (text;join-with "")))) ## [Syntaxs] @@ -90,7 +90,7 @@ #;Nil (#;Left "There are no tokens to parse!") (#;Cons [t tokens']) (#;Right [tokens' t])))) -(do-template [ ] +(do-template [ ] [(def: #export {#;doc (#;TextM ($_ Text/append "Parses the next " " input AST."))} (Syntax ) @@ -100,46 +100,47 @@ (#;Right [tokens' x]) _ - (#;Left ($_ Text/append "Can't parse " (remaining-inputs tokens)))))) + (#;Left ($_ Text/append "Can't parse " (remaining-inputs tokens))))))] - (def: #export ( v) - {#;doc (#;TextM ($_ Text/append "Asks if the given " " is the next input AST."))} - (-> (Syntax Bool)) - (lambda [tokens] - (case tokens - (#;Cons [[_ ( x)] tokens']) - (let [is-it? (:: = v x) - remaining (if is-it? - tokens' - tokens)] - (#;Right [remaining is-it?])) + [ bool Bool #;BoolS bool;Eq "bool"] + [ nat Nat #;NatS number;Eq "nat"] + [ int Int #;IntS number;Eq "int"] + [ frac Frac #;FracS number;Eq "frac"] + [ real Real #;RealS number;Eq "real"] + [ char Char #;CharS char;Eq "char"] + [ text Text #;TextS text;Eq "text"] + [symbol Ident #;SymbolS ident;Eq "symbol"] + [ tag Ident #;TagS ident;Eq "tag"] + ) - _ - (#;Right [tokens false])))) +(def: #export (sample? ast) + {#;doc "Asks if the given AST is the next input."} + (-> AST (Syntax Bool)) + (lambda [tokens] + (case tokens + (#;Cons [token tokens']) + (let [is-it? (AST/= ast token) + remaining (if is-it? + tokens' + tokens)] + (#;Right [remaining is-it?])) - (def: #export ( v) - {#;doc (#;TextM ($_ Text/append "Ensures the given " " is the next input AST."))} - (-> (Syntax Unit)) - (lambda [tokens] - (case tokens - (#;Cons [[_ ( x)] tokens']) - (if (:: = v x) - (#;Right [tokens' []]) - (#;Left ($_ Text/append "Expected a " " but instead got " (ast;to-text [_ ( x)]) (remaining-inputs tokens)))) + _ + (#;Right [tokens false])))) - _ - (#;Left ($_ Text/append "Can't parse " (remaining-inputs tokens))))))] +(def: #export (sample! ast) + {#;doc "Ensures the given AST is the next input."} + (-> AST (Syntax Unit)) + (lambda [tokens] + (case tokens + (#;Cons [token tokens']) + (if (AST/= ast token) + (#;Right [tokens' []]) + (#;Left ($_ Text/append "Expected a " (ast;to-text ast) " but instead got " (ast;to-text token) + (remaining-inputs tokens)))) - [ bool bool? bool! Bool #;BoolS bool;Eq "bool"] - [ nat nat? nat! Nat #;NatS number;Eq "nat"] - [ int int? int! Int #;IntS number;Eq "int"] - [ frac frac? frac! Frac #;FracS number;Eq "frac"] - [ real real? real! Real #;RealS number;Eq "real"] - [ char char? char! Char #;CharS char;Eq "char"] - [ text text? text! Text #;TextS text;Eq "text"] - [symbol symbol? symbol! Ident #;SymbolS ident;Eq "symbol"] - [ tag tag? tag! Ident #;TagS ident;Eq "tag"] - ) + _ + (#;Left "There are no tokens to parse!")))) (def: #export (assert message test) {#;doc "Fails with the given message if the test is false."} diff --git a/stdlib/source/lux/macro/syntax/common.lux b/stdlib/source/lux/macro/syntax/common.lux index 69564fc7d..72faa2ada 100644 --- a/stdlib/source/lux/macro/syntax/common.lux +++ b/stdlib/source/lux/macro/syntax/common.lux @@ -27,8 +27,8 @@ #export #hidden)} (Syntax (Maybe Export-Level)) - (s;opt (s;alt (s;tag! ["" "export"]) - (s;tag! ["" "hidden"])))) + (s;opt (s;alt (s;sample! (' #export)) + (s;sample! (' #hidden))))) (def: #export (gen-export-level ?el) (-> (Maybe Export-Level) (List AST)) @@ -70,7 +70,7 @@ (def: check^ (Syntax [(Maybe AST) AST]) (s;either (s;form (do s;Monad - [_ (s;symbol! ["lux" "_lux_:"]) + [_ (s;sample! (' lux;_lux_:)) type s;any value s;any] (wrap [(#;Some type) value]))) @@ -83,9 +83,9 @@ (def: (_def-anns^ _) (-> Top (Syntax (List [Ident AST]))) - (s;alt (s;tag! ["lux" "Nil"]) + (s;alt (s;sample! (' #lux;Nil)) (s;form (do s;Monad - [_ (s;tag! ["lux" "Cons"]) + [_ (s;sample! (' #lux;Cons)) [head tail] (s;seq (s;tuple (s;seq _def-anns-tag^ s;any)) (_def-anns^ []))] (wrap [head tail]))) @@ -94,10 +94,10 @@ (def: (flat-list^ _) (-> Top (Syntax (List AST))) (s;either (do s;Monad - [_ (s;tag! ["lux" "Nil"])] + [_ (s;sample! (' #lux;Nil))] (wrap (list))) (s;form (do s;Monad - [_ (s;tag! ["lux" "Cons"]) + [_ (s;sample! (' #lux;Cons)) [head tail] (s;tuple (s;seq s;any s;any)) tail (s;local (list tail) (flat-list^ []))] (wrap (#;Cons head tail)))))) @@ -105,13 +105,13 @@ (def: list-meta^ (Syntax (List AST)) (s;form (do s;Monad - [_ (s;tag! ["lux" "ListM"])] + [_ (s;sample! (' #lux;ListM))] (flat-list^ [])))) (def: text-meta^ (Syntax Text) (s;form (do s;Monad - [_ (s;tag! ["lux" "TextM"])] + [_ (s;sample! (' #lux;TextM))] s;text))) (def: (find-def-args meta-data) @@ -138,7 +138,7 @@ (compiler;macro-expand-all def-raw))] (s;local me-def-raw (s;form (do @ - [_ (s;symbol! ["lux" "_lux_def"]) + [_ (s;sample! (' lux;_lux_def)) def-name s;local-symbol [?def-type def-value] check^ def-anns s;any diff --git a/stdlib/source/lux/math.lux b/stdlib/source/lux/math.lux index 4c7c2e92e..c1d855c8e 100644 --- a/stdlib/source/lux/math.lux +++ b/stdlib/source/lux/math.lux @@ -118,7 +118,7 @@ (s/map ast;tag s;tag)) (s;form (s;many s;any)) (s;tuple (s;either (do s;Monad - [_ (s;tag! ["" "and"]) + [_ (s;sample! (' #and)) init-subject (infix^ []) init-op s;any init-param (infix^ []) diff --git a/stdlib/source/lux/test.lux b/stdlib/source/lux/test.lux index 4bebfe10c..e7012f06e 100644 --- a/stdlib/source/lux/test.lux +++ b/stdlib/source/lux/test.lux @@ -136,10 +136,10 @@ (def: config^ (Syntax Test-Config) (s;alt (do s;Monad - [_ (s;tag! ["" "seed"])] + [_ (s;sample! (' #seed))] s;nat) (do s;Monad - [_ (s;tag! ["" "times"])] + [_ (s;sample! (' #times))] s;nat))) (def: property-test^ -- cgit v1.2.3