Как импортировать файлы относительно основного файла, а не текущего каталога? ((Чез) Схема)

Например, в моем файле main.scm у меня есть (load "util.scm"). util.scm — это файл в той же папке, что и main.scm. Оба файла находятся в папке ~/documents/myproject/.

Теперь, когда я нахожусь в этом каталоге и запускаю $ chez-scheme main.scm, все работает нормально. Однако, если я нахожусь в своем домашнем каталоге и запускаю $chez-scheme documents/myproject/main.scm, он жалуется, что не может найти файл util.scm. Я предполагаю, что это так, потому что текущий каталог был моим соответствующим домашним каталогом, и поэтому util.scm действительно не существует, он фактически находится в documents/myproject/. При этом я привык (на других языках) к функциональности поиска этих путей относительно файла, содержащего инструкцию по импорту, и я хотел бы иметь это и здесь. Я пробовал добавить к нему префикс ./ или определить файл как библиотеку и выполнить (import (util)), но ничего из этого не работает за пределами documents/myproject/. Есть ли способ заставить это работать так, как я намереваюсь?

Я предполагаю, что это специфично для Chez-Scheme. Если нет, я бы предпочел ответ, который не зависит от реализации.


person Lara    schedule 21.10.2016    source источник


Ответы (2)


load в R5RS немного неудобно, так как в отчете говорится, что системные интерфейсы не относятся к теме отчета, но они включают load, что является половинчатым решением. В отчете не говорится, относится ли load к текущему каталогу или к файлу, из которого происходит форма load, поэтому, чтобы быть переносимым, я думаю, вам необходимо запустить свой скрипт из текущего каталога и иметь загруженный файл относительно обоих.

Поскольку Chez Scheme реализует R6RS, load не совсем подходит для использования. R6RS удалил load в пользу библиотек. Вы должны сделать свой файл библиотекой и проконсультироваться, как ее установить. В некоторых системах это просто размещение файлов по правильному пути, добавление местоположения библиотеки в конфигурацию или запуск сценария установки. Как использовать библиотеку одинаково во всех реализациях, используя import.

Согласно документации Chez, вы можете передать ему --libdirs, чтобы указать один или несколько путей для рассмотрения. для загрузки библиотек. Вы можете увидеть пути, которые он сканирует, оценив (library-directories)

person Sylwester    schedule 22.10.2016

Есть несколько разных способов выполнить то, что (я думаю) вы пытаетесь сделать, но в конечном итоге все они сводятся к тому, чтобы дать Чезу знать, где искать вещи. Когда заданы относительные пути, include и load используют параметр source-directories для поиска запрошенного файла. Путь к библиотекам автоматически добавляется к source-directories во время их загрузки или компиляции, поэтому, если бы ваш main.scm был определением библиотеки, он нашел бы util.scm, как вы ожидаете.

Однако похоже, что main.scm — это не библиотека, а программа верхнего уровня. К сожалению, у Chez нет параметра командной строки для установки source-directories, как это делается для каталогов библиотек. Это оставляет вас с немного меньшей гибкостью. Любое из следующего будет работать:

  • Сделайте util.scm библиотекой и вызовите Chez с параметром --libdirs, чтобы он знал, где искать библиотеки.
  • Установите source-directories и загрузите main.scm из REPL, а не из командной строки.
  • Напишите сценарий оболочки-оболочки, который выполняет описанное выше, выводя команды в scheme, чтобы вам не приходилось вводить их самостоятельно. (Подходит только в том случае, если вам не нужно вводить данные в сеанс схемы).
  • Напишите сценарий оболочки-оболочки, который cds в каталог вашего проекта перед запуском scheme (и, предположительно, cds обратно в исходный каталог, когда это будет сделано).
person Jamie Taylor    schedule 22.10.2016