Hi!

Starting to play with Goblins I had some trouble creating a timer.
Thanks to the kind help on IRC, I was able to create this example.

There are two things I had to discover: how to "sleep" in Goblins and
the fact that in some(?) cases you need do to some extra work to keep a
vat alive/running, and how to do that.  I tried several kind of loops
and other stuff until I found conditions.

Possibly others can find use for it.

Greetings,
Janneke

>From 3be0f50c30e5b9e8250d5653abd9027c8b8feccc Mon Sep 17 00:00:00 2001
From: Janneke Nieuwenhuizen <jann...@gnu.org>
Date: Thu, 6 Mar 2025 21:51:25 +0100
Subject: [PATCH guile-goblins] examples: Add timer.

---
 Makefile.am        |  1 +
 examples/timer.scm | 60 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)
 create mode 100644 examples/timer.scm

diff --git a/Makefile.am b/Makefile.am
index 330b87d..4ee8de5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -196,6 +196,7 @@ js/goblins.wasm: js/goblins.scm
 js: js/goblins.wasm js/reflect.js js/reflect.wasm js/wtf8.wasm
 
 EXAMPLES = examples/cauldron.scm		\
+           examples/timer.scm			\
            examples/try-captp-onion.scm		\
            examples/try-base-netlayer.scm	\
            examples/prelay-server.scm
diff --git a/examples/timer.scm b/examples/timer.scm
new file mode 100644
index 0000000..dd6fd2d
--- /dev/null
+++ b/examples/timer.scm
@@ -0,0 +1,60 @@
+;;; This file is part of Guile Goblins.
+
+;;; Copyright 2025 Jannekxe Nieuwenhuizen <jann...@gnu.org>
+;;;
+;;; Licensed under the Apache License, Version 2.0 (the "License");
+;;; you may not use this file except in compliance with the License.
+;;; You may obtain a copy of the License at
+;;;
+;;;    http://www.apache.org/licenses/LICENSE-2.0
+;;;
+;;; Unless required by applicable law or agreed to in writing, software
+;;; distributed under the License is distributed on an "AS IS" BASIS,
+;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+;;; See the License for the specific language governing permissions and
+;;; limitations under the License.
+
+(use-modules (srfi srfi-26)
+             ((fibers) #:select ((sleep . fibers:sleep))) ;avoid #:replace warning
+             ((fibers conditions) #:select (make-condition signal-condition! wait))
+             ((goblins) #:select ((spawn . spawn-actor) ;avoid #:replace warning
+                                  ($ . $$)  ;support (ice-9 match) ($ <record-type>)
+                                  <-
+                                  define-actor
+                                  on
+                                  spawn-vat with-vat))
+             ((goblins actor-lib methods) #:select (methods))
+             ((goblins vat) #:select (spawn-fibrous-vow)))
+
+(define (timeout-vow duration)
+  (spawn-fibrous-vow (lambda _ (fibers:sleep duration) #t)))
+
+(define-actor (^timer bcom #:key canceled?)
+  (methods
+   ((create target timeout)
+    (on (timeout-vow timeout)
+        (lambda _ (unless canceled? (<- target 'timeout target timeout))))
+    (bcom (^timer bcom)))
+   ((cancel)
+    (bcom (^timer bcom #:canceled? #t)))))
+
+(define-actor (^handler bcom thunk #:key timer)
+  (methods
+   ((timeout self timeout)
+    (thunk)
+    (when timer
+      (<- timer 'create self timeout)))))
+
+(let ((vat   (spawn-vat))
+      (exit? (make-condition)))
+  (with-vat vat
+    (let* ((timer (spawn-actor ^timer))
+           (boom  (spawn-actor ^handler (cute display "boom\n") #:timer timer))
+           (clap  (spawn-actor ^handler (cute display "*clap*\n") #:timer timer))
+           (exit  (spawn-actor ^handler (cute signal-condition! exit?))))
+      ($$ timer 'create boom 0.29)
+      ($$ timer 'create clap 0.6)
+      (on (timeout-vow 1) (lambda _ ($$ timer 'cancel)))
+      ($$ timer 'create exit 2.5)))
+  (wait exit?)
+  (display "That's all folks!\n"))
-- 
2.47.1

-- 
Janneke Nieuwenhuizen <jann...@gnu.org>  | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com | AvatarĀ® https://AvatarAcademy.com

Reply via email to