2016-12-24 2 views
-1

Я совершенно новый в lisp, так что, возможно, это глупый вопрос. Но я хотел бы объединить два списка (s1, s2) в соответствии с заданным шаблоном - списком S3 логического (t nil ....). Если true, используйте элемент из S2, если false использует элемент как есть. Таким образом, окончательный вид должен выглядеть так: s1 (1 2 3 2 2 4) и s2 (8 9 5 6 8 9) и S3 (nil t nil tt noil) => (1 8 3 9 5 4)Lisp слияние шаблон

Большое спасибо! R.

ответ

3

Lisp - это семейство языков. Если вы имеете в виду Common Lisp, здесь можно две строки решения:

CL-USER> (defun merge-3 (s1 s2 s3) 
      (loop for x in s1 if (pop s3) collect (pop s2) else collect x)) 
MERGE-3 
CL-USER> (merge-3 '(1 2 3 2 2 4) '(8 9 5 6 8 9) '(nil t nil t t nil)) 
(1 8 3 9 5 4) 
-2
(defun select-lists (s1 s2 s3) 
    (mapcar (lambda (s1e s2e s3e) 
      (if s3e s2e s1e)) 
      s1 s2 s3)) 
+0

Пожалуйста, добавьте некоторые комментарии о своем решении о том, почему и как это решает проблему –

+0

@Odedra: Я думаю, что это прекрасный пример код настолько ясен, он не нуждается в комментариях. Я имею в виду, что сказать: «mapcar» отображает функцию, просматривающую некоторые списки, и возвращает результаты как список'? Всем это известно. И отображаемая функция тривиально понятна. – tfb

+0

Обратите внимание, что ваша функция не решает проблему OP. '(select-lists '(1 2 3 2 2 4)' (8 9 5 6 8 9) '(nil t nil tt nil))' возвращает '(1 9 3 6 8 4)', а не '(1 8 3 9 5 4) '. – Renzo