Как правильно использовать (читать) в мит-схеме?

Я прочитал в документации и в розетт-коде, что (read) используется для ввода с консоли. Поэтому я написал этот код, чтобы проверить это:

(display (+ (read) 1))

Но mit-scheme никогда не запрашивает пользовательский ввод, и программа просто завершается. Почему это так?


person zengod    schedule 07.09.2019    source источник
comment
Можете показать, как вы запускаете код? Вы ввели код прямо в REPL? Код в файле? Как вы запустили файл?   -  person Flux    schedule 08.09.2019


Ответы (1)


В REPL (display (+ (read) 1)) работает должным образом.

Когда (display (+ (read) 1)) помещается в исходный файл и файл запускается как сценарий с использованием mit-scheme --quiet < program.scm (ссылка), mit-scheme никогда не запрашивает ввод данных пользователем, и программа просто завершается. Почему?

Чтобы увидеть причину, поместите это вместо этого в исходный файл:

(define n (read))
2
(display (+ n 1))

Вы получите 3, как и ожидалось.

Все это вызвано перенаправлением ввода оболочки (т.е. <). read по умолчанию получает входные данные из текущего порта ввода. При перенаправлении ввода оболочки текущий порт ввода является исходным файлом. Следовательно, (read) не запрашивает ввод данных пользователем, потому что исходным файлом является stdin.

Насколько мне известно, в настоящее время нет простого способа правильно запустить сценарий MIT Scheme непосредственно из командной строки (сюрприз! Сюрприз! Схема MIT устарела). Обсуждение в соответствующем списке рассылки: [MIT-Scheme- devel] Как запустить скрипт и выйти?.

person Flux    schedule 08.09.2019