Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Вылетает функция putassoc


Автор: Zz1n 28.5.2014, 13:45
Добрый день форумчане. Не могу понять, почему вылетает ошибка.

(defun putassoc (key obj a_list)
(cond ((null a_list) nil)
((eql (caar a_list) key)
(rplacd (car a_list) obj))
((null (cdr a_list))
(rplacd a_list)
(list (cons key obj))))
(putassoc key obj (cdr a_list)))

(trace putassoc)    

(setq lst nil)
(setq lst (pairlis '(1 2 3) '(odin dva tri) lst))
(putassoc '2 'two lst)

однако после выполнения (cons (car lst)(cdr lst)) результат показывает правильный.

Автор: k0rvin 27.11.2014, 17:46
Цитата(Zz1n @  28.5.2014,  13:45 Найти цитируемый пост)
почему вылетает ошибка


Потому что процедура написана неправильно.

Код

(defun getkey (pair)
  (car pair))

(defun putvalue (pair val)
  (rplacd pair val))

(defun putassoc (key val list)
  (cond ((null list) nil)
        ((eql (getkey (car list)) key)
         (putvalue (car list) val))
        (t
         (putassoc key val (cdr list)))))

(defun test ()
  (let ((alist '((a . 1) (b . 2) (c . 3))))
    (putassoc 'b 5 alist)
    (putassoc 'd 9 alist)
    (print alist)
    nil))


Код

(test)
; ((A . 1) (B . 5) (C . 3))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)