2015-03-10 3 views
2

Я пишу программу, в которой я должен повторно использовать код от одного из моих профессоров. Моя программа написана в Racket, а код, который я хочу использовать повторно, написан на r6rs.Списки раскладок, несовместимые с r6rs?

Когда я хочу протестировать свою программу, он всегда терпит неудачу. Это потому, что я вызываю процедуру с аргументом как список (список ракет), но эта процедура находится в файле R6RS. В файле R6RS есть (assert (list? argument)), это всегда ложь ...

Вот простой пример: ракетка код:

#lang racket 
(require "test2.ss") 

(define a (list 1 2 3)) 
(b a) 

R6RS код:

#!r6rs 

(library 
(test) 
(export b) 
(import (rnrs base (6)) 
     (rnrs control (6)) 
     (rnrs lists (6)) 
     (rnrs io simple (6))) 

(define (b a) 
    (display "a is : ") (display a) (newline) 
    (display "list? : ") (display (list? a)) (newline))) 

Испытание list? в файле R6RS всегда ложь ... даже если я передаю в качестве аргумента вновь созданный список, как в приведенном выше примере.

Как я могу сделать то же, что и в приведенном выше примере, так что результаты тестов list? истинны.

Благодарим за помощь!

EDIT: Я не смог найти тест r6rs, результатом которого является true в неизменяемом списке, но я нашел другой способ решить мою проблему (передав измененный список в процедуру).

+0

Ракетные пары неизменяемы, пары схем не являются, следовательно, несоответствием. –

+0

Действительно, существует ли еще один тест на Схеме, который будет иметь место при тестировании в неизменном списке? Потому что я не могу его найти .. – HyperZ

ответ

3

Racket пары отличаются от пар Схемы, поскольку пары Racket неизменяемы, а пары Scheme - нет.

Насколько я знаю, нет возможности проверить неизменяемые списки Racket в чистом R n Схема RS. Тем не менее, это is можно использовать изменяемые списки Scheme в Racket (хотя, конечно, это не рекомендуется).

#lang racket 

(require compatibility/mlist 
     "test2.ss") 

(define a (mlist 1 2 3)) 
(b a) 

Вот отрывок из documentation for compatibility/mlist:

Эта compatibility/mlist библиотека обеспечивает поддержку изменяемых списков. Поддержка предоставляется в первую очередь для поддержки переноса кода Lisp/Scheme в Racket.

Использование изменяемых списков для современного кода Ракетка сильно обескуражен. Вместо этого рассмотрите использование списков.

Тем не менее, если вам нужно взаимодействовать с кодом схемы, это, вероятно, ваш единственный разумный вариант.

2

Это просто добавление к ответу Алексиса Кинга (примеры кода не могут быть в комментариях). Поскольку язык r6rs (как реализован в Racket) использует изменчивые списки, а все библиотеки racket ожидают неизменные списки, вы не можете повторно использовать код r6rs как есть. Самый быстрый способ повторного использования кода - переносить его на язык #lang racket.

Измените язык, удалите оператор импорта, а затем исправьте каждую ошибку по одной за раз.

#lang racket 

(define (b a) 
    (display "a is : ") (display a) (newline) 
    (display "list? : ") (display (list? a)) (newline))) 
1

Когда вы говорите, что ваш код написан в Racket. Вы имеете в виду Racket, программное обеспечение или #!racket, один из нескольких совместимых языков, поддерживаемых Racket (программным обеспечением)?

Поскольку ваша библиотека написана в #!r6rs, вам либо нужно поместить ее в модуль #!racket, либо вы можете записать основную программу в #!r6rs, и вы можете использовать библиотеку как есть. Третий вариант состоит в том, чтобы сделать изменяемые списки, чтобы перейти к библиотечной функции и преобразовать обратно, но или запретить списки всех togerther, но я считаю этот вариант несколько субоптимальным.

Для полной #!r6rs вам необходимо установить вашу библиотеку так:

plt-r6rs --force --install ./test.sls 

Я предполагаю, что test.sls находится в текущем каталоге. Вы получите подтверждение. вам не нужно перезагружать DrRacket. (. Сила не нужна, но она будет перезаписывать более раннюю версию) Тогда вы просто изменить код, чтобы быть Scheme код:

#!r6rs 
(import (rnrs) 
     (test)) 

(define a (list 1 2 3)) 
(b a) ; #<void> (and prints stuff to stdout) 

Hit [Run] в DrRacket и увидеть волшебство!

 Смежные вопросы

  • Нет связанных вопросов^_^