Scheme 在chez格式中使用匹配
我正在努力学习如何在scheme中使用match。我有点理解它是如何处理非常短的问题(即:定义长度仅为两行)的,但不理解有多个输入和辅助程序的问题。例如,这里有一种定义联合的流行方式:Scheme 在chez格式中使用匹配,scheme,match,chez-scheme,Scheme,Match,Chez Scheme,我正在努力学习如何在scheme中使用match。我有点理解它是如何处理非常短的问题(即:定义长度仅为两行)的,但不理解有多个输入和辅助程序的问题。例如,这里有一种定义联合的流行方式: (define ele? (lambda (ele ls) (cond [(null? ls) #f] [(eq? ele (car ls)) #t] [else (ele? ele (cdr ls))]))) (define union (lambda (ls1 ls2)
(define ele?
(lambda (ele ls)
(cond
[(null? ls) #f]
[(eq? ele (car ls)) #t]
[else (ele? ele (cdr ls))])))
(define union
(lambda (ls1 ls2)
(cond
[(null? ls2) ls1]
[(ele? (car ls2) ls1) (union ls1 (cdr ls2))]
[else (union (cons (car ls2) ls1) (cdr ls2))])))
在这两个程序中如何使用match?(或者你甚至需要两个程序吗?第一个程序可以这样实现:
(define ele?
(lambda (a b)
(let ((isa? (lambda (x) (eq? (car x) a))))
(match b [(? null?) #f]
[(? isa?) #t]
[_ (ele? a (cdr b))]))))
那么第二个就容易了
(define uni
(lambda (ls1 ls2)
(let ((carinls2? (lambda (x) (ele? (car x) ls1))))
(match ls2 [(? null?) ls1]
[(? carinls2?) (uni ls1 (cdr ls2))]
[_ (uni (cons (car ls2) ls1) (cdr ls2))]))))
也许有一个更聪明的方法来避免这一争论(让兰博达斯说吧,但我仍在学习;) 第一个可以这样实现:
(define ele?
(lambda (a b)
(let ((isa? (lambda (x) (eq? (car x) a))))
(match b [(? null?) #f]
[(? isa?) #t]
[_ (ele? a (cdr b))]))))
那么第二个就容易了
(define uni
(lambda (ls1 ls2)
(let ((carinls2? (lambda (x) (ele? (car x) ls1))))
(match ls2 [(? null?) ls1]
[(? carinls2?) (uni ls1 (cdr ls2))]
[_ (uni (cons (car ls2) ls1) (cdr ls2))]))))
也许有一个更聪明的方法来避免这一争论(让兰博达斯说吧,但我仍在学习;)