【问题标题】:chicken-scheme - how does one read all the lines passed in via standard input?chicken-scheme - 如何读取通过标准输入传入的所有行?
【发布时间】:2015-09-18 02:23:15
【问题描述】:

我正在尝试读取通过标准输入传递给鸡计划脚本的所有行,并将它们放入列表中,但我似乎无法正确确定何时命中输入的结尾。另一个测试脚本似乎表明测试(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)))

【问题讨论】:

    标签: command-line-interface chicken-scheme


    【解决方案1】:

    问题是您在递归调用中传递了 procedure 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))))
    

    当然,您也可以在read-from-stdin 中致电(reverse collection)

    【讨论】:

    • 非常感谢。我清理了我的示例以删除r3,然后在您的序言中删除了对它的引用。
    【解决方案2】:

    我喜欢为此使用read-lines。 这是您使用它编写的程序:

    #!/usr/local/bin/csi -script
    (for-each print (read-lines))
    

    经过测试和工作。 对于 csc,将 #!-line 替换为 (use extras)

    【讨论】:

    • 这不是我们希望在 Stack Overflow 上看到的那种完整而彻底的答案。请咨询 help section 以获取有关回答问题的指导,我鼓励您在完成后返回并扩展此答案。
    • 供参考,答案原为:“我喜欢为此使用read-lines。”真的不知道要添加什么?这正是提问者试图编写的程序。只需使用它或查看它。我明确地添加了要写的内容,但是……你们不觉得这有点矫枉过正吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2022-12-03
    • 2011-06-02
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    相关资源
    最近更新 更多