2015-10-31 2 views
0

Я начинаю в LISP.Я использую clisp в ubuntu. У меня есть код здесь, в lisp, чтобы выполнить операцию объединения в двух списках. Логика правильная. Но застрял в ошибке что:Lisp: выполнить операцию объединения в единицу

*** - APPEND: A proper list must not end with T

мой код:

(defun set-union (L1 L2) 
(cond 
((null L2) ;if l2 is null then union is l1 itself. 
    L1) 
((not (member (first L2) L1)) ;check if first member of l2 is in l1 or not 
    (setq l1 (append (set-union L1 (rest L2)) (list (first L2))))) ;if not then append it with the union of l1 and rest of l2. 
(t 
    (set-union L1 (rest L2))) 
)) ;if second condition is not true then carry out union on l1 and rest of the elements of l2 
(setq l1 (list 'a 'c 'b 'g)) 
(setq l2 (list 'd 'g 't)) 
(set-union l1 l2) 
(print l1) 

Мне нужна помощь !! Спасибо.

ответ

1
(append (set-union L1 (rest L2)) (first L2)) 

в какой-то момент вашей логики пытается append (A C B G. Т) и Е, который терпит неудачу, потому что первый не является собственным списком.

Либо использовать

(append (set-union L1 (rest L2)) (list (first L2))) 

или, лучше

(cons (first L2) (set-union L1 (rest L2))) 
+0

Сэр я не пытался this.This раз, без ошибок, но выход отпечатанных первый список, а не объединение lists.Thanks @uselpa – Midhun

+0

С обновленным кодом '(set-union l1 l2)' производит '(ACBGTD)', что является правильным. Но 'set-union' не изменяет l1 или l2, он просто возвращает результат. После этого вы печатаете l1, который не изменился. – uselpa

+0

Так что вы, вероятно, хотите, это '(setq l1 (set-union l1 l2))', после чего l1 обновлен и '(print l1)' дает ожидаемый результат. – uselpa

Смежные вопросы