Автор: kosyak 1.11.2008 4:39
Доброго всем времени суток.
Необходимо написать программу на 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)
Если она, то помогите найти ошибку.
А если нет вот такоей вопрос: можно ли список преобразовать в строку (и обратно)?
Пожалуйста, помогите разобраться как это надо делать...
Заранее всем благодарен
Автор: мисс_граффити 1.11.2008 10:07
рекурсивно не проще ли было бы?
соединять реверсированный остаток с реверсированным первым элементом...
(реверсированный = к которому применена наша ф-ция)?
Автор: kosyak 1.11.2008 10:42
Цитата(мисс_граффити @ 1.11.2008 6:07)
рекурсивно не проще ли было бы?
соединять реверсированный остаток с реверсированным первым элементом...
(реверсированный = к которому применена наша ф-ция)?
Я просто не очень понимаю как там сделать рекурсию...
Есть вот такая функция:
Код
(DEFUN REVERSE-1 (X)
(COND ((NULL X) NIL)
(T (APPEND (REVERSE-1 (CDR X)) (LIST(CAR X))))))
Реверсирует список, только без вложенных... пыталься сделать с вложенными, как говорили (соединять реверсированный остаток с реверсированным первым элементом):
Код
(DEFUN REV (X)
(COND ((NULL X) NIL)
(T(APPEND (REV (CDR X)) (REV (LIST(CAR X)))))))
(DEFUN MY (X)
(REV '(X))
(PRINT X)
)
что-то тут не так... в чем дело?? Хелп
Автор: мисс_граффити 3.11.2008 7:56
попробуй вот так (пишу здесь, навскидку)
если не пойдет - попробую дома, с автокадом, разбираться.
Код
(DEFUN REVERSE-1 (X)
(COND ((NULL X) NIL)
(T (APPEND (REVERSE-1 (CDR X)) (REVERSE-1(LIST(CAR X)))))))
Автор: kosyak 3.11.2008 15:49
Цитата(мисс_граффити @ 3.11.2008 3:56)
попробуй вот так (пишу здесь, навскидку)
если не пойдет - попробую дома, с автокадом, разбираться.
Код
(DEFUN REVERSE-1 (X)
(COND ((NULL X) NIL)
(T (APPEND (REVERSE-1 (CDR X)) (REVERSE-1(LIST(CAR X)))))))
Спасибо за помощь, но все равно не работает))
Может я чего не так ввожу? в автокаде ввожу: " (REVERSE-1 '(1 2 3 (4 5))) ".
А чем это отличается от того что я написал?