Scheme中如何引用输入文件列表及执行标准列表操作?
嘿,你已经成功从文件里读出列表'(1 2 3)啦,这第一步做得相当漂亮!接下来咱们就聊聊怎么用Scheme的标准操作来处理这个列表——不管是基础的序对操作,还是更实用的列表处理工具,都给你捋清楚:
基础序对操作(针对列表的核心结构)
Scheme里的列表本质是嵌套的序对(cons单元),所以这些基础操作是一切列表处理的核心:
car: 提取列表的第一个元素(car '(1 2 3)) ; 结果是 1cdr: 获取列表去掉第一个元素后的剩余部分(也就是列表的“尾巴”)(cdr '(1 2 3)) ; 结果是 '(2 3)cons: 把一个元素加到列表的开头,生成全新的列表(原列表不会被修改)(cons 0 '(1 2 3)) ; 结果是 '(0 1 2 3)
常用列表工具操作
除了基础的序对操作,Scheme标准库还提供了一堆现成的工具,能帮你快速处理列表:
length: 计算列表的元素个数(length '(1 2 3)) ; 结果是 3append: 把多个列表拼接成一个新列表(append '(1 2 3) '(4 5)) ; 结果是 '(1 2 3 4 5)map: 对列表里的每个元素应用同一个函数,返回处理后的新列表(map (lambda (x) (* x 2)) '(1 2 3)) ; 结果是 '(2 4 6)filter: 筛选出列表中符合条件的元素,返回新列表(filter (lambda (x) (> x 1)) '(1 2 3)) ; 结果是 '(2 3)foldl/foldr: 对列表进行“折叠”操作,用来做累加、聚合这类逻辑(foldl + 0 '(1 2 3)) ; 从左到右累加,结果是 6 (foldr + 0 '(1 2 3)) ; 从右到左累加,这里结果和foldl一致
自己写递归处理列表
如果你想像读取文件那样,用递归逻辑手动处理列表,比如遍历每个元素做自定义操作,可以参考这个例子(比如打印所有元素):
(define (process-list lst) (if (null? lst) ; 判断列表是否为空 (display "处理完毕!") (begin (display (car lst)) ; 处理当前第一个元素 (newline) (process-list (cdr lst)) ; 递归处理剩余元素 ))) (process-list '(1 2 3)) ; 输出: ; 1 ; 2 ; 3 ; 处理完毕!
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

