gib-gab-gob/gib-gab-gob/actors.scm

29 lines
1.1 KiB
Scheme

(define-module (gib-gab-gob actors)
#:use-module (gib-gab-gob rps)
#:use-module (goblins)
#:use-module (goblins actor-lib methods)
#:use-module (goblins actor-lib sealers)
#:use-module (oop goops)
#:export (^rps ^client-picker))
(define* (^rps bcom)
(define pick 'scissors)
(methods
((register-opponent name client sealed-pick)
(format #t "Hey there, ~a! You sent me your pick of rock-paper-scissors; now I will send mine.\n" name)
;; server always picks scissors, it's the best strat
(on (<- (<- client 'exchange-pick-for-unsealer pick) sealed-pick)
(lambda (peer-pick)
(format #t "The peer has picked ~a (do I win? ~s)\n" peer-pick (rps-winner pick peer-pick)))))))
(define (^client-picker bcom)
(define-values (seal-pick unseal-pick my-pick?)
(spawn-sealer-triplet))
(define pick 'rock)
(methods
;; client always picks rock, it's the real good strat
((get-sealed-pick) ($ seal-pick pick))
((exchange-pick-for-unsealer peer-pick)
(format #t "Peer picked ~a... (do I win? ~s), i will send my unsealer\n" peer-pick (rps-winner pick peer-pick))
unseal-pick)))