[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.
- [gnunet-scheme] 198/324: doc: Document dependencies and how to get the source code., (continued)
- [gnunet-scheme] 198/324: doc: Document dependencies and how to get the source code., gnunet, 2021/09/21
- [gnunet-scheme] 202/324: mq-impl/stream: Allow the write fiber to stop even if blocking., gnunet, 2021/09/21
- [gnunet-scheme] 205/324: tests/mq-stream: Unbreak SIGPIPE signal handler., gnunet, 2021/09/21
- [gnunet-scheme] 203/324: tests/mq-stream: Make tests less fragile., gnunet, 2021/09/21
- [gnunet-scheme] 193/324: mq-impl/stream: Eliminate condition variable., gnunet, 2021/09/21
- [gnunet-scheme] 207/324: hat-let: Allow (dotted) variable lists with <--., gnunet, 2021/09/21
- [gnunet-scheme] 211/324: doc: Correct typo (mesage -> message), gnunet, 2021/09/21
- [gnunet-scheme] 215/324: tests/mq-stream: Use 'message-handler' macro., gnunet, 2021/09/21
- [gnunet-scheme] 218/324: mq-impl/stream: Name the reader and writer thunks., gnunet, 2021/09/21
- [gnunet-scheme] 208/324: tests/mq-stream: Don't assume setvbuf returns anything., gnunet, 2021/09/21
- [gnunet-scheme] 212/324: mq/handler: Define a macro for constructing handlers.,
gnunet <=
- [gnunet-scheme] 220/324: mq-impl/stream: Extract code to be shared with connect/fibers., gnunet, 2021/09/21
- [gnunet-scheme] 226/324: doc: Generate PDF and HTML documentation, gnunet, 2021/09/21
- [gnunet-scheme] 227/324: mq: Remove TODOs about hypothetical &malformed-message., gnunet, 2021/09/21
- [gnunet-scheme] 229/324: guix: Import missing module., gnunet, 2021/09/21
- [gnunet-scheme] 194/324: mq-impl/stream: Eliminate atomic box., gnunet, 2021/09/21
- [gnunet-scheme] 191/324: doc: Document message queue error handling., gnunet, 2021/09/21
- [gnunet-scheme] 216/324: mq: Inject errors if no appropriate message handler exists., gnunet, 2021/09/21
- [gnunet-scheme] 190/324: Correct XXX and TODO on input:regular-end-of-file., gnunet, 2021/09/21
- [gnunet-scheme] 196/324: mq-impl/stream: Stop all fibers when EOF is reached (part 1)., gnunet, 2021/09/21
- [gnunet-scheme] 201/324: tests/mq-stream: Make test more strict., gnunet, 2021/09/21