Как загрузить вспомогательные файлы в скомпилированный код, 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вот как ты, по сути, #includebar.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
Другие вопросы по тегам