2016-11-15 2 views
1

У меня тут проблема.Список в списке передается как пустой список - 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 четыре пять шесть 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 "")) 

Затем отдельные списки в рамках мастер-списки передаются как «(), что приводит к нарушению контракта такого as:

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

Может кто-нибудь объяснить, почему я получаю такую ​​ошибку?

+0

Я могу попытаться дать ответ вещий. Пинг меня, если это поможет. –

+0

Они работают правильно сами по себе, но не вместе? Пожалуйста, уточните, что произойдет. Что они «делают», когда выполняются сами по себе, и что происходит, когда вы пытаетесь сделать их вместе? –

+0

Я знаю, что он не отвечает на ваш вопрос напрямую, но вы можете использовать встроенные модули, чтобы делать большую часть того, что вы делаете вручную. например '(применить string-append '(" one "" two "" three ")) ;; «один два три». Создайте одну функцию, которая параметризует список, удаляет лишние пробелы (или добавляет их, в зависимости от того, как вы к ней приближаетесь), а затем создайте другую функцию, которая берет список списков и отображает первую функцию над ними. – pdoherty926

ответ

1

Встроенная функция string-join работает, чтобы объединить разные строки в одну строку, разделенную по умолчанию символьным пространством. Используйте map применять его всем членам списка х, и вы будете иметь короткий код, чтобы выполнить эту задачу:

(map string-join x) 

Выход:

'("1 one two 2 three" "2 four five 0 six" "3 seven eight 4 nine" "4 ten eleven 2 twelve") 
Смежные вопросы