(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)))