列表中的元素数量是否有限制?我用以下代码读了一个文件
(define output_collector
(let ((p (open-input-file filename_collector)))
(let f ((x (read p)))
(if (eof-object? x)
(begin
(close-input-port p)
'())
(cons x (f (read p)))))))
如果在我的文件中有168行,例如这一行
3600 20.4
然后一切正常,但如果有1200行,则存在问题。
有什么想法吗?
由于
答案 0 :(得分:2)
您必须更具体,但您可能会遇到堆栈溢出。要解决此问题,您需要使用累加器。以下应该有效:
(define output_collector
(let ((p (open-input-file filename_collector)))
(let f ((x (read p)) (acc '()))
(if (eof-object? x)
(begin
(close-input-port p)
(reverse acc))
(f (read p) (cons x acc))))))
答案 1 :(得分:0)
如果我们假设您在63位(嵌入指针)和浮点(两个单词)中有一个整数的行,并且利弊使用3个单词(大多数使用2个),则1200行的总空间量将是(* 1200 (* (+ 0 2 3) 8)) ;==> 48000 (Bytes)
。对于仅使用指向所有内容的指针的实现将是大约两倍,并且它仍然不是很可怕。
在Ikarus和DrRacket中使用1200行增加整数和浮点数的文件运行代码时,我没有任何问题。 time
报告使用了一毫秒来完成此操作。您可以尝试使用下面的迭代替换您的递归,只是为了确保它不是一个堆栈溢出导致您的问题,但说实话,我认为您需要添加有关您获得的特定错误的更多信息。
;; Iterative version. Just for kicks
(define output_collector
(with-input-from-file
filename_collector
(lambda ()
(let f ((x (read))(acc '()))
(if (eof-object? x)
(reverse acc)
(f (read) (cons x acc)))))))