2015-03-10 4 views
1

Скажем, у меня есть библиотека Foo в foo.scm так:Создать библиотеку, доступную из ИБК

(module foo (bar) 
    (import scheme) 

    (define (bar arg) 
    (+ 5 arg))) 

И у меня есть программа program.scm:

(use foo) 

(display (bar 2)) 

Теперь я компилирую Foo и генерировать импортировать библиотеку с помощью csc -J -library foo.scm, а затем скомпилировать программу с помощью csc program.scm. Запуск программы отображает «7», как и ожидалось, и все денди. Тем не менее, я хочу загрузить программу в интерактивном режиме в интерпретаторе (csi), но теперь по какой-либо причине каждый вызов функции в foo должен иметь префикс foo#, то есть в интерпретаторе (foo#bar 2) работает, но (bar 2) даже не работает при использовании в исходном файле.

Почему это? Мало того, что это немного раздражает, я также опасаюсь, что у меня может возникнуть непонимание того, как модульная система работает в Chicken, поэтому любое разъяснение было бы очень оценено.

ответ

1

Я не уверен, что вы подразумеваете под «загрузить программу в интерпретатор», но, как правило (use foo) следует загрузить и импортировать библиотеку, поэтому выполнение (load "program.scm") следует делать только что, и все вещи, экспортируемые foo должны быть доступны на уровне.

Похоже, вы каким-то образом столкнулись с ситуацией, когда библиотека была загружена в запущенную систему, но не была импортирована для использования на уровне. Просто введите (use foo) (или даже (import foo)) в REPL, чтобы исправить эту проблему.

Модульная система CHICKEN была разработана для обеспечения отдельной компиляции, что делает возможным кросс-компиляцию. Чтобы сделать эту работу, библиотека импорта и фактическая реализация были разделены, но это немного усложняет ситуацию, как вы обнаружили. Это необходимо, потому что библиотека импорта может определять макросы, которые необходимы во время компиляции, поэтому ее нужно запускать на компроксовом узле, тогда как сама библиотека должна быть доступна в архитектуре цели кросс-компиляции. Мы обсуждаем, как упростить это для CHICKEN 5, так как это то, что смущает многих новичков (а иногда и продвинутых пользователей).