无法解决如何运行.scm(使用guile或scm)文件

时间:2016-06-12 10:11:08

标签: compilation scheme interpreter mit-scheme guile

我创建了一个 abc.scm 文件,并尝试使用“ guild compile ”将其编译成二进制文件(或任何编译的),“”和“ guile ”命令。

对于“ 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计划的链接不是很有帮助。

请帮帮我。我想创建一个guile方案脚本文件。编译它并将其作为C / C ++程序运行。可能吗? 如果无法编译,我想知道,如何至少运行 GNU / guile scheme MIT-Scheme 的脚本文件。

{一步一步非常感谢,我仍然是使用Ubuntu和Scheme的初学者。}

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以使用shebang表示法创建Guile脚本(-s在较新版本的Guile中是可选的):

#!/usr/bin/guile -s
!#
(display "Hello, world!\n")

注意第二行的!#。 Guile将#!视为块注释的开头(类似于标准Scheme中的#|),必须使用!#终止(类似于|# in标准方案)。

如果您希望脚本将任何命令行选项传递给Guile本身,请阅读meta switch。这是一个例子:

#!/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))))

答案 1 :(得分:2)

Guile的编译器就像Java的编译器:它生成字节码,然后在Guile的VM中运行。我不知道如何直接从Guile Scheme代码转到本机代码。 Guile实际上是一种扩展语言,允许您将Scheme脚本添加到C / C ++程序中。

我对MIT Scheme并不了解,但据我所知,它也没有编译成独立的可执行文件。随意纠正我。

尽管如此,还是有办法绕过这一切。只要你不介意依赖libguile,你就可以用C / C ++编写一个包装器,并手工包含一个包含你的Scheme代码的字符串。这是Dia here的Guile手册中给出的基本示例。在头文件中创建脚本并将其包装在以null结尾的C字符串中,然后(在一些样板和诸如此类之后)用scm_eval_string()对其进行评估。

如果你想编写Scheme并输出原生二进制文件,我已经听说过有关Chicken的好消息。

答案 2 :(得分:1)

显然,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
  • 对其进行预编译
  • 编写运行guile -C "$PWD" -c "(use-modules (foo)) (main)"的shell脚本。 -C dir标志(大写C)告诉它从目录dir加载预编译的文件。 -c expr标志(小写c)告诉它评估方案代码expr,在这种情况下,它仅执行use-module来加载预编译的模块,然后调用我们的主过程。