~ chicken-core (chicken-5) 34345a5f048ecf8efa39c481d32878fea4cda83b


commit 34345a5f048ecf8efa39c481d32878fea4cda83b
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Oct 20 04:20:25 2010 -0400
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Oct 20 04:20:25 2010 -0400

    blob literal syntax (uses sharp-dollar now)

diff --git a/library.scm b/library.scm
index ab03df94..7008e5a4 100644
--- a/library.scm
+++ b/library.scm
@@ -2709,7 +2709,11 @@ EOF
 				  (list 'quasisyntax (readrec)) )
 				 ((#\$)
 				  (##sys#read-char-0 port)
-				  (list 'location (readrec)) )
+				  (let ((c (##sys#peek-char-0 port)))
+				    (cond ((char=? c #\{)
+					   (##sys#read-char-0 port)
+					   (##sys#read-bytevector-literal port))
+					  (else (list 'location (readrec)) ))))
 				 ((#\:) 
 				  (##sys#read-char-0 port)
 				  (build-keyword (r-token)) )
@@ -2825,7 +2829,6 @@ EOF
     ;; I put it here, so the SRFI-4 unit can intercept '#f...'
     ((#\f #\F) (##sys#read-char-0 port) #f)
     ((#\t #\T) (##sys#read-char-0 port) #t)
-    ((#\{) (##sys#read-char-0 port) (##sys#read-bytevector-literal port))
     (else (##sys#read-error port "invalid sharp-sign read syntax" char) ) ) )
 
 
@@ -3112,11 +3115,15 @@ EOF
 		   (outchr port #\space)
 		   (out (##sys#slot x 0)) ) )
 		((##core#inline "C_bytevectorp" x)
-		 (if (##core#inline "C_permanentp" x)
-		     (outstr port "#<static blob of size")
-		     (outstr port "#<blob of size ") )
-		 (outstr port (number->string (##core#inline "C_block_size" x)))
-		 (outchr port #\>) )
+		 (outstr port "#${")
+		 (let ((len (##sys#size x)))
+		   (do ((i 0 (fx+ i 1)))
+		       ((fx>= i len))
+		     (let ((b (##sys#byte x i)))
+		       (when (fx< b 16)
+			 (outchr port #\0))
+		       (outstr port (##sys#number->string b 16)))))
+		 (outchr port #\}) )
 		((##core#inline "C_structurep" x) (##sys#user-print-hook x readable port))
 		((##core#inline "C_closurep" x) (outstr port (##sys#procedure->string x)))
 		((##core#inline "C_locativep" x) (outstr port "#<locative>"))
diff --git a/manual/Non-standard read syntax b/manual/Non-standard read syntax
index 85095ae4..fa2f63ea 100644
--- a/manual/Non-standard read syntax	
+++ b/manual/Non-standard read syntax	
@@ -39,6 +39,17 @@ Allows user-defined extension of external representations. (For more information
 
 An abbreviation for {{(location EXPRESSION)}}.
 
+=== "Blob" literals
+
+ #${HEX ...}
+
+Syntax for literal "blobs" (byte-sequences). Expects hexadecimal digits and ignores
+any whitespace characters:
+
+  #;1> ,d '${deadbee f}
+  blob of size 4:
+     0: de ad be ef                                     ....
+
 === Keyword
 
  #:SYMBOL
Trap