Переносимая загрузка/включение определения синтаксиса в схему R5RS?

Я пытаюсь написать что-то, что работает как в DrRacket/plt-r5rs, так и в Gambit/gsi.

У меня проблема в том, что (load "foo.scm") в Gambit не загружает define-syntax-блоки. Использование (include "foo.scm") в Gambit работает, но, конечно, приводит к синтаксической ошибке в DrRacket.

Есть ли способ решить эту проблему, чтобы я мог написать переносимый код R5RS?

Что я пробовал:

  • Переопределение (include "foo.scm") в (load "foo.scm") и наоборот. Проблема: Недопустимо переопределять макросы в Gambit.
  • Оборачивая указанные переопределения в файл (if gambit ...). Проблема: Недопустимо помещать определение внутри if (если только оно не находится внутри другого определения).
  • Вместо этого передача строки с именем файла во включение в файл библиотеки. Проблема: кажется, что включение в Гамбите происходит до того, как начинается интерпретация.

person Erik Vesteraas    schedule 24.02.2014    source источник


Ответы (2)


Очень сложно написать модуль, совместимый и с Gambit, и с Racket.

Действительно, есть способы протестировать конкретную реализацию и определить вещи условно. На самом деле для этого есть две системы: SRFI 0 и SRFI 7. Большинство реализаций поддерживают одно или другое. Не очень многие поддерживают и то, и другое.

Gambit поддерживает SRFI 0. Racket поддерживает SRFI 7.

person Chris Jester-Young    schedule 24.02.2014
comment
Эрику: ты выбрал этот ответ как лучший... так что ты сделал? - person Quasaur; 27.03.2014
comment
Я в значительной степени отказался от переноса кода, над которым работал, между Gambit и Racket, так как на самом деле это не было требованием для этого конкретного проекта, а просто было бы неплохо. Особенно, когда я понял, как получить то, что я хотел от Gambit в Racket (ответ на вопрос, это в настоящее время работает в терминале?). - person Erik Vesteraas; 04.04.2014

В случае, если это поможет: в Racket вы можете использовать включение в файлы r5rs:

#lang r5rs
(#%require (only racket include))
(include "foo.scm")

Если вы определите, что #%require ничего не делает в Gambit, то вы можете использовать один и тот же исходный файл в обеих реализациях.

person soegaard    schedule 25.02.2014
comment
Поскольку часть проблемы, с которой я сталкиваюсь, заключается в том, что я не могу переопределить что-то только для одного из них, я не вижу, как я могу это использовать. Я что-то пропустил? - person Erik Vesteraas; 26.02.2014
comment
Когда вы вызываете gsi, вы можете передать ему список файлов. Первый может содержать определения, специфичные для Gambit. - person soegaard; 26.02.2014
comment
Насколько я помню, рэкет имеет ту же функциональность, поэтому я мог просто сделать (define include load) в этом файле. Не люблю делать предположения о том, как работает код, но я думаю, что это самое близкое, что я получу. - person Erik Vesteraas; 01.03.2014