6

我创建了一个abc.scm文件,并尝试在 Ubuntu 的终端中使用“ guild compile ”、“ scm ”和“ guile ”命令将其编译为二进制文件(或任何 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: cannot execute binary file: Exec format error ”的错误。

scm whatever-file-name.scm ” 只是打开了 scm 解释器。

" guile whatever-file-name.scm什么都不做。

官方 GNU/Guile Scheme 的链接不是很有帮助。

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

{非常感谢Step-by-step,我仍然是使用Ubuntu和Scheme的初学者。}

提前致谢。

4

3 回答 3

4

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

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

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

如果您希望脚本将任何命令行选项传递给 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))))
于 2016-06-12T16:09:53.353 回答
3

显然guile foo假设这foo是一个方案源文件。如果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)告诉它从-C dir目录加载预编译文件dir-c expr标志(小写 c)告诉它评估 Scheme 代码,在这种情况下,expr它只是use-module加载预编译的模块,然后调用我们的主过程。
于 2019-05-21T21:27:44.273 回答
2

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

我对 MIT Scheme 了解不多,但据我所知,它也不能编译为独立的可执行文件。请随时纠正我。

不过,有办法解决这一切。只要您不介意对 libguile 的依赖,您就可以用 C/C++ 编写一个包装器并将包含您的 Scheme 代码的字符串交给 libguile。在这里,Dia 的 Guile 手册中给出了一个基本示例。在头文件中创建脚本并将其包装在以空字符结尾的 C 字符串中,然后(在一些样板文件和诸如此类之后)使用scm_eval_string().

如果您想编写 Scheme 并输出本机二进制文件,我听说过有关Chicken的好消息。

于 2016-08-21T19:09:03.097 回答