Hello GNU Team!
I wish to report a bug in either Guile's documentation or Guile's code with regard to running scripts.
There are some examples of that given in Guile's documentation at:
https://www.gnu.org/software/guile/manual/html_node/Scripting-Examples.html#Scripting-Examples
In the following I will describe the problem.
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)) ;; 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 (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----
The script is made executable by doing:
chmod +x modules.scm
Then I call the script as follows:
./modules.scm 10 3
This results in the error:
----8<----start-of-code---->8---- Backtrace: 4 (apply-smob/1 #<catch-closure 119cb80>) In ice-9/boot-9.scm: 705:2 3 (call-with-prompt ("prompt") #<procedure 11aa8e0 at ice-9/eval.scm:330:13 ()> #<procedure default-prom…>) In ice-9/eval.scm: 619:8 2 (_ #(#(#<directory (guile-user) 1233140>))) In /home/xiaolong/development/Guile/scripting/./modules.scm: 26:13 1 (main _) 18:0 0 (n-choose-k _ _) /home/xiaolong/development/Guile/scripting/./modules.scm:18:0: In procedure n-choose-k: In procedure module-lookup: Unbound variable: fact ----8<----end-of-code---->8----
According to my understanding of the tutorial in the Guile documentation that I linked to above this code should work.
I also described the problem some time ago at:
https://stackoverflow.com/questions/50272618/guile-scheme-scripting-tutorial-loading-scripts
My Guile version is:
guile (GNU Guile) 2.2.4
Best regards,
Hans-Werner Roitzsch