Я использую 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
), и все другие источники, которые я смог найти, не работай на меня.
Позвольте мне уточнить последнюю часть:
Первый ответ Как создать исполняемый файл с помощью 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
.
Я остановлюсь здесь, но я пытался следовать двум другим учебникам, ни один из них не работал, и я больше не могу их найти.
Если какой-либо из вышеперечисленных методов можно изменить, чтобы он работал у меня, или если какой-либо другой процесс позволяет компилировать скрипты в исполняемый файл (на данный момент будет достаточно даже простых однофайловых программ), я был бы благодарен.