Hello, Dnia 2020-07-22, o godz. 13:28:14 Chris Vine <vine35792...@gmail.com> napisaĆ(a):
> On further reflection I am not sure if it did used to work with > guile-2.2. I think it may be a bug in the manual after all. This > works OK: > > (display (run-fibers > (lambda () > (let ((channel (make-channel))) > (spawn-fiber > (lambda () > (sleep 1) ;; do some work > (put-message channel "hello world"))) > (simple-format #t "~a~%" (get-message channel)) > "finished\n")))) > This one just worked, I don't know why, even without "display". Something is buggy it seems. > The point about: > > (run-fibers > (lambda () (spawn-fiber > (lambda () > (set! v "Set") > (display "hey!\n"))))) > > is that spawn-fiber, and so init-thunk, will return straigntaway with > a new fiber object. > > So I suspect setting #:drain? to #t will resolve your problem. #:drain solved the problem and I also managed to make my code work. > It might be worth reporting the bug in the manual as an issue on the > github repository (assuming the above is correct). > Yes, I'll report it. Thanks for helping me! Posting my working code, so someone wanting to mix GOOPS with fibers will have a working example: (define-module (blocks block) #:use-module (fibers) #:use-module (fibers channels) #:use-module (oop goops) #:use-module (ice-9 match) #:use-module (srfi srfi-9) ;; records #:export (<peer> connect-peers send-message handle-message main p1 p2 get-buffer)) (define-class <peer> () (input #:init-form '() #:getter get-input #:setter set-input #:init-keyword #:input) (output #:init-form '() #:getter get-output #:setter set-output #:init-keyword #:output) (buffer #:init-value '() #:setter set-buffer #:getter get-buffer)) ;; Only connection, no messaging started. (define-method (connect-peers (p1 <peer>) (p2 <peer>)) (let ((p1-p2 (make-channel)) ;; p1 to p2 (p2-p1 (make-channel))) ;; p2 to p1 (set-input p1 p2-p1) (set-output p1 p1-p2) (set-input p2 p1-p2) (set-output p2 p2-p1))) (define-method (send-message (p <peer>) msg) (spawn-fiber (lambda () (put-message (get-output p) msg)))) (define-method (handle-message (p <peer>)) (spawn-fiber (lambda () (let loop () (define msg (get-message (get-input p))) (match (pk msg) ('ping (send-message p 'pong)) ('pong (send-message p 'ping))) (loop))))) (define (main) (define p1 (make <peer>)) (define p2 (make <peer>)) (connect-peers p1 p2) (run-fibers (lambda () (handle-message p1) (handle-message p2) (send-message p1 'ping)) #:drain? #t)) (main) --- Jan Wielkiewicz