-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcell.ss
40 lines (35 loc) · 1.13 KB
/
cell.ss
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
(library
(melt cell)
(export make-cell
eval-cell)
(import (scheme))
(define (%check-cell-proc proc)
(if (eq? 2 (abs (procedure-arity-mask proc)))
proc
(error 'make-cell "incorrect number of arguments of cell filter definition")))
(define (%inner-proc proc)
(let ((internal (%check-cell-proc proc)))
(case-lambda
[(value)
(if (eq? 2 (abs (procedure-arity-mask value)))
(set! internal value)
(error 'make-cell "incorrect number of arguments of cell filter definition"))]
[() internal])))
(define make-cell
(case-lambda
[(default-value)
(make-cell default-value (lambda (x) x))]
[(default-value filter)
(let ((internal-value default-value)
(internal-cell (%inner-proc filter)))
(case-lambda
[(value)
(set! internal-value value)]
[(value upt-filter)
(set! internal-value value)
(internal-cell upt-filter)]
[() ((internal-cell) internal-value)]))]))
(define (eval-cell cell value)
(begin (cell value)
(cell)))
)