When using the (help "regex") syntax, if the search has no matches, you
get an error message of this form:

    scheme@(guile-user)> (help "foo")
    While compiling expression:
    ERROR: In procedure symbol->string: Wrong type argument in position 1 (expecting symbol): "foo"

With this fix, the error message is much more sensible:

    scheme@(guile-user)> (help "foo")
    Did not find any object matching regexp "foo"

* module/ice-9/documentation.scm: Adjust search-documentation-files's
  documentation to say that it will accept strings too.
  (find-documentation-in-file): Only call symbol->string if the incoming
  object is a symbol. Also convert to use let* instead of nested let.
---
 module/ice-9/documentation.scm |   36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/module/ice-9/documentation.scm b/module/ice-9/documentation.scm
index 9b0a121..cdcebba 100644
--- a/module/ice-9/documentation.scm
+++ b/module/ice-9/documentation.scm
@@ -24,9 +24,9 @@
 ;; documentation-files  -- a search-list of files using the Guile
 ;;                         Documentation Format Version 2.
 ;;
-;; search-documentation-files -- a procedure that takes NAME (a symbol)
-;;                               and searches `documentation-files' for
-;;                               associated documentation.  optional
+;; search-documentation-files -- a procedure that takes NAME (a symbol or
+;;                               string) and searches `documentation-files'
+;;                               for associated documentation.  optional
 ;;                               arg FILES is a list of filenames to use
 ;;                               instead of `documentation-files'.
 ;;
@@ -161,21 +161,21 @@
   (and (file-exists? file)
        (call-with-input-file file
 	 (lambda (port)
-	   (let ((name (symbol->string name)))
-	     (let ((len (string-length name)))
-	       (read-delimited entry-delimiter port) ;skip to first entry
-	       (let loop ((entry (read-delimited entry-delimiter port)))
-		 (cond ((eof-object? entry) #f)
-		       ;; match?
-		       ((and ;; large enough?
-		         (>= (string-length entry) len)
-			 ;; matching name?
-			 (string=? (substring entry 0 len) name)
-			 ;; terminated?
-			 (memq (string-ref entry len) '(#\newline)))
-			;; cut away name tag and extra surrounding newlines
-			(substring entry (+ len 2) (- (string-length entry) 2)))
-		       (else (loop (read-delimited entry-delimiter port)))))))))))
+	   (let* ((name (if (symbol? name) (symbol->string name) name))
+	          (len (string-length name)))
+	     (read-delimited entry-delimiter port) ;skip to first entry
+	     (let loop ((entry (read-delimited entry-delimiter port)))
+	       (cond ((eof-object? entry) #f)
+		     ;; match?
+		     ((and ;; large enough?
+		       (>= (string-length entry) len)
+		       ;; matching name?
+		       (string=? (substring entry 0 len) name)
+		       ;; terminated?
+		       (memq (string-ref entry len) '(#\newline)))
+		      ;; cut away name tag and extra surrounding newlines
+		      (substring entry (+ len 2) (- (string-length entry) 2)))
+		     (else (loop (read-delimited entry-delimiter port))))))))))
 
 (define (search-documentation-files name . files)
   (or-map (lambda (file)
-- 
1.7.10.4


Reply via email to