Нужно ли использовать дисплей для вывода материала с использованием 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, конечно.)