【问题标题】:Cannot work out how to run .scm (using guile or scm) files无法弄清楚如何运行 .scm(使用 guile 或 scm)文件
【发布时间】:2016-10-12 21:13:55
【问题描述】:

我创建了一个 abc.scm 文件并尝试使用“guild compile”、“scm" 和 "guile" 命令。

对于“guild compile abc.scm”,我得到输出“wrote `/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 方案脚本文件。编译它并作为 C/C++ 程序运行。可能吗? 如果无法编译,我想知道,如何至少运行 GNU/guile schemeMIT-Scheme 的脚本文件。

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

提前致谢。

【问题讨论】:

  • 我有多年的 Lisp 和 Linux 经验,并且遇到过完全相同的问题,所以作为一个初学者不要难过 :) 有些事情只是令人困惑。

标签: compilation scheme interpreter mit-scheme guile


【解决方案1】:

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

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

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

如果您希望脚本将任何命令行选项传递给 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))))

【讨论】:

  • 我遵循了顶行的约定。我问的是如何使用 Guile 或 SCM 解释器运行该脚本,或者如何编译脚本文件并运行可执行文件。
  • @TarunMaganti 您不能在 Guile 中创建独立的二进制文件,至少不能在 2.0 或更低版本中。使用我推荐的 shebang 行,您可以简单地使脚本文件可执行并运行它。
  • 谢谢!但是,公会编译是用来做什么的?它说 .scm 文件是自动编译的。另外,能否给我一个关于如何运行脚本的参考。
【解决方案2】:

显然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)告诉它评估 Scheme 代码 expr,在这种情况下,它只是执行 use-module 来加载预编译模块,然后调用我们的主过程。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2018-08-15
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多