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


Автор: rocko 28.12.2010, 12:21
Здравствуйте, помогите пожалуйста решить задачу в опрераторном стиле:
Есть список вида:
((1(2 3)4)(5 6 (7 8 9))(10 (11 12 13)(14 15 16)))
необходимо его преобразовать в вид:
((1(2)4)(5 6(7))(10(11)(14)))

Вот что вышло, помогите исправить ошибки...

defun vvod() (progn (setq x (progn (princ "input matrix as one list") (terpri) (read)))))

(defun res () (progn 
(setq y x)
(setq x ())
(setq f ())
b1

(setq z (car y))
(go b2)

b2 
(cond ( (not (atom(car z))) (progn ( setq f (append f (list (caar z)))) (setq z (cdr z)) (cond ((not (null z)) (go b2))) )))
( cond ((not (null z)) (progn (setq f (append f (list(car z)))) (setq z (cdr z)) (cond ((not (null z)) (go b2))) ))) 
(t (go m1))

m1

(setq x (append x f))
(setq f ())
(setq y (cdr y))

(cond ((not (null y)) (go b1))) ))
Цитата



Автор: k0rvin 28.12.2010, 21:32
пример ни разу не объясняет, что на самом деле нужно сделать со списком.
что такое "операторный стиль"? это как-то связано с оператором ЭВМ?
что за диалект?

Автор: rocko 28.12.2010, 22:09
ну в каждом подсписке нужно оставить только голову...
и нужно использовать ф-и do и лейблы для решения задачи, без рекурсии и функционалов

Автор: k0rvin 29.12.2010, 13:23
ну например так:
Код

(defun only-heads (list)
  (labels ((only-head (x)
             (do ()
                 ((or (atom x)
                      (null x)
                      (null (rest x)))
                  t)
               (rplacd x nil)
               (setf   x (car x)))))
    (do ((xs list (rest xs)))
        ((null xs) list)
      (when (consp (car xs))
        (only-head (car xs))))))

или так:
Код

(defun only-heads-2 (list)
  (let ((xs list) x)
    (tagbody
     begin
     (when (null xs) (go end))
     (setq x (car xs))
     
     only-head
     (cond ((atom x) (go next))
           ((null x) (go next))
           ( t     
             (rplacd x nil)
             (setq x (car x))
             (go only-head)))
     
     next
     (setq xs (cdr xs))
     (go begin)
     
     end
     (return-from only-heads-2 list))))


тест:
Код

; CL-USER> (only-heads '(1 2 (3 4) () ((5 6) 7 8) 9))
; (1 2 (3) NIL ((5)) 9)
;
; CL-USER> (only-heads-2 '(1 2 (3 4) () ((5 6) 7 8) 9))
; (1 2 (3) NIL ((5)) 9)

Автор: rocko 29.12.2010, 16:40
пишет ошибку на tagbody, when,only-head...может из-за другой версии ЛИСПа?

Автор: k0rvin 29.12.2010, 18:12
ну замените tagbody на progn, а when на if

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