Конкатенация в схеме - PullRequest
       4

Конкатенация в схеме

6 голосов
/ 30 ноября 2011

У меня есть следующий код:

(define rest '(((di (a) (b c)) (sh (b) (e d))) ((al (a) (b)))))
(define first '((di (a) (5)) (sh (b) (3))))

Я хочу получить следующий список:

(((di (a) (5)) (sh (b) (3))) ((di (a) (b c)) (sh (b) (e d))) ((al (a) (b)))))

означает, добавить список first, чтобы быть первым элементом в покое.

Когда я делаю append, это дает мне:

((di (a) (5)) (sh (b) (3)) ((di (a) (b c)) (sh (b) (e d))) ((al (a) (b))))

И любая другая библиотечная функция или функция, которую я пытаюсь выполнить, не помогла.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 30 ноября 2011

Append берет два списка и складывает их вместе.Учитывая, что у вас есть first и rest, вы, вероятно, хотите cons.Cons берет элемент и добавляет его в список.В этом случае элемент равен first, а список - rest.Итак, вы хотите что-то вроде

(cons first rest)
2 голосов
/ 30 ноября 2011

Не рекомендуется использовать first и rest в качестве имен для ваших списков, поскольку они являются предопределенными процедурами в некоторых версиях схемы (например, в Racket), и вы их переопределите. *

Простой cons поможет, как вы можете видеть ниже:

(define fst '((di (a) (5)) (sh (b) (3))))
(define rst '(((di (a) (b c)) (sh (b) (e d))) ((al (a) (b)))))

(cons fst rst)
> (((di (a) (5)) (sh (b) (3))) ((di (a) (b c)) (sh (b) (e d))) ((al (a) (b))))

Это работает, потому что список, который вы хотите получить, это просто rst, но с новым элементом, fst (список) в начале, тогда как вы обычно используете append, когда хотите добавить элементы одного списка в конце другого списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...