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