Необходимо написать программу на Lisp. (который в AutoCad).
Задача:Написать программу реверсирования всех атомов из подсписков любого уровня.
Т.е. если есть список (1 2 3 (4 5 (6 7))), то на выходе получим (((7 6) 5 4) 3 2 1)
есть код программы (вроде она, но не работает):
Код
(defun create_list ()
(setq l(getstring "Введите список:"))
(setq i 1)
(setq curr_level -1)
(setq high_level -1)
(setq str "")
(setq str_length(strlen l))
(while (<= i str_length)
(setq char(substr l i 1))
(if (= char "(")
(setq curr_level(1+ curr_level))
)
(if (= char ")")
(setq curr_level(1- curr_level))
)
(if (> curr_level high_level)
(setq high_level curr_level)
)
(setq i (1+ i))
)
(setq curr_level -1)
(setq i 1)
(setq result "")
(while (<= i str_length)
(setq char(substr l i 1))
(if (= char "(")
(setq curr_level(1+ curr_level))
)
(if (= char ")")
(setq curr_level(1- curr_level))
)
(if (= curr_level high_level)
(progn
(if (not(= char "("))
(progn
(if (not(= char " "))
(progn
(setq str(strcat str char))
(if (= (substr l (1+ i) 1) ")")
(progn
(if (= (listp result) nil)
(setq result(list str))
(setq result(cons str result))
)
(setq str "")
)
)
)
(progn
(if (= (listp result) nil)
(setq result(list str))
(setq result(cons str result))
)
(setq str "")
)
)
)
)
)
)
(setq i (1+ i))
)
(setq result(reverse result))
(princ (strcat ">>>> Список:"))
(setq i 0)
(while (not(= (nth i result) nil))
(princ (strcat (nth i result)))
(setq i(1+ i))
(if (not(= (nth i result) nil))
(princ (strcat " "))
(print ".")
)
)
)
Может это конешно не та программа... я точно не знаю (только начал изучать LISP)
Если она, то помогите найти ошибку.
А если нет вот такоей вопрос: можно ли список преобразовать в строку (и обратно)?
Пожалуйста, помогите разобраться как это надо делать...
Заранее всем благодарен