Subject: Re: bug#36682: Error in Guile scripting examples

From: Arne Babenhauserheide <[email-masked]>
Date: Tue, 16 Jul 2019 01:44:39 +0200

Hello Hans-Werner Roitzsch,

It looks like you’re mixing up two concepts: the fac creates a module
and loads the fact which is not a module, so basically main and choose
live in another namespace than fact (define-module starts a new
namespace).

And it seems that this is indeed a bug in the documentation, because
https://www.gnu.org/software/guile/manual/html_node/Scripting-Examples.html#Scripting-Examples
jumps to defining fac as a module but does not at the same time define
and import fact as a module, too.

Hans-Werner Roitzsch <[email-masked]> writes:
> I have the file `modules.scm` with the following code:
>
> ----8<----start-of-code---->8----
> #!/usr/bin/env sh
> exec guile -l fact.scm -e '(@ (my-module) main)' -s "$0" "$@"
> !#
>
> ;; Explanation:
> ;; -e (my-module)
> ;; If run as a script run the `my-module` module's `main`.
> ;; (Use `@@` to reference not exported procedures.)
> ;; -s
> ;; Run the script.
>
> (define-module (my-module)
>   #:export (main))

At this point you need

(use-modules (fact))

> ;; Create a module named `fac`.
> ;; Export the `main` procedure as part of `fac`.
>
> (define (n-choose-k n k)
>   (/ (fact n)
>      (* (fact k)
>         (fact (- n k)))))
>
> (define (main args)
>   (let ((n (string->number (cadr args)))
>         (k (string->number (caddr args))))
>     (display (n-choose-k n k))
>     (newline)))
> ----8<----end-of-code---->8----
>
> And I have the following `fact.scm`:
>
> ----8<----start-of-code---->8----
> #!/usr/local/bin/guile \
> -e main -s
> !#
>
> ;; How to run this program?
> ;; Example:
> ;; guile -e main -s factorial-script.scm 50
> ;; Explanation:
> ;; -e specifies the procedure to run
> ;; -s specifies to run this as a script
> ;; 50 is the number we take as input to the script

To be usable as module, this needs to be defined as module:

(define-module (fact)
  #:export (fact))

> (define (fact n)
>   (if (zero? n) 1
>       (* n (fact (- n 1)))))
>
> (define (main args)
>   (display (fact (string->number (cadr args))))
>   (newline))
> ----8<----end-of-code---->8----
…
> chmod +x modules.scm
> ./modules.scm 10 3

Does it work with the added module definition and import?

If yes, then this looks like a bug in the documentation.

> Best regards,
> Hans-Werner Roitzsch

Best wishes, and thank you for reporting!
Arne
--
Unpolitisch sein
heißt politisch sein
ohne es zu merken