You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIT Scheme从标准输入读取时eof-object?行为异常问题咨询

问题原因

在MacOS的MIT Scheme 12.1 batch模式下,当标准输入来自管道时,解释器会将输入流视为待执行的Scheme代码源。当脚本用read-line读取完管道的所有内容后,解释器检测到输入流EOF,会直接终止进程,不会继续执行脚本中剩余的代码逻辑(如输出Inner和Done)。而读取普通文件时,文件的EOF仅表示数据读取完毕,不会触发解释器的提前终止。

解决方案

方案1:使用文件重定向替代管道

将管道替换为标准输入重定向,让解释器将输入视为普通文件处理,行为会和Case1完全一致:

scheme --batch-mode --load "./rw_io.scm" --eval '(exit 1)' < /tmp/L.txt

方案2:修改脚本为单一表达式结构

将脚本的所有代码包裹在begin块中,确保解释器会执行完整的代码逻辑,即使读取到EOF也不会提前终止:

(begin
  (display "Outer\n")
  (let loop ()
    (let ((line (read-line)))
      (if (not (eof-object? line))
          (begin
            (display line)
            (newline)
            (loop))
          (display "Inner\n"))))
  (display "Done\n"))

方案3:显式封装读取逻辑

将读取逻辑封装为独立过程,明确控制执行流,避免被EOF中断:

(define (process-input port)
  (let loop ()
    (let ((line (read-line port)))
      (if (not (eof-object? line))
          (begin
            (display line)
            (newline)
            (loop))
          (display "Inner\n")))))

(display "Outer\n")
(process-input (current-input-port))
(display "Done\n")

验证说明

测试上述修改后的脚本或调用方式,读取管道输入后,Inner、Done等后续代码都会正常执行,与读取普通文件的行为完全一致。

内容的提问来源于stack exchange,提问作者Paul Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:15:16