列表中的列表作为空列表传递 - 球拍

A list within a list is being passed as an empty list - Racket

我遇到了一个小问题。

假设我有一个列表列表,例如:

(define x '(("1" "one" "two" "2" "three") 
            ("2" "four" "five" "0" "six") 
            ("3" "seven" "eight" "4" "nine") 
            ("4" "ten" "eleven" "2" "twelve")))

所以我想做的是获取每个列表,并使每个列表中的元素成为一个字符串,例如:

“1一二2三”
"2 四五 0 六" ...

我设计了这些功能:

(define (get-sublista-from-lista lista)
  (if (list? (car lista))
      (car lista)
      lista))  

和:

(define (string-from-lista lista)
  (define (list-to-string lista str)
    (if (null? (cdr lista))
        (string-append str (car lista))
        (list-to-string (cdr lista)
                        (string-append str (car lista) " "))))
  (list-to-string lista ""))  

它们自己可以正常工作。但是每当我尝试将其中两个或其中一个与另一个组合时,例如:

(define (string-from-lista1 lista)
  (define (list-to-string lista str)
    (if (null? (get-sublista-from-lista lista))
        (string-append str (car (get-sublista-from-lista lista)))
        (list-to-string (cdr (get-sublista-from-lista lista))
                        (string-append str (car (get-sublista-from-lista lista)) ""))))
  (list-to-string lista ""))

然后主列表中的各个列表作为 '() 传递,导致违反合同,例如:

car: contract violation
  expected: pair?
  given: '()  

有人可以解释为什么我会收到这样的错误吗?

内置函数 string-join 用于将列表中的不同字符串连接成一个字符串,由默认字符 space 分隔。使用 map 将它应用于列表 x 的所有成员,您将有一个简短的代码来完成此任务:

(map string-join x)

输出:

'("1 one two 2 three" "2 four five 0 six" "3 seven eight 4 nine" "4 ten eleven 2 twelve")