Scheme 方案返回列表中的对

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))

嗨,我收到错误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))
          (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))