Как загрузить вспомогательные файлы в скомпилированный код, Chicken Scheme
В настоящее время я работаю над набором утилит, написанных на Chicken Scheme, и я впервые пытаюсь написать многофайловую программу (или набор программ) на Chicken Scheme, и у меня возникли некоторые проблемы выяснить, как правильно использовать код, определенный в вспомогательных файлах, чтобы при компиляции всего кода, определенного в файле A
будет доступен для скомпилированной формы файла B
, Мне, по сути, нужен эквивалент Chicken Scheme для следующего кода C:
#include "my_helper_lib.h"
int
main(void)
{
/* use definitions provided by my_helper_lib.h */
return 0;
}
Я пытался использовать все следующие, но все они вызывали различные и необычные ошибки, такие как: '()
быть неопределенным, что не имеет смысла, так как '()
это просто еще один способ написания (list)
,
;;; using `use`
(use "helper.scm") ;; Error: (require) cannot load extension: helper.scm
;;; using modules
;; helper.scm
(module helper (foo)
(import scheme)
(define foo (and (display "foobar") (newline))))
;; main.scm
(import helper) ;; Error: module unresolved: helper
;;; using `load`
(load helper.scm) ;; Error: unbound variable: helper.scm
(load "helper.scm") ;; Error: unbound variable: use
;; note: helper.scm contained `(use scheme)` at this point
;; using `require`
(require 'helper.scm) ;; Error: (require) cannot load extension: helper.scm
1 ответ
Мне пришлось немного покопаться, но я наконец понял, как это сделать.
Согласно вики, если у вас есть файл bar.scm
, который полагается на файл foo.scm
вот как ты, по сути, #include
bar.scm
в foo.scm
:
;;; bar.scm
; The declaration marks this source file as the bar unit. The names of the
; units and your files don't need to match.
(declare (unit bar))
(define (fac n)
(if (zero? n)
1
(* n (fac (- n 1))) ) )
;;; foo.scm
; The declaration marks this source file as dependant on the symbols provided
; by the bar unit:
(declare (uses bar))
(write (fac 10)) (newline)
размещение (declare (unit helper))
в helper.scm
а также (declare (uses helper))
в main.scm
и составив их таким образом, сработало:
csc -c main.scm -o main.o
csc -c helper.scm -o helper.o
csc -o foobar main.o helper.o