gpt4 book ai didi

file-io - 使用Scheme从文件中读取

转载 作者:行者123 更新时间:2023-12-02 16:49:11 25 4
gpt4 key购买 nike

我正在尝试使用方案读取文件,并将其内容放入列表中。

问题是如何去掉问号、数字,只保留文字。我应该每次都使用循环来检查吗?如果不是这样,我怎样才能从“read”中获取下一个单词的内容?

我尝试使用此代码解决它,但在到达文件末尾之前我找不到调用“read”的方法;

(define Project
(lambda (fileName)
(if (null? fileName)
'error
(readNext (open fileName) '()))))

(define readNext
(lambda (fc tmp)
(if (null? (read fc) "#<eof>")
tmp
(readNext fc (cons (read fc) tmp)))))

最佳答案

导入文本的最推荐方法是编辑文件并将其保存为定义变量的方案文件:

(define data "the text in
mydata.scm here")

然后调用:

(load "mydata.scm")

很多时候,并不是每个数据文件都可以编辑并保存为方案文件,虽然换行符会自动转义,但双引号不能,这会在加载文件时产生问题。

一些特定于实现的技术是:

;Chicken
(use utils)
(read-all "mydata.txt")

;Racket
(file->string "mydata.txt")

更便携的函数是:

;works in chicken-csi and Racket
(define (readlines filename)
(call-with-input-file filename
(lambda (p)
(let loop ((line (read-line p))
(result '()))
(if (eof-object? line)
(reverse result)
(loop (read-line p) (cons line result)))))))

由于读取行需要额外的文件,运行已编译的 Chicken-csc 可执行文件将出现错误。

读取文件最便携的方法是这个函数:

;works in Chicken, Racket, SISC
;Read a file to a list of chars
(define (file->char_list path)
(call-with-input-file path
(lambda (input-port)
(let loop ((x (read-char input-port)))
(cond
((eof-object? x) '())
(#t (begin (cons x (loop (read-char input-port))))))))))

此函数速度相当快,并且可以跨实现移植。所需要做的就是将 char_list 转换为字符串。

最简单的方法是:

;may not work if there is limit on arguments
(apply string (file->char_list "mydata.txt"))

问题是某些实现对可以传递给函数的参数数量有限制。 2049 个字符的列表在 Chicken 中不起作用。

另一种方法是:

;works in Chicken, Racket
(foldr (lambda (x y) (string-append (string x) y)) "" (file->char_list "mydata.txt"))

问题是:首先,foldr 没有得到普遍认可(SISC),尽管它可以被定义。其次,由于附加每个字符,此方法非常慢。

我编写了接下来的两个函数,将字符列表分割成嵌套列表,直到最低级别不会超过 Chicken 中的最大参数计数。第三个函数遍历嵌套的字符列表并使用字符串string-append返回一个字符串:

(define (cleave_at n a)
(cond
((null? a) '())
((zero? n) (list '() a))
(#t
((lambda (x)
(cons (cons (car a) (car x)) (cdr x)))
(cleave_at (- n 1) (cdr a))))))

(define (cleave_binary_nest n a)
(cond
((equal? n (length a)) (list a))
(#t
((lambda (x)
(cond
((> (length (car x)) n) (map (lambda (y) (cleave_binary_nest n y)) x))
(#t x)))
(cleave_at (floor (/ (length a) 2)) a)))))

(define (binary_nest_char->string a)
(cond
((null? a) "")
((char? (car a)) (apply string a))
(#t (string-append
(binary_nest_char->string (car a)) (binary_nest_char->string (cdr a))))))

该函数的调用方式如下:

;Works in Racket, Chicken, SISC
;faster than foldr method (3x faster interpreted Chicken) (30x faster compiled Chicken) (125x faster Racket gui)
(binary_nest_char->string (cleave_binary_nest 2048 (file->char_list "mydata.txt")))

为了减少字母字符和空格,还有两个函数:

(define (alphaspace? x)
(cond
((and (char-ci>=? x #\a) (char-ci<=? x #\z)) #t)
((equal? x #\space) #t)
(#t #f)))

(define (filter pred lis)
; if lis is empty
(if (null? lis)
; return an empty list
'()
; otherwise, if the predicate is true on the first element
(if (pred (car lis))
; return the first element concatenated with the
; result of calling filter on the rest of lis
(cons (car lis) (filter pred (cdr lis)))
; otherwise (if the predicate was false) just
; return the result of filtering the rest of lis
(filter pred (cdr lis)))))

(define data (file->char_list "mydata.txt"))
(define data_alphaspace (filter alphaspace? data))
(define result (binary_nest_char->string (cleave_binary_nest 2048 data_alphaspace)))

这适用于 Racket、Chicken(解释和编译)和 SISC (Java)。这些方言中的每一种都应该适用于 Linux、Mac (OS X) 和 Windows。

关于file-io - 使用Scheme从文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16335454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com