Куриная схема - как прочитать все строки, переданные через стандартный ввод?

Я пытаюсь прочитать все строки из того, что было передано в скрипт куриной схемы через стандартный вход, и поместить их в список, но мне кажется, что я не могу правильно определить, когда наступил конец вход. Похоже, что другой тестовый скрипт указывает на (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),

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