summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/012/cont.tl20
1 files changed, 20 insertions, 0 deletions
diff --git a/tests/012/cont.tl b/tests/012/cont.tl
index 6bdfa14c..0a728ff9 100644
--- a/tests/012/cont.tl
+++ b/tests/012/cont.tl
@@ -17,3 +17,23 @@
(test (let ((f (obtain (yflatten '(a b (c . d) (e (f (g))))))))
(gun [f]))
(a b c d e f g))
+
+(defmacro amb-scope (. forms)
+ ^(block amb-scope ,*forms))
+
+(defun amb (. args)
+ (suspend amb-scope cont
+ (each ((a args))
+ (when (and a (call cont a))
+ (return-from amb a)))))
+
+(test (amb-scope
+ (let ((w1 (amb "the" "that" "a"))
+ (w2 (amb "frog" "elephant" "thing"))
+ (w3 (amb "walked" "treaded" "grows"))
+ (w4 (amb "slowly" "quickly")))
+ (amb (and (eql [w1 -1] [w2 0])
+ (eql [w2 -1] [w3 0])
+ (eql [w3 -1] [w4 0])))
+ (list w1 w2 w3 w4)))
+ ("that" "thing" "grows" "slowly"))