actors: `message-ref' now errors if no dflt provided and key not found
authorChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 22 Apr 2016 15:10:27 +0000 (10:10 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Mon, 25 Apr 2016 14:25:36 +0000 (09:25 -0500)
Thanks to David Thompson for guidance on the best way to construct
%nothing-provided.

* 8sync/systems/actors.scm (message-ref): Adjust to error if no dflt
  provided and key isn't found.
  (%nothing-provided): New unique, immutable value for checking
  if dflt provided to message-ref.

8sync/systems/actors.scm

index bd164be2c26199e1f2fa1a6730085dddd162e777..0257b1f8407d8be59cce6fa3e38ed4c1fe309b4c 100644 (file)
@@ -461,13 +461,22 @@ Instead, actors should call create-actor."
 ;;   change), and using existing tooling (though adding new tooling
 ;;   would be negligible in implementation effort.)
 
-(define* (message-ref message key #:optional dflt)
+;; This cons cell is immutable and unique (for eq? tests)
+(define %nothing-provided (cons 'nothing 'provided))
+
+(define* (message-ref message key #:optional (dflt %nothing-provided))
   "Extract KEY from body of MESSAGE.
 
-Optionally set default with [DFLT]"
+Optionally set default with [DFLT]
+If key not found and DFLT not provided, throw an error."
   (let ((result (assoc key (message-body message))))
     (if result (cdr result)
-        dflt)))
+        (if (eq? dflt %nothing-provided)
+            (throw 'message-body-lacks-key
+                   "Message body does not contain key and no default provided"
+                   #:key key
+                   #:message message)
+            dflt))))
 
 
 (define (kwarg-list-to-alist args)