无法弄清楚如何 运行 .scm(使用 guile 或 scm)文件
Cannot work out how to run .scm (using guile or scm) files
我创建了一个 abc.scm 文件,并尝试使用“guild compile 将其编译为二进制文件(或任何可编译的诡计方案) "、"scm" 和 "guile" 命令在终端 Ubuntu.
对于“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方案的link不是很有用。
请帮帮我。我想创建一个诡计方案脚本文件。编译它并 运行 它作为 C/C++ 程序。可能吗?
如果无法编译,我想知道如何至少 运行 GNU/guile 方案 或 MIT- 的脚本文件-方案.
{非常感谢逐步说明,我在使用 Ubuntu 和 Scheme 方面仍然是初学者。}
提前致谢。
您可以使用 shebang 表示法创建 Guile 脚本(-s
在较新版本的 Guile 中是可选的):
#!/usr/bin/guile -s
!#
(display "Hello, world!\n")
注意第二行的!#
。 Guile 将 #!
视为块注释的开始(类似于标准 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 的编译器类似于 Java 的编译器:它生成字节码,然后在 Guile 的 VM 中 运行。我不知道有什么方法可以直接从 Guile Scheme 代码转到本机代码。 Guile 实际上是一种扩展语言,允许您将 Scheme 脚本添加到您的 C/C++ 程序中。
我对 MIT Scheme 了解不多,但据我所知,它也不会编译为独立的可执行文件。请随时纠正我。
不过,有办法解决所有这些问题。只要您不介意对 libguile 的依赖,就可以在 C/C++ 中编写一个包装器并将包含您的 Scheme 代码的字符串传递给 libguile。 Dia here 的 Guile 手册中给出了一个基本示例。在头文件中创建脚本并将其包装在以 null 结尾的 C 字符串中,然后(在一些样板文件和诸如此类的东西之后)用 scm_eval_string()
.
对其进行评估
如果您想编写 Scheme 并输出本机二进制文件,我听说过有关 Chicken 的好消息。
显然 guile foo
假设 foo
是一个 Scheme 源文件。如果 foo
是预编译的二进制 .go
文件,它会尝试将其视为文本文件并再次编译,但失败了。我找不到任何等效的命令行语法来执行 pre-compiled .go
文件。
但是,您可以获得几乎相同的效果,如下所示:
- 编写导出主程序的源文件
foo.scm
:
(define-module (foo)
#:export (main))
(define (main)
(display "Hello world!")
(newline))
- Pre-compile 它与
guild compile -o foo.go foo.scm
- 编写一个运行
guile -C "$PWD" -c "(use-modules (foo)) (main)"
的 shell 脚本。 -C dir
标志(大写 C)告诉它从目录 dir
加载 pre-compiled 文件。 -c expr
标志(小写 c)告诉它计算 Scheme 代码 expr
,在本例中它只是 use-module
加载 pre-compiled 模块,然后调用我们的主程序。
我创建了一个 abc.scm 文件,并尝试使用“guild compile 将其编译为二进制文件(或任何可编译的诡计方案) "、"scm" 和 "guile" 命令在终端 Ubuntu.
对于“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方案的link不是很有用。
请帮帮我。我想创建一个诡计方案脚本文件。编译它并 运行 它作为 C/C++ 程序。可能吗? 如果无法编译,我想知道如何至少 运行 GNU/guile 方案 或 MIT- 的脚本文件-方案.
{非常感谢逐步说明,我在使用 Ubuntu 和 Scheme 方面仍然是初学者。}
提前致谢。
您可以使用 shebang 表示法创建 Guile 脚本(-s
在较新版本的 Guile 中是可选的):
#!/usr/bin/guile -s
!#
(display "Hello, world!\n")
注意第二行的!#
。 Guile 将 #!
视为块注释的开始(类似于标准 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 的编译器类似于 Java 的编译器:它生成字节码,然后在 Guile 的 VM 中 运行。我不知道有什么方法可以直接从 Guile Scheme 代码转到本机代码。 Guile 实际上是一种扩展语言,允许您将 Scheme 脚本添加到您的 C/C++ 程序中。
我对 MIT Scheme 了解不多,但据我所知,它也不会编译为独立的可执行文件。请随时纠正我。
不过,有办法解决所有这些问题。只要您不介意对 libguile 的依赖,就可以在 C/C++ 中编写一个包装器并将包含您的 Scheme 代码的字符串传递给 libguile。 Dia here 的 Guile 手册中给出了一个基本示例。在头文件中创建脚本并将其包装在以 null 结尾的 C 字符串中,然后(在一些样板文件和诸如此类的东西之后)用 scm_eval_string()
.
如果您想编写 Scheme 并输出本机二进制文件,我听说过有关 Chicken 的好消息。
显然 guile foo
假设 foo
是一个 Scheme 源文件。如果 foo
是预编译的二进制 .go
文件,它会尝试将其视为文本文件并再次编译,但失败了。我找不到任何等效的命令行语法来执行 pre-compiled .go
文件。
但是,您可以获得几乎相同的效果,如下所示:
- 编写导出主程序的源文件
foo.scm
:
(define-module (foo)
#:export (main))
(define (main)
(display "Hello world!")
(newline))
- Pre-compile 它与
guild compile -o foo.go foo.scm
- 编写一个运行
guile -C "$PWD" -c "(use-modules (foo)) (main)"
的 shell 脚本。-C dir
标志(大写 C)告诉它从目录dir
加载 pre-compiled 文件。-c expr
标志(小写 c)告诉它计算 Scheme 代码expr
,在本例中它只是use-module
加载 pre-compiled 模块,然后调用我们的主程序。