使用 Gambit-C 编译方案
Compile Scheme using 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
选项的用法。
我就到此为止了,但我确实尝试学习了另外两个教程,但都没有用,而且我再也找不到它们了。
如果可以修改以上任何一种方法来为我工作,或者如果任何其他过程允许将脚本编译为可执行文件(现在即使是简单的单文件程序也足够了),我会谢天谢地
在您提到的 Gambit 手册的 3. The Gambit Scheme compiler 部分,对编译器及其所有选项进行了非常翔实的描述。
如果你想把Scheme源文件hello.scm
编译成可执行程序,试试:
gsc -exe hello
您不必提供文件扩展名。生成的可执行文件将与源文件同名,没有扩展名(因此 hello.scm
-> hello
)。
这是我想出来的,以防其他人遇到同样的问题。
- 尽管
man
页面中没有出现,但 -exe
选项确实可以创建可执行文件。
$ gsc -exe hello.scm
$ ./hello
Hello, World!
其用法在Gambit, a portable implementation of scheme中有解释,但在"The Gambit Scheme Compiler"部分没有!相反,您必须向上滚动到之前的段落。
- 正如@rsm 指出的那样,
$ gsc -exe hello
也可以正常工作:即使 hello
已经编译,也不需要 .scm
,但是有一个特定的命令序列可以导致此命令失败。
有效(h
已正确编译):
$ ls
hello.scm
$ gsc -exe -o h hello
$ ls
h hello.scm
这有效(h
是从 hello.scm
而不是从 hello
正确编译的):
$ ls
hello hello.scm
$ gsc -exe -o h hello
$ ls
h hello hello.scm
但这失败了:
$ ls
hello.scm
$ gsc -c hello.scm
$ ls
hello.c hello.scm
$ gsc -exe -o h hello
hello_.o:(.data.rel+0x110) : undefined reference to « ____20_hello »
collect2: error: ld returned 1 exit status
*** ERROR IN ##main -- C link failed while linking "/home/hello_.o"
$ ls
hello_.c hello.c hello_.o hello.scm
如果已经存在 .c
同名文件,则应使用 .scm
扩展名。虽然该消息表明存在链接器错误,但问题的根源是——据我所知——当未指定扩展名时,C 文件优先于 Scheme 文件,这对于 Scheme 编译器...
我是 运行 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
选项的用法。
我就到此为止了,但我确实尝试学习了另外两个教程,但都没有用,而且我再也找不到它们了。
如果可以修改以上任何一种方法来为我工作,或者如果任何其他过程允许将脚本编译为可执行文件(现在即使是简单的单文件程序也足够了),我会谢天谢地
在您提到的 Gambit 手册的 3. The Gambit Scheme compiler 部分,对编译器及其所有选项进行了非常翔实的描述。
如果你想把Scheme源文件hello.scm
编译成可执行程序,试试:
gsc -exe hello
您不必提供文件扩展名。生成的可执行文件将与源文件同名,没有扩展名(因此 hello.scm
-> hello
)。
这是我想出来的,以防其他人遇到同样的问题。
- 尽管
man
页面中没有出现,但-exe
选项确实可以创建可执行文件。
$ gsc -exe hello.scm
$ ./hello
Hello, World!
其用法在Gambit, a portable implementation of scheme中有解释,但在"The Gambit Scheme Compiler"部分没有!相反,您必须向上滚动到之前的段落。
- 正如@rsm 指出的那样,
$ gsc -exe hello
也可以正常工作:即使hello
已经编译,也不需要.scm
,但是有一个特定的命令序列可以导致此命令失败。
有效(h
已正确编译):
$ ls
hello.scm
$ gsc -exe -o h hello
$ ls
h hello.scm
这有效(h
是从 hello.scm
而不是从 hello
正确编译的):
$ ls
hello hello.scm
$ gsc -exe -o h hello
$ ls
h hello hello.scm
但这失败了:
$ ls
hello.scm
$ gsc -c hello.scm
$ ls
hello.c hello.scm
$ gsc -exe -o h hello
hello_.o:(.data.rel+0x110) : undefined reference to « ____20_hello »
collect2: error: ld returned 1 exit status
*** ERROR IN ##main -- C link failed while linking "/home/hello_.o"
$ ls
hello_.c hello.c hello_.o hello.scm
如果已经存在 .c
同名文件,则应使用 .scm
扩展名。虽然该消息表明存在链接器错误,但问题的根源是——据我所知——当未指定扩展名时,C 文件优先于 Scheme 文件,这对于 Scheme 编译器...