-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsyntax.scm
130 lines (114 loc) · 3.1 KB
/
syntax.scm
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
(load "system.scm")
(define-syntax +v
(syntax-rules ()
((+v a1 a2)
(let ((resp (make-connector)))
(adder a1 a2 resp)
resp))))
(define-syntax *v
(syntax-rules ()
((*v m1 m2)
(let ((resp (make-connector)))
(multiplier m1 m2 resp)
resp))))
(define-syntax -v
(syntax-rules ()
((-v s1 s2)
(let ((resp (make-connector)))
(subtractor s1 s2 resp)
resp))))
(define-syntax /v
(syntax-rules ()
((/v d1 d2)
(let ((resp (make-connector)))
(divider d1 d2 resp)
resp))))
(define-syntax sinv
(syntax-rules ()
((sinv ang)
(let ((resp (make-connector)))
(sine ang resp)
resp))))
(define-syntax cosv
(syntax-rules ()
((cosv ang)
(let ((resp (make-connector)))
(cosine ang resp)
resp))))
(define-syntax tanv
(syntax-rules ()
((tanv ang)
(let ((resp (make-connector)))
(tangent ang resp)
resp))))
(define-syntax sqrtv
(syntax-rules ()
((sqrtv num)
(let ((resp (make-connector)))
(square-root num resp)
resp))))
(define-syntax sqrv
(syntax-rules ()
((sqrv num)
(let ((resp (make-connector)))
(square num resp)
resp))))
(define (cv num)
(let ((resp (make-connector)))
(constant num resp)
resp))
(define-syntax =v
(syntax-rules ()
((=v u v)
(equal u v))))
(define-syntax <=v
(syntax-rules ()
((<=v u v)
(equal-less u v))))
(define-syntax >=v
(syntax-rules ()
((>=v u v)
(equal-more u v))))
(define-syntax name-value
(syntax-rules ()
((name-value name lst)
(let ((element (assoc name lst)))
(if element
(cadr element)
(error "Unknown variable " name))))))
(define (print-probe name value)
(cond ((not value) (set! value "?")))
(display "Probe: ")
(display name)
(display " = ")
(display value)
(display "\n"))
(define (c-p input function)
(let* ((variable
(map (lambda (a)
(match a
((var _)
(list var (make-connector))))) input))
(connectors (map (lambda(a) (cadr a)) variable)))
(map (lambda(a) (match a
((name con)
(probe (name-value name input) con)))) variable)
(apply function connectors)
(lambda* (var flag #:optional (val 0))
(cond ((or (eq? flag 'set-value!) (eq? flag 'set))
(( (name-value var variable) 'set-value!) val 'user))
((or (eq? flag 'forget-value!) (eq? flag 'forget))
(( (name-value var variable) 'forget) 'user))
((eq? flag 'print)
(cond ((pair? var)
(map (lambda(a)
(let ((value (get-value (name-value a variable)) )
(name (name-value a input)))
(print-probe name value))) var ) )
((symbol? var)
(let ((value ((name-value var variable) 'value))
(name (name-value var input)))
(print-probe name value)) ))
'ok))
)
))