Различия между схемой Guile и стандартной схемой (в Racket IDE)?

У меня есть куча "старого" кода Guile Scheme, который я хочу запустить в Racket Scheme IDE. Кажется, что существует достаточно различий, чтобы сделать это нетривиальным упражнением. (Мой уровень знаний Scheme - это уровень, чтобы завершить The Little Schemer).

Мой вопрос:

  • В чем разница между схемой Guile и стандартной схемой (в Racket IDE)?
  • В свете этих различий, в общем, каковы шаги, которые мне нужно предпринять, чтобы преобразовать код схемы Guile в стандартную схему?

Дополнительно: (доволен расхождением между Racket Scheme и R5RS/R6RS) - я хочу, чтобы "что-то" запускалось в Racket IDE, а не на языке Racket.

Ответ 1

Если в разделе "Стандартная схема (в Racket IDE)" вы имеете в виду язык Racket, то есть, что вы получаете, когда вы префикс кода #lang racket,, тогда четыре лучших отличия, которые нужно обратить внимание:

  • другая система модулей
  • другая макросистема (в зависимости от того, сколько лет ваш код)
  • неизменяемые cons-cells (если вы не импортируете изменчивые)
  • no-one-arm ifs in Racket (используйте when)

В код порта от Guile to Racket найдите, какие файлы находятся в нижней части ваших зависимостей, то есть найдите файлы, которые не зависят от других файлов. Откройте такой файл в Racket, добавьте строку #lang racket вверху и попробуйте запустить его.

Скорее всего, вы столкнетесь с некоторыми ошибками "несвязанного идентификатора". Если вам повезет, функция присутствует в Racket, но не включена в язык "ракетки". Найдите имя в документации Racket, и если вы его найдете, используйте (require...) для импорта имени в вашу программу.

Затем запустите программу еще раз, чтобы найти следующую ошибку.

Некоторые функции называются по-разному в Guile и Racket, поэтому найдите имя в документации Guile и посмотрите, что он делает. Затем откройте документацию Ракетки по тому же вопросу и посмотрите, что она вызывается в Racket.

В некоторых случаях вам, возможно, придется внести большие изменения. Если вы не можете найти какую-либо функциональность в документации Racket, попробуйте запросить список рассылки. Может быть, у него просто другое имя или что кто-то его реализовал и положил на PLaneT (таким образом, он не появится в документацию, пока вы не установили пакет).


Пример импорта srfi/1 в язык R5RS.

#lang r5rs
(#%require srfi/1)
(xcons 1 2)

Отличия от кода R4RS до современной схемы?

Одна вещь, которую нужно обратить внимание, заключается в том, что в R4RS пустой список '() считается ложным, а не интерпретируется как истинный.

Посмотрите на этот вопрос, чтобы узнать больше:

Запуск кода замены на основе правил SICP, основанного на правилах

См. также этот список изменений из стандарта R5RS: Список изменений от R4RS до R5RS