Куриная схема - как прочитать все строки, переданные через стандартный ввод?
Я пытаюсь прочитать все строки из того, что было передано в скрипт куриной схемы через стандартный вход, и поместить их в список, но мне кажется, что я не могу правильно определить, когда наступил конец вход. Похоже, что другой тестовый скрипт указывает на (eof-object? results-of-last-read-line-call)
Это был законный тест, но в приведенном ниже примере он просто бесконечно читает.
Я собрал следующий тестовый скрипт. Я звоню с cat some_file.txt | this_script.scm
#! /usr/local/bin/csi -script
(define (read-from-stdin collection line)
(if (eof-object? line) ; bad test?
collection
(read-from-stdin (cons collection line) read-line)
) ; yes, i know atypical formatting. Done so you can see they're all there
)
(for-each print (read-from-stdin '() (read-line)))
2 ответа
Проблема в том, что вы проходите процедуру read-line
в рекурсивном вызове. Это приводит к тому, что тест всегда терпит неудачу (потому что процедура никогда не eof-object
). Вместо этого вы, вероятно, хотите позвонить read-line
и передайте строку строки:
(define (read-from-stdin collection line)
(if (eof-object? line) ; the test is fine
collection
(read-from-stdin (cons collection line) (read-line))))
(for-each print (read-from-stdin '() (read-line)))
Вы также звонили cons
с обратными аргументами, так что я это тоже исправил. Возможно, это была попытка добавить строки в обратном порядке? Вместо этого вы, вероятно, захотите повернуть вспять строки в конце, так что вы получите
(for-each print (reverse (read-from-stdin '() (read-line))))
Или, конечно, вы могли бы позвонить (reverse collection)
в read-from-stdin
,
Я люблю использовать read-lines
за это. Вот ваша программа написана с использованием этого:
#!/usr/local/bin/csi -script
(for-each print (read-lines))
Проверено и работает. Для csc замените строку #! На (use extras)
,