Лучший способ сделать ввод с ракеткой? - PullRequest
6 голосов
/ 14 ноября 2011

Каков наилучший способ чтения ввода из stdin в ракетке?

В частности, я бы хотел что-то вроде cin из c ++ или scanf из c, где я определяю типы вещей, которые я хочу прочитатьи они возвращаются.

Ответы [ 3 ]

8 голосов
/ 15 ноября 2011

Вы можете делать почти все, что хотите ... на низком уровне, я бы предложил (read-line) и (read-bytes). Для обработки более высокого уровня (как, например, scanf) я бы предложил регулярное выражение на входе. Например

(regexp-match #px" *([0-9]+)" (current-input-port))
6 голосов
/ 19 января 2014

read-line легко.Для переносимости через Unix и Windows требуется дополнительная опция.

(read-line (current-input-port) 'any)

Символы возврата и перевода строки обнаруживаются после преобразований, которые автоматически выполняются при чтении файла в текстовом режиме.Например, чтение файла в текстовом режиме в Windows автоматически меняет комбинации возврата и перевода строки на перевод строки.Таким образом, когда файл открывается в текстовом режиме, «перевод строки обычно является подходящим режимом чтения-строки.

Итак, любой должен быть переносимым, если порт ввода не является файлом (стандартныйinput).

Тестовая программа:

#lang racket
(let loop ()
    (display "Input: ")
    (define a (read-line (current-input-port) 'any))
    (printf "input: ~a, length: ~a, last character: ~a\n"
        a
        (string-length a)
        (char->integer (string-ref a (- (string-length a) 1))))
    (loop))

В Windows замените (read-line (current-input-port) 'any) на (read-line) и посмотрите, что произойдет.

2 голосов
/ 14 ноября 2011

Я бы использовал read процедуру для общего случая. Если тип данных для чтения известен заранее, используйте read-char, read-string, read-bytes.

Кроме того, взгляните на эту реализацию для чтения форматированного ввода - scanf в Схеме.

...