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

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

У меня вопрос:

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

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


person hawkeye    schedule 17.05.2012    source источник
comment
Если вы придерживаетесь стандартов R5RS и R6RS, тогда вам могут помочь языки совместимости, встроенные в Racket. См. docs.racket-lang.org/guide/standards.html   -  person dyoo    schedule 17.05.2012
comment
Не могли бы вы указать, какой язык вы объявляете в DrRacket (R5RS / racket / etc)? Не могли бы вы привести примеры того, где код ломается?   -  person robbyphillips    schedule 17.05.2012
comment
@oobivat Я намеренно охватил всю сеть - вопрос, стоящий за моим вопросом, заключается в том, что является нестандартным в хитросплетении. Если это упрощает ответ на вопрос, то я бы сформулировал его так: «Что может нарушить мой код схемы хитрости 1994 года при работе в Racket, установленном на R5RS, - и как мне это исправить?»   -  person hawkeye    schedule 18.05.2012
comment
Что ж, я мало что сделал с реализацией R5RS racket, но, немного поигравшись с ней, кажется, что не хватает большинства вещей, реализованных в SRFI. Например, нет random процедуры. Согласно этой странице кажется, что вы сможете загрузить все функциональность, которую вы хотите. К сожалению, мне не удалось найти ничего похожего на разницу между языками to.   -  person robbyphillips    schedule 18.05.2012
comment
@oobivat Если вам нужны функции srfi-1, вы можете использовать #% require для их импорта. См. Пример в ответе ниже (разрывы строк удаляются в комментариях).   -  person soegaard    schedule 18.05.2012
comment
@soegaard Да, я в курсе. Эта информация есть на странице, на которую я ссылаюсь в своем комментарии. Я думаю, что одной из трудностей при переносе кода OP будет SRFI, который хитрость реализовал изначально, но это нужно будет #%require в рэкет.   -  person robbyphillips    schedule 19.05.2012
comment
@oobivat Привет. Я думал, что ... похоже, что в SRFI не хватает большинства вещей, вы имели в виду, что srfi вообще не присутствовали в Racket. Их нет в реализации R5RS Racket, поскольку это соответствует букве стандарта и не имеет никаких дополнительных функций. Если я правильно помню, нельзя допускать даже квадратных скобок. Однако (как вы знаете) можно импортировать общие расширения с помощью #% require. С самого начала не было ясно, переносит ли Hawkeye код R5RS (который запускается в Guile) или переносит код Guile (который использует расширения Guile). Теперь я вижу, что это код 1994 года.   -  person soegaard    schedule 19.05.2012
comment
Теперь я вижу, что это код 1994 года, что означает, что это не код R5RS, а, скорее, код R4RS (поскольку R5RS вышел в 1998 году). Итак, вопрос в том, на что обращать внимание в коде R4RS! См. Обновленный ответ ниже.   -  person soegaard    schedule 19.05.2012


Ответы (1)


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

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

Чтобы перенести код из Guile в Racket, выясните, какие файлы находятся «внизу» ваших зависимостей, т. Е. Найдите файлы, не зависящие от других файлов. Откройте такой файл в Racket, добавьте строку #lang racket вверху и попробуйте запустить его.

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

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

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

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


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

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

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

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

См. Этот вопрос, чтобы узнать о других вещах, на которые следует обратить внимание:

Выполнение кода подстановки на основе правила сопоставления шаблонов SICP

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

person Community    schedule 17.05.2012
comment
Я подозреваю, что плакат мог спрашивать о языках R5RS или R6RS в DrRacket. - person Sam Tobin-Hochstadt; 17.05.2012
comment
Спасибо, Сэм, я рыскал по сети, чтобы получить всю возможную информацию. Я думаю, вы говорите, что приведенный выше комментарий относится к Racket и не относится к R5RS. - person hawkeye; 18.05.2012