我已经创建了一个abc.scm文件,并试图在Ubuntu的终端中使用“abc.scm编译”、"scm“和" guile ”命令将其编译成二进制文件(或任何guile方案编译到的)。
对于“`/home/tarunmaganti/.cache/guile/ccache/2.0-LE-8-2.0/home/tarunmaganti/abc.scm.go'”行会编译abc.scm",我得到了输出“我找到了文件并像这样运行-- "./abc.scm.go”,上面写着拒绝许可。“
当我使用"chmod 755“或"chmod 777”授予必要的权限时,会得到一个错误,如"bash:./abc.scm.go:无法执行二进制文件: Exec格式错误“。
"scm任何-file-file. scm “打开了scm解释器。
“欺骗任何-file-name.scm什么都不做。
官方GNU/Guile方案的链接没有多大帮助。
求你帮帮我。我想要创建一个诡计方案脚本文件。编译并作为C/C++程序运行。有可能吗?如果不可能编译,我想知道如何至少运行GNU/guile 或MIT-Scheme的脚本文件。
{一步一步地受到高度赞赏,我仍然是使用Ubuntu的初学者。
提前谢谢。
发布于 2016-06-12 16:09:53
您可以使用shebang表示法来创建一个Guile脚本( -s在新版本的Guile中是可选的):
#!/usr/bin/guile -s
!#
(display "Hello, world!\n")注意第二行的!#。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))))发布于 2019-05-21 21:27:44
显然,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来加载预编译模块,然后调用我们的主要过程。发布于 2016-08-21 19:09:03
Guile的编译器就像Java的编译器:它生成字节码,然后在Guile的VM中运行。我不知道有什么方法可以直接从Guile Scheme代码转到本机代码。Guile实际上是一种扩展语言,允许您将Scheme脚本添加到C/C++程序中。
我对MIT方案不太了解,但据我所知,它也没有编译成一个独立的可执行文件。在这点上请随时纠正我。
不过,这一切总有办法解决的。只要您不介意对libguile的依赖,就可以用C/C++编写一个包装器,并给libguile一个包含你的Scheme代码的字符串。在Dia 这里的Guile手册中给出了一个基本示例。在头文件中创建脚本,并将其包装在一个以空结尾的C字符串中,然后(经过一些样板和诸如此类的操作)使用scm_eval_string()计算它。
如果您想编写Scheme并输出本机二进制文件,我听说过关于鸡肉的一些好东西。
https://stackoverflow.com/questions/37773025
复制相似问题