Re: Texinfo in Guile Scheme docstrings?

Matt Wette <[email protected]> Sun, 16 Feb 2025 07:31:11 -0800
Newsgroups gmane.lisp.guile.devel
Message-ID <[email protected]>
    On 2/16/25 6:48 AM, Maxim Cournoyer wrote:

    Hi Yuval,

    Yuval Langer<[email protected]> writes:

>     Hi,
>
>     I am writing docstrings to guile-srfi-189 currently[1] and looking for
>     good docstring style practices (that's another topic for another
>     thread).
>
>     I have noticed that there are some modules with Texinfo markup in
>     their docstrings, but I haven't found these markups being used in any
>     meaningful way.  I looked up two docstrings inside the Guile manual,
>     but couldn't find it there, so these docstrings are not used to
>     de-duplicate documentation.  The two I've searched are (srfi srfi-1)'s
>     assoc and (ice-9 popen)'s open-pipe*.
>
>     Someone had suggested the `guild doc-snarf` command, but it doesn't
>     output any of the docstrings.  What I did notice is that the text in
>     the docstrings defined in the /libguile/ C files can be found in the
>     Guile manual.  There is a tool called `guile-snarf` for the C code
>     docstrings, but that doesn't explain the Guile Scheme docstrings.
>
>     I am extremely confused.  Why have Texinfo in the docstrings of the
>     Scheme source when the docstrings defined in the C files are used?
>     Are there plans for developing tools that will display docstring in a
>     more intelligent way using those markups, like in the interactive
>     environment, or maybe assist in navigating the documentation?
    Sorry for not being helpful, but I've asked myself these questions
    before, and would also like to know the answer.  I assume there was a
    plan to render some of the the Texinfo markup in the interactive
    environment, but that's speculation :-).

    Did you try digging the git history and or guile-devel historical
    messages that could touch that topic?

I'm not sure of the context (C vs Scheme) but for Scheme I've been using
an emacs minor mode I wrote.  With this you document your procedure as
texinfo in comments, then hit C-c C-t d and formatted text is inserted
into your procedure.  See an example below.  The reference is:

https://github.com/mwette/guile-contrib/blob/main/scheme-texidoc.el

The scheme-texinfo minor mode code is not perfect, but usually works for me.

;; @deffn {Procedure} make-lalr-parser mach [options] => parser
;; Generate a procedure for parsing a language, where @var{mach} is
;; a machine generated by @code{make-lalr-machine}.
;; This generates a procedure that takes one argument, a lexical analyzer:
;; @example
;; (parser lexical-analyzer #:debug #t)
;; @end example
;; @noindent
;; and is used as
;; @example
;; (define xyz-parse (make-lalr-parser xyz-mach))
;; (with-input-from-file "sourcefile.xyz"
;;   (lambda () (xyz-parse (gen-lexer))))
;; @end example
;; @noindent
;; The generated parser is reentrant.  Options are:
;; @table @code
;; @item #:skip-if-unexp
;; This is a list of tokens to skip if not expected.  It is used
;; to allow comments to be skipped.  The default is @code{'()}.
;; @item #:interactive
;; If @code{#t}, this tells the parser that this is being called
;; interactively, so that the token @code{$end} is not expected.
;; The default value is @code{#f}.
;; @item #:env
;; Use the passed environment to the parser actions provided in the
;; specification.  This can be a module (e.g., @code{(current-module)}
;; or an environment (e.g., @code{(interaction-environment)}).   The
;; default is to use @code{(current-module)}; that is, the module in which
;; this procedure is being executed.
;; @end table
;; @noindent
;; @end deffn
(define* (make-lalr-parser mach
			   #:key
			   (skip-if-unexp '())
			   interactive
			   env)
   "- Procedure: make-lalr-parser mach [options] => parser
      Generate a procedure for parsing a language, where MACH is a
      machine generated by 'make-lalr-machine'.  This generates a
      procedure that takes one argument, a lexical analyzer:
           (parser lexical-analyzer #:debug #t)
      and is used as
           (define xyz-parse (make-lalr-parser xyz-mach))
           (with-input-from-file \"sourcefile.xyz\"
             (lambda () (xyz-parse (gen-lexer))))
      The generated parser is reentrant.  Options are:
      '#:skip-if-unexp'
           This is a list of tokens to skip if not expected.  It is used
           to allow comments to be skipped.  The default is ''()'.
      '#:interactive'
           If '#t', this tells the parser that this is being called
           interactively, so that the token '$end' is not expected.  The
           default value is '#f'.
      '#:env'
           Use the passed environment to the parser actions provided in
           the specification.  This can be a module (e.g.,
           '(current-module)' or an environment (e.g.,
           '(interaction-environment)').  The default is to use
           '(current-module)'; that is, the module in which this
           procedure is being executed."


   (let* ((mtab (assq-ref mach 'mtab))
	 (siu (map (lambda (n) (assoc-ref mtab n)) skip-if-unexp)))
     (if (number? (caar (vector-ref (assq-ref mach 'pat-v) 0)))
	;; hashed:
	(make-lalr-parser/num mach
			      #:skip-if-unexp siu
			      #:interactive interactive
			      #:env env)
	;; not hashed:
	(make-lalr-parser/sym mach
			      #:skip-if-unexp siu
			      #:interactive interactive
			      #:env env))))