无法弄清如何运行 .scm 文件(使用 Guile 或 SCM)

6
我创建了一个abc.scm文件,试图使用终端中的“guild compile”、“scm”和“guile”命令将其编译为二进制文件(或guile scheme所编译的其他格式)。
对于“guild compile abc.scm”,输出为“写入‘/ home / tarunmaganti / .cache / guile / ccache / 2.0-LE-8-2.0 / home / tarunmaganti / abc.scm.go’”,我找到该文件并像这样运行 - “./abc.scm.go”,提示权限被拒绝。当我使用“chmod 755”或“chmod 777”给予必要的权限时,会出现错误,如“bash:./abc.scm.go:无法执行二进制文件:执行格式错误”。
“scm whatever-file-name.scm”只是打开了scm解释器。
“guile whatever-file-name.scm”没有任何反应。
官方GNU/Guile Scheme链接并不是很有用。
请帮助我。我想创建一个guile scheme脚本文件。将其编译并作为C/C ++程序运行。这可能吗? 如果无法编译,则至少要知道如何运行GNU/guile scheme或MIT-Scheme的脚本文件。
{非常感谢逐步指导,我在使用Ubuntu和Scheme方面仍然是初学者。}
提前感谢。

3
我有多年的Lisp和Linux经验,而且我也遇到了完全相同的问题,所以不要因为你是初学者而感到难过 :) 有些事情只是令人困惑。 - Lassi
3个回答

5
您可以使用shebang符号来创建一个Guile脚本(在新版本的Guile中,-s是可选的):
#!/usr/bin/guile -s
!#
(display "Hello, world!\n")

请注意第二行的!#。Guile将#!视为块注释的开始(类似于标准Scheme中的#|),必须使用!#来终止(类似于标准Scheme中的|#)。
如果您希望脚本将任何命令行选项传递给Guile本身,请阅读有关元开关的信息。以下是这样一个示例:
#!/usr/bin/guile \
-e main -s
!#
(define (main args)
  (if (null? (cdr args))
      (format #t "Hello, world!~%")
      (for-each (lambda (name)
                  (format #t "Hello, ~a!~%" name))
                (cdr args))))

我遵循了顶部行的约定。我的问题是如何使用Guile或SCM解释器运行该脚本,或者如何编译脚本文件并运行可执行文件。 - Tarun Maganti
@TarunMaganti 在Guile中无法创建独立的二进制文件,至少在2.0或以下版本中不行。使用我推荐的shebang行,您可以将脚本文件设置为可执行并运行它。 - C. K. Young
1
谢谢!那么,guild compile 有什么用途?它说 .scm 文件会自动编译。另外,你能给我一个如何运行脚本的参考资料吗? - Tarun Maganti

3
显然,guile foo 假设 foo 是Scheme源文件。如果 foo 是预编译的二进制文件 .go 它仍会尝试将其视为文本文件并尝试再次编译它,结果这将导致失败。我找不到任何等效的命令行语法来执行预编译的 .go 文件。
然而,你可以通过以下方式获得几乎相同的效果:
  • 编写一个导出主函数的源文件 foo.scm
(define-module (foo)
  #:export (main))

(define (main)
  (display "Hello world!")
  (newline))
  • 使用guild compile -o foo.go foo.scm预编译它
  • 编写一个 shell 脚本来运行 guile -C "$PWD" -c "(use-modules (foo)) (main)"。标志-C dir(大写 C)指定从目录dir加载预编译文件。标志-c expr(小写 c)告诉它评估 Scheme 代码expr,这种情况下只需要调用use-module来加载预编译模块,然后调用我们的主过程。

2
Guile的编译器类似于Java的编译器:它生成字节码,然后在Guile的VM中运行。我不知道是否有直接从Guile Scheme代码转换为本机代码的方法。 Guile真正的意图是成为一种扩展语言,允许您将Scheme脚本添加到C / C ++程序中。
我对MIT Scheme了解不多,但据我所知,它也不会编译为独立可执行文件。如果我有误,请随时纠正。
不过,有一种解决方法。只要您不介意依赖于libguile,就可以在C / C ++中编写包装器,并将包含Scheme代码的字符串交给libguile。在Guile手册的Dia here中提供了一个基本示例。在头文件中创建您的脚本并将其包装在以null结尾的C字符串中,然后(经过一些样板和其他内容)使用scm_eval_string()评估它。
如果你想要编写Scheme并输出本机二进制文件,我听说Chicken不错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接