blob: 462c01b2b07160a3f6cf0767608012030ee82d6f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
(define-module (data optional)
#:use-module (oop goops)
#:use-module (ice-9 match)
#:use-module (control monad)
#:export (nothing just
nothing? just?
return-optional
do <-)
;; #:re-export (>>=)
)
(define-class <optional> ()
(slot #:init-value #f
#:init-keyword #:slot)
(just #:init-value #t
#:init-keyword #:just))
(define (nothing) (make <optional> #:just #f))
(define (just obj) (make <optional>
#:just #t
#:slot obj))
(define (nothing? this)
(not (slot-ref this 'just)))
(define (just? this)
(not (nothing? this)))
(define-method (write (this <optional>) port)
(if (just? this)
(format port "[Just ~s]" (slot-ref this 'slot))
(format port "[Nothing]")))
(define return-optional just)
(define-method (>>= (this <optional>)
(proc <procedure>))
(cond ((nothing? this) (nothing))
((just? this)
(match this
(($ <optional> slot) (proc slot))))))
#;
(define-method (mappend (a <optional>) (b <optional>))
(match a
(($ ))))
(define-syntax do
(syntax-rules (<- let =)
((_ let var = val rest ...)
(let ((var val)) (do rest ...)))
((_ ptrn <- val rest ...)
(<- ptrn val rest ...))
((_ a) a)
((_ token rest ...)
(begin token (do rest ...)))))
(define-syntax <-
(syntax-rules (just writer)
((_ (just var) val rest ...)
(>>= val (lambda (var) rest ...)))
((_ (writer var) val rest ...)
(>>= val (lambda (var) rest ...))))
#;
(lambda (x)
(syntax-case x (just writer)
((_ (just var) val rest ...)
#'(>>= val (lambda (var) rest ...)))
((_ (writer var) val rest ...)
#'(>>= val (lambda (var) rest ...)))
#;
((_ (left var) val rest ...) ;
#'(>>= val (lambda (var) rest ...)))
#;
((_ (right var) val rest ...) ;
#'(>>= val (lambda (var) rest ...))))))
|