3 make-actor-with-address
21 (define trace-enabled #f) ;used for debugging
23 (define (enable-trace)
24 (set! trace-enabled #t))
26 (define (disable-trace)
27 (set! trace-enabled #f))
34 (define actor-table (make-hash-table))
36 (define (make-actor-with-address address behaviour)
38 (print "Making actor with address " address))
39 (hash-table-set! actor-table address behaviour)
42 (define next-actor-address 1)
44 (define (make-actor behaviour)
45 (make-actor-with-address next-actor-address behaviour)
46 (let ((address next-actor-address))
47 (set! next-actor-address (+ next-actor-address 1))
55 (define (dispatch-message address message)
57 (print "Dispatching message " message " to " address))
58 (let ((behaviour (hash-table-ref/default actor-table address '())))
60 (print "Warning: discarded message " message " to unknown actor " address)
61 (let ((value (apply behaviour (cons address message))))
66 (print "Deleting actor " address))
67 (hash-table-delete! actor-table address))
70 (print "Updating behaviour of " address))
71 (hash-table-set! actor-table address value)))))))
75 ;;; FIFO queue implementation
79 (define (cell val prev next)
82 (define cell-prev cadr)
83 (define cell-next caddr)
84 (define (set-cell-prev! cell prev-cell)
85 (set-car! (cdr cell) prev-cell))
86 (define (set-cell-next! cell next-cell)
87 (set-car! (cddr cell) next-cell))
93 ((empty?) (null? head))
94 ((push) (if (not (= (length args) 1))
95 (error "Wrong number of arguments to push.")
96 (if (not (null? head))
97 (let ((old-head head))
98 (set! head (cell (car args) '() old-head))
99 (set-cell-prev! old-head head))
102 (set! head (cell (car args) '() '()))
104 ((pop) (if (not (= (length args) 0))
105 (error "Wrong number of arguments to pop.")
107 (error "FIFO empty.")
108 (let ((old-tail tail))
109 (set! tail (cell-prev old-tail))
112 (set-cell-next! tail '()))
113 (cell-val old-tail)))))))))
115 (define (fifo-push fifo x)
118 (define (fifo-pop fifo)
121 (define (fifo-empty? fifo)
129 (define message-queue (make-fifo))
131 (define (next-addressed-msg)
132 (if (fifo-empty? message-queue)
134 (fifo-pop message-queue)))
136 (define (send-message actor . message)
138 (print "Queued message " message " to " actor))
139 (fifo-push message-queue (cons actor message)))
141 (define (process-next-message)
142 (let ((addressed-msg (next-addressed-msg)))
143 (if (null? addressed-msg)
145 (let ((address (car addressed-msg))
146 (message (cdr addressed-msg)))
147 (dispatch-message address message)))))
150 (unless (null? (process-next-message))
153 (define (send-and-run actor . message)
154 (apply send-message (cons actor message))
158 (set! message-queue (make-fifo))
159 (set! actor-table (make-hash-table)))
165 (define (save-actors-to filename)
166 (with-output-to-file filename
168 (serialize (hash-table->alist actor-table)))))
170 (define (save-actors)
171 (save-actors-to "image"))
173 (define (load-actors-from filename)
175 (alist->hash-table (with-input-from-file filename deserialize))))
177 (define (load-actors)
178 load-actors-from "image"))