scheme - 使用 Gambit-C 编译方案
问题描述
我正在运行 Ubuntu 18.04,并安装gambc
了执行 Scheme 脚本。
gsi
工作正常,可以解释我提供的任何文件,并且 REPL 也按预期工作。
不幸的是,我不知道如何使用gsc
.
http://gambitscheme.org/wiki/index.php/A_Tour_of_Scheme_in_Gambit几乎没有提供关于如何使用gsc
编译程序的信息,man gsc
更多的是关于gsi
并且没有涵盖所有可用的选项(选项-o
和-c
例如man
页面中没有提到),而我能找到的所有其他资源都对我不起作用。
让我详细说明最后一部分:
How to make executable File using Gambit的第一个答案适用于 Windows。
尝试遵循第二个答案给出:
$ cat hello.scm
;#!/usr/local/bin/gsi-script -:d0
;
(define hello-world
(lambda ()
(begin (write `Hello-World) (newline) (hello-world))))
(define (main)
(hello-world))
然后
$ gsc hello.scm
$ ls
hello.o1 hello.scm
$ ./hello.o1
Segmentation fault (core dumped)
失败,也是如此
$ gsc -c hello.scm
$ ls
hello.c hello.scm
$ gcc -o hello hello.c
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o : In function « _start » :
(.text+0x20) : Undefined reference to « main »
/tmp/ccnDUVi0.o : [30 more lines]
collect2: error: ld returned 1 exit status
- 正在做
/* File: "m1.c" */
int power_of_2 (int x) { return 1<<x; }
; File: "m2.scm"
(c-declare "extern int power_of_2 ();")
(define pow2 (c-lambda (int) int "power_of_2"))
(define (twice x) (cons x x))
; File: "m3.scm"
(write (map twice (map pow2 '(1 2 3 4)))) (newline)
$ gsc -c m2.scm # create m2.c (note: .scm is optional)
$ gsc -c m3.scm # create m3.c (note: .scm is optional)
$ gsc -link m2.c m3.c # create the incremental link file m3_.c
$ gsc -obj m1.c m2.c m3.c m3_.c
m1.c:
m2.c:
m3.c:
m3_.c:
$ gcc m1.o m2.o m3.o m3_.o -lgambit -lm -ldl -lutil
$ ./a.out
((2 . 2) (4 . 4) (8 . 8) (16 . 16))
正如http://www.iro.umontreal.ca/~gambit/doc/gambit.html所建议的那样,它没有$ gsc -obj m1.c m2.c m3.c m3_.c
说m3_.c
没有定义,甚至忽略了这一点,它再次$ gcc m1.o m2.o m3.o m3_.o -lgambit -lm -ldl -lutil
抱怨-lgambit
没有定义。然而,该文档确实解释了-o
和-c
选项的用法。
我会在这里停下来,但我确实尝试遵循其他两个教程,但都没有奏效,我再也找不到它们了。
如果可以修改上述任何方法以适合我,或者如果任何其他过程允许将脚本编译为可执行文件(现在即使是简单的 1 文件程序也足够了),我将不胜感激。
解决方案
在您提到的 Gambit 手册的第3 部分。Gambit Scheme 编译器中,对编译器及其所采用的所有选项进行了非常丰富的描述。
如果要将 Scheme 源文件编译hello.scm
为可执行程序,请尝试:
gsc -exe hello
您不必提供文件扩展名。生成的可执行文件将与源文件同名,没有扩展名(所以hello.scm
-> hello
)。
推荐阅读
- perl - Perl - tan 的未定义子例程
- javascript - 将附加参数传递给事件回调函数
- android - 如何在恒定间隔的约束布局中居中两个文本视图?
- python - 我可以从 Excel 文件中修改特定工作表并写回相同的工作表而不使用 Pandas 修改其他工作表吗?打开pyxl
- reactjs - componentDidMount 设置状态后不发送数据
- coq - 在 Coq 中证明 (~A -> ~B)-> (~A -> B) -> A
- haskell - 在这种情况下,是否可以折叠 Applicative <*> 以避免重复?
- c# - 从类中返回一个列表(实体框架)
- android - firebase phoneauth - 返回 Gms:com.google.firebase.auth.api.internal.zzal@830b094
- stream - SICP 练习 3.67 - 无限制地生成所有整数对