Guile Scheme 脚本编写教程加载脚本

Zel*_*ahl 5 shell scripting scheme guile

我正在尝试学习一些 Guile Scheme,并且正在查看gnu 上的教程:脚本示例

\n\n

目前我有以下代码:

\n\n

模块.scm:

\n\n
#!/usr/bin/env sh\nexec guile -l fact.scm -e \'(@ (my-module) main)\' -s "$0" "$@"\n!#\n\n;; Explanation:\n;; -e (my-module)\n;; If run as a script run the `my-module` module\'s `main`.\n;; (Use `@@` to reference not exported procedures.)\n;; -s\n;; Run the script.\n\n(define-module (my-module)\n  #:export (main))\n\n;; Create a module named `fac`.\n;; Export the `main` procedure as part of `fac`.\n\n(define (n-choose-k n k)\n  (/ (fact n)\n     (* (fact k)\n        (fact (- n k)))))\n\n(define (main args)\n  (let ((n (string->number (cadr args)))\n        (k (string->number (caddr args))))\n    (display (n-choose-k n k))\n    (newline)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

事实.scm

\n\n
#!/usr/local/bin/guile \\\n-e main -s\n!#\n\n;; How to run this program?\n;; Example:\n;; guile -e main -s factorial-script.scm 50\n;; Explanation:\n;; -e specifies the procedure to run\n;; -s specifies to run this as a script\n;; 50 is the number we take as input to the script\n\n(define (fact n)\n  (if (zero? n) 1\n      (* n (fact (- n 1)))))\n\n(define (main args)\n  (display (fact (string->number (cadr args))))\n  (newline))\n
Run Code Online (Sandbox Code Playgroud)\n\n

我使我的主脚本可执行chmod +x modules.scm,然后尝试运行该脚本:./modules.scm 10 3应该是 120),但出现错误:

\n\n
Backtrace:\n           4 (apply-smob/1 #<catch-closure 119cb80>)\nIn ice-9/boot-9.scm:\n    705:2  3 (call-with-prompt ("prompt") #<procedure 11aa8e0 at ice-9/eval.scm:330:13 ()> #<procedure default-prom\xe2\x80\xa6>)\nIn ice-9/eval.scm:\n    619:8  2 (_ #(#(#<directory (guile-user) 1233140>)))\nIn /home/xiaolong/development/Guile/scripting/./modules.scm:\n    26:13  1 (main _)\n     18:0  0 (n-choose-k _ _)\n\n/home/xiaolong/development/Guile/scripting/./modules.scm:18:0: In procedure n-choose-k:\nIn procedure module-lookup: Unbound variable: fact\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,尽管fact我正在加载,但不知何故该程序并未加载fact.scm。我也尝试重命名fact.scmfact为教程中的名称,并更改在 shebang 行之后加载脚本的参数,但结果相同

\n\n

教程是错误的,还是我忽略了一些简单的事情?

\n