Нужно ли использовать дисплей для вывода материала с использованием r6rs?

Предыстория: я новичок в схеме и использую DrScheme для написания своих программ.

Следующая программа выводит 12345, когда я запускаю программу как r5rs:

12345

Однако следующая программа ничего не выводит (это программа r6rs):

#!r6rs
(import (rnrs))

12345

При этом, я могу получить его для вывода 12345, выполнив это:

#!r6rs
(import (rnrs))

(display 1235)

Это что-то новое с r6rs, где вывод происходит только тогда, когда специально указано с помощью display? Или я просто что-то не так делаю

1 ответ

Решение

Это тонкая проблема, которую вы видите здесь. В PLT предпочтительным режимом работы является написание кода в модуле, где каждый модуль имеет спецификацию языка, на котором он написан. Обычно язык по умолчанию #lang scheme (а также #! коротка для #lang). На этом языке поведение позволяет всем вышестоящим выражениям без определения отображать свои значения (если они не имеют значения - как в результате большинства побочных эффектов). Но #lang r5rs а также #lang r6rs не делайте то же самое - поэтому эти выражения верхнего уровня оцениваются, но никогда не отображаются.

Причина, по которой вы увидели некоторый вывод на языке R5RS, заключается в том, что вы не использовали его в качестве "модуля" (как в #lang r5rs), но вместо этого использовался конкретный R5RS "языковой уровень". Этот уровень языка более совместим с R5RS, но по различным тонким причинам это не очень хорошая идея в целом. С помощью #lang Поэтому, как правило, лучше, и если вы хотите сэкономить некоторые дополнительные избыточные головные боли, будет легче, если вы будете придерживаться #lang scheme на данный момент, и беспокоиться о стандартах позже. (Но YMMV, конечно.)

Другие вопросы по тегам