以下get_file
函数从磁盘读取文件作为 Scheme R6RS 字符串:
; Gets all characters from a port
(define (read_chars_from_port_rev port result)
(let ((char (read-char port)))
(if (eof-object? char)
result
(read_chars_from_port_rev port (cons char result)))))
; Gets the contents of a file as a string
; If it doesn't exist, returns empty
(define (get_file file)
(if (file-exists? file)
(let ((port (open-input-file file)))
(let ((text (list->string (reverse (read_chars_from_port_rev port '())))))
(begin
(close-input-port port)
text)))
""))
它的工作原理是打开文件,尾调用递归地逐个字符读取链表,直到我们找到 eof,关闭文件,然后反转链表(因为尾调用)并将其转换为字符串.
与 Node.js 相比,这个过程应该很慢readFile
,因为它逐个字符地读取字符,并为文件中的每个字符分配一个包含一个单元格的链表。理想情况下,我们应该能够将文件作为字符串缓冲区读取,而无需动态内存分配。
有没有办法get_file
使用 R6RS 中可用的原语进行优化?