Получить один список списков из N списков списков, а иногда и список также - PullRequest
0 голосов
/ 11 марта 2019

Я все еще изучаю Схему.

Если есть два списка списков:

'((1 2 (3 4) 5) (12 13 4))
'((3 4 9) (7 6 5 4))

Я хочу получить этот список:

'((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))

Но с cons:

(cons '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))

Я получаю этот список:

'(((1 2 (3 4) 5) (12 13 4)) (3 4 9) (7 6 5 4))

Примечание :

В этом примере оба списка имеют два подсписка. Но они могут иметь n подсписков.

Я пробовал с append, но он не работает, когда один из списков списков является только списком:

(append '(1 2 3 4) '((23 24 25 26) (a b c)))
> '(1 2 3 4 (23 24 25 26) (a b c))

Есть ли функция, которая это делает, или мне нужно ее реализовать?

1 Ответ

2 голосов
/ 11 марта 2019

Поведение, которое вы хотите, очень специфично, вы не найдете его в стандартной библиотеке. Хорошая новость заключается в том, что это просто реализовать в переносимом и эффективном виде, который охватывает все возможные случаи, при условии, что входные списки не пусты:

(define (my-append lst1 lst2)
  (cond ((and (pair? (car lst1)) (pair? (car lst2)))
         (append lst1 lst2))
        ((pair? (car lst1))
         (append lst1 (list lst2)))
        ((pair? (car lst2))
         (append (list lst1) lst2))
        (else
         (append (list lst1) (list lst2)))))

Например:

(my-append '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))
=> '((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))

(my-append '(1 2 3 4) '((23 24 25 26) (a b c)))
=> '((1 2 3 4) (23 24 25 26) (a b c))
...