IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> LISP, работа со списками
kosyak
сообщение 1.11.2008 0:39
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 100
Пол: Мужской

Репутация: -  0  +


Доброго всем времени суток.
Необходимо написать программу на 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)
Если она, то помогите найти ошибку.
А если нет вот такоей вопрос: можно ли список преобразовать в строку (и обратно)?

Пожалуйста, помогите разобраться как это надо делать...

Заранее всем благодарен
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 23.07.2025 23:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"