Написание кода переносимой схемы

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

Мои вопросы:

  1. Какие разрешения должны быть предоставлены моей программе?
  2. Есть ли компилятор, который может скомпилировать мою программу Scheme в исполняемый файл для систем Unix или Windows?

Заранее спасибо Примечание: я работаю в Ubuntu


person Anas Tiour    schedule 23.05.2015    source источник
comment
comment
@AlexisKing Я не согласен. Этот вопрос строго касается переносимости между реализациями Scheme и понятности для программистов Schemer, в то время как этого спрашивающего, похоже, больше интересует переносимость между машинами и способность конечных пользователей запускать код. Последняя форма переносимости — это совершенно другой вопрос, чем переносимость между (например) Guile и MIT Scheme.   -  person Throw Away Account    schedule 23.05.2015
comment
@TAnas Какую переносимость вы имеете в виду? Переносимость между реализациями Scheme или между платформами (Windows, OS X, Linux и т. д.). Если более поздняя Racket - хороший выбор.   -  person soegaard    schedule 23.05.2015
comment
Я пытаюсь добиться переносимости, когда мой код может выполняться на разных платформах (Windows, Linux...)   -  person Anas Tiour    schedule 24.05.2015


Ответы (1)


Написание стандартной схемы накладывает строгие ограничения на то, что вы можете делать. Стандарт R5RS очень мал и не включает такие базовые вещи, как обработка ошибок или даже определение того, на каком компиляторе/интерпретаторе работает ваш код. Стандарт R6RS более обширен, но не получил широкого распространения. Поэтому написать программу Scheme, которая будет работать на любом интерпретаторе или компиляторе Scheme, установленном на машине пользователя, сложно.

Однако это не имеет большого значения, потому что Scheme широко не установлена. Скорее всего, у вашего конечного пользователя не будет установлен какой-либо интерпретатор Scheme, кроме, может быть, под видом libguile, но это библиотека C.

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

Компилятор Chicken Scheme создает небольшие исполняемые файлы и предназначен для работы как в Windows, так и в Unix. Однако я использовал его только в Linux.

В коммерческой Chez Scheme также есть компилятор, который создает исполняемые файлы как для Windows, так и для Linux, но я никогда не использовал версия Chez Scheme на любой платформе.

Racket может создавать исполняемые файлы для Windows, Linux и MacOS. Однако язык значительно отличается от Scheme. Например, списки неизменяемы в Racket. Racket имеет большую библиотеку, которая включает в себя такие вещи, как сетевые и графические интерфейсы, полностью переносимые между операционными системами. Компилятор создает большие исполняемые файлы.

SISC работает на JVM, что делает его переносимым на все, на чем работает Java. Однако это интерпретатор, а не компилятор.

Все вышеперечисленное имеет внешние функциональные интерфейсы с C (или с Java в случае SISC).

person Throw Away Account    schedule 23.05.2015
comment
Вы можете писать как стандартные R5RS, так и R6RS, использовать SRFI и при этом компилировать с помощью Racket. Вы можете использовать библиотеки рэкета, которые не включают пары из #!racket, но тогда вам придется реализовать их, чтобы переместить свой код в другую реализацию. Gambit также компилируется в c, как и Chicken. - person Sylwester; 24.05.2015
comment
@Sylwester Нет необходимости наносить вред вашей программе, соответствуя R5RS, если вы используете Racket. Ракетка сама по себе очень портативна. - person Throw Away Account; 24.05.2015
comment
Действительно лучше соответствовать стандарту. Когда Пол Грэм внедрил Arc, он сломался, потому что Racket внезапно решил сделать пары неизменяемыми. У вас нет гарантии, что Racket не сделает то же самое снова и не перестанет поддерживать что-то или не изменит семантику. Использование R6RS оставляет двери открытыми для перехода на Ikarus или другие совместимые реализации R6RS. То, чего у вас нет с помощью R6RS и SRFI, вы можете обернуть из #!racket, поэтому совершенно ясно, что вам нужно переделать. - person Sylwester; 24.05.2015