Scheme 方案返回列表中的对
嗨,我收到错误mcar:违反合同预期:mpair?给定:()运行这些代码时:Scheme 方案返回列表中的对,scheme,racket,Scheme,Racket,嗨,我收到错误mcar:违反合同预期:mpair?给定:()运行这些代码时: (define helpy (lambda (y listz) (map (lambda (z) (list y z)) listz))) (define print (lambda (listy) (cond ((null? list) (newline)) (#t (helpy (car listy) (cdr listy))
(define helpy
(lambda (y listz)
(map (lambda (z) (list y z))
listz)))
(define print
(lambda (listy)
(cond
((null? list) (newline))
(#t (helpy (car listy) (cdr listy))
(print (cdr listy))))))
我的代码正在尝试返回列表中的对。例如,当我打电话时
(print'(ab c))
它应该返回((ab)(ac)(bc))
我只是修复并更新我的代码,现在它不会返回错误,但在运行这些代码时,我只能获得pair((ab)(ac):
(定义helpy)
(lambda(y listz)
(地图(lambda(z)(列表y-z))
(列表Z)
(定义打印)
(兰姆达(利斯蒂)
(续)
((空?列表)(新行))
(#t(helpy(car listy)(cdr listy)))
我认为我的递归有问题,代码有几个问题。首先,按照惯例,“else”
cond
的子句应该以else
开头,而不是#t
。其次,print
中的null?
测试应该接收listy
,而不是list
。第三,你对print
中的helpy
返回的结果没有做任何事情,你只是在推进print
在当前列表的cdr
上执行,而不对递归调用返回的值执行任何操作。请尝试以下操作:
(define print
(lambda (listy)
(cond
((null? listy) (newline))
(else
(displayln (helpy (car listy) (cdr listy)))
(print (cdr listy))))))
displayln
只是一个示例,如果需要,可以对返回的结果执行其他操作。我尝试这样实现:
#lang racket
(define data '(a b c d))
(define (one-list head line-list)
(if (null? line-list)
null
(cons
(cons head (car line-list))
(one-list head (rest line-list)))))
(letrec ([deal-data
(lambda (data)
(if (null? data)
'()
(append
(one-list (car data) (rest data))
(deal-data (rest data)))))])
(deal-data data))
运行结果:
'((a . b) (a . c) (a . d) (b . c) (b . d) (c . d))
cond的最后一个子句应以else开头,而不是以t开头.真的吗?我没有写太多scheme,但我认为这是一种没有普遍共识的文体。@amalloy
#t
可以工作,但这不是通常的编写方式-这更像是一种常见的Lisp约定,而不是scheme的@scarLópez:谢谢你,racket无法在你的代码中定义术语displayln,我会更新我的代码,现在它不返回错误,但我只能得到(ab)(ac)对而不是(ab)(ac)(bc),我认为它与递归有问题???Daniel尝试使用display
然后。上面的代码使用语言@lang Racket
在Racket中进行测试,并打印结果@scarLópez:你有什么想法,我可以扩展函数print,例如我使用(print'((a b c)(b d e)运行print,它可以返回((a b)(a c)(b c)(b d)(b e)(d e)
'((a . b) (a . c) (a . d) (b . c) (b . d) (c . d))