我刚刚开始学习球拍。
我有这个代码:
(定义l1‘(1 2 3 4))(车l1)(cdr l1)(车l1)返回1。(cdr l1)返回’(2 3 4)
是否有一个函数返回’(1 2 3)?…
我自己使用递归的解决方案:
#lang racket (define but-last (lambda (l) (cond ((null? (cdr l)) '()) (else (cons (car l) (but-last (cdr l)))))))
和另一种解决方案 filter-not 和 map :
filter-not
map
#lang racket (define l1 '(1 2 3 4)) (filter-not empty? (map (lambda (l i) (if (not (= i (sub1 (length l1)))) l empty)) l1 (range 0 (length l1))))
该 map 函数始终返回与其输入长度相同的列表。您想要一个比其输入短的输出列表。您正在寻找的功能传统上称为 but-last :
but-last
(define (but-last xs) (reverse (cdr (reverse xs))))
这是相当于 尼斯会很漂亮 but-last-zip 这不依赖 srfi/1 在球拍:没有 srfi/1 球拍的 map 坚持所有的论点都是相同的长度(就像 R5RS 实际上是一个版本但是在其他Lisps中常见的是函数终止于最短列表的末尾。
but-last-zip
srfi/1
此功能使用Racket for/list 并且还假设空列表的结果是空列表。
for/list
#lang racket (define (but-last-zip xs) (for/list ([x xs] [y (if (null? xs) xs (rest xs))]) x))
我认为Will的版本更纯粹:对于事物的映射函数我认为是一个非常好的事情 for/list 对我来说感觉不那么好看。这个版本的唯一优势是它不需要模块。