On Wed, 22 Jul 2020 01:56:53 +0200 Jan Wielkiewicz <tona_kosmicznego_smie...@interia.pl> wrote: > Hello, > > I started writing my project in Guile with GOOPS and fibers (I'll > release it once it stops being a shame and starts working!), but I > encountered a problem: > > The example from fibers' manual doesn't work: > > (lambda () > (spawn-fiber (lambda () (display "hey!\n"))))) > > It doesn't print "hey" as documented in the manual. > I use guile 3.0.4 and fibers 1.0.0 (from Guix).
(You are missing '(run-fibers' at the beginnng. Presumably this was just a pasting error on your part.) With that omission corrected, it used to work with guile-2.2. Something seems to have changed with guile-3.0, because it only works for me with guile-3.0 if you set #:drain? to #t in the call to run-fibers. Without that, run-fibers appears to return before init-thunk returns. So it seems that there is either a bug in the manual or in the fibers implementation, probably the latter. > I also tried making a simple proof of concept, but it doesn't seem to > do anything. I would like to understand what's wrong with my code or > report a bug, if this is the case. No errors, warnings, syntax errors, > just silence. > > My code: > > (define-module (blocks block) > #:use-module (fibers) > #:use-module (fibers channels) > #:use-module (oop goops) > #:use-module (srfi srfi-9) ;; records > #:export (<peer> > connect-peers > send-message > handle-message > start-listening)) > > (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)) > > ;; 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) > (put-message (get-output p) msg)) > > (define-method (handle-message (p <peer>)) > (let loop () > (define msg (get-message (get-input p))) > (match (pk msg) > ('ping (send-message p 'pong))) > (loop))) > > (define-method (start-listening (p1 <peer>) (p2 <peer>)) > (run-fibers > (lambda () > (spawn-fiber > (lambda () > (connect-peers p1 p2) > (handle-message p1) > (send-message p1 'ping) > (handle-message p2)))))) > > I run this in repl: > > (define p1 (make <peer>)) > (define p2 (make <peer>)) > > (start-listening p1 p2) TL;DR, and I do not either like or use GOOPS, so I am not sure what you are doing anyway. But try setting #:drain? to #t. Chris