gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet-scheme] 212/324: mq/handler: Define a macro for constructing han


From: gnunet
Subject: [gnunet-scheme] 212/324: mq/handler: Define a macro for constructing handlers.
Date: Tue, 21 Sep 2021 13:24:12 +0200

This is an automated email from the git hooks/post-receive script.

maxime-devos pushed a commit to branch master
in repository gnunet-scheme.

commit 686ea487f23fa89f0bc6ca358a335c5f3253fd58
Author: Maxime Devos <maximedevos@telenet.be>
AuthorDate: Tue Aug 31 17:40:45 2021 +0200

    mq/handler: Define a macro for constructing handlers.
    
    * gnu/gnunet/mq/handler.scm (message-handler): New macro.
    * doc/scheme-gnunet.tm (Message handler): Partially document it.
---
 doc/scheme-gnunet.tm      | 68 +++++++++++++++++++++++++++++++++++++++++++++++
 gnu/gnunet/mq/handler.scm | 16 ++++++++++-
 2 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/doc/scheme-gnunet.tm b/doc/scheme-gnunet.tm
index 3440dbc..2869c26 100644
--- a/doc/scheme-gnunet.tm
+++ b/doc/scheme-gnunet.tm
@@ -306,6 +306,74 @@
     \ \ (connect/fibers config "nse" (message-handlers) error-handler))
   </scm-code>
 
+  <subsection|Message handler>
+
+  <index|message handler>When a message is received by the message queue, the
+  corresponding message handler is invoked.<space|1em>Message handlers can be
+  constructed with the <scm|message-handler><index|message-handler> macro and
+  the <scm|make-message-handler><index|make-message-handler> procedure from
+  <scm|(gnu gnunet nse client)>, as follows:
+
+  <\scm-code>
+    (import (gnu gnunet mq handler)
+
+    \ \ \ \ \ \ \ \ (gnu extractor enum)
+
+    \ \ \ \ \ \ \ \ (gnu gnunet message protocols)
+
+    \ \ \ \ \ \ \ \ (gnu gnunet util struct)
+
+    \ \ \ \ \ \ \ \ (gnu gnunet utils bv-slice)
+
+    \ \ \ \ \ \ \ \ (gnu gnunet netstruct syntactic))
+
+    \;
+
+    (define handler/syntactic
+
+    \ \ (message-handler
+
+    \ \ \ (type (symbol-value message-type msg:util:dummy))
+
+    \ \ \ ((interpose code) code)
+
+    \ \ \ ((well-formed? slice)
+
+    \ \ \ \ (= (slice-length slice)
+
+    \ \ \ \ \ \ \ (sizeof /:message-header '())))
+
+    \ \ \ ((handle! slice)
+
+    \ \ \ \ (pk 'message: slice))))
+
+    \;
+
+    (define handler/procedural
+
+    \ \ (make-message-handler
+
+    \ \ \ (symbol-value message-type msg:util:dummy)
+
+    \ \ \ (lambda (p) (p))
+
+    \ \ \ (lambda (slice)
+
+    \ \ \ \ \ (= (slice-length slice)
+
+    \ \ \ \ \ \ \ \ (sizeof /:message-header '())))
+
+    \ \ \ (lambda (slice)
+
+    \ \ \ \ \ (pk 'message: slice))))
+  </scm-code>
+
+  As illustrated in the example code above, a message handler has four
+  components: the <with|font-shape|italic|type> of message it handles, an
+  <with|font-shape|italic|interposer> which will be explained later and the
+  <with|font-shape|italic|handler procedure>. <todo|document the message type
+  database, interposer and handler procedure>
+
   <subsection|Error handler>
 
   The message queue implementation usually just sends and receives messages,
diff --git a/gnu/gnunet/mq/handler.scm b/gnu/gnunet/mq/handler.scm
index ed4c4d0..0192c0c 100644
--- a/gnu/gnunet/mq/handler.scm
+++ b/gnu/gnunet/mq/handler.scm
@@ -20,7 +20,7 @@
 ;;
 ;; @brief General-purpose message queue (message handlers)
 (library (gnu gnunet mq handler)
-  (export <message-handler>
+  (export <message-handler> message-handler
          make-message-handler message-handler?
          message-handler-index
          verify-message? handle-message!
@@ -58,6 +58,20 @@ or its raw numeric value."
       ;; if proved troublesome.
       (sealed #f))
 
+    (define-syntax message-handler
+      (syntax-rules (type interpose well-formed? handle!)
+       ((_ (type the-type)
+           ((interpose code) exp1 exp1* ...)
+           ((well-formed? slice1) exp2 exp2* ...)
+           ((handle! slice2) exp3 exp3* ...))
+        (let ((interpose
+               (lambda (thunk)
+                 (let-syntax ((code (identifier-syntax (thunk))))
+                   exp1 exp1* ...)))
+              (well-formed? (lambda (slice1) exp2 exp2* ...))
+              (handle! (lambda (slice2) exp3 exp3* ...)))
+          (make-message-handler the-type interpose well-formed? handle!)))))
+
     (define (canonicalise-index index)
       (cond ((and (integer? index)
                  (exact? index)

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]