add (picrin control option)
This commit is contained in:
parent
1c13076f01
commit
43aac4dd29
|
@ -0,0 +1,7 @@
|
|||
CONTRIB_LIBS += $(wildcard contrib/50.option/*.scm)
|
||||
CONTRIB_TESTS += test-option
|
||||
|
||||
test-option: bin/picrin
|
||||
for test in `ls contrib/50.option/t/*.scm`; do \
|
||||
$(TEST_RUNNER) "$$test"; \
|
||||
done
|
|
@ -0,0 +1,22 @@
|
|||
(define-library (picrin control option)
|
||||
(import (scheme base)
|
||||
(picrin control)
|
||||
(picrin procedure))
|
||||
|
||||
(define unit identity)
|
||||
|
||||
(define (bind m f)
|
||||
(and m (f m)))
|
||||
|
||||
(define-syntax reify
|
||||
(syntax-rules ()
|
||||
((_ expr)
|
||||
(reset (unit expr)))))
|
||||
|
||||
(define (reflect m)
|
||||
(shift k (bind m k)))
|
||||
|
||||
(export unit
|
||||
bind
|
||||
reify
|
||||
reflect))
|
|
@ -0,0 +1,27 @@
|
|||
(import (picrin base)
|
||||
(picrin test)
|
||||
(picrin control option))
|
||||
|
||||
(define phonebook
|
||||
'(("Bob" . "01788 665242")
|
||||
("Fred" . "01624 556442")
|
||||
("Alice" . "01889 985333")
|
||||
("Jane" . "01732 187565")))
|
||||
|
||||
(define nums
|
||||
'((one . 1) (two . 2) (three . 3) (four . 19)))
|
||||
|
||||
(define num-dict
|
||||
(alist->dictionary nums))
|
||||
|
||||
(test '("01889 985333" . 3)
|
||||
(reify
|
||||
(let* ((a (reflect (assoc "Alice" phonebook)))
|
||||
(b (reflect (dictionary-ref num-dict 'three))))
|
||||
(cons (cdr a) (cdr b)))))
|
||||
|
||||
(test '#f
|
||||
(reify
|
||||
(let* ((a (reflect (assoc "Alice" phonebook)))
|
||||
(b (reflect (dictionary-ref num-dict 'five))))
|
||||
(cons (cdr a) (cdr b)))))
|
Loading…
Reference in New Issue