Помощь - Поиск - Пользователи - Календарь
Полная версия: LISP
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
kosyak
Доброго всем времени суток.
Необходимо написать программу на 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)
Если она, то помогите найти ошибку.
А если нет вот такоей вопрос: можно ли список преобразовать в строку (и обратно)?

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

Заранее всем благодарен
мисс_граффити
рекурсивно не проще ли было бы?
соединять реверсированный остаток с реверсированным первым элементом...
(реверсированный = к которому применена наша ф-ция)?
kosyak
Цитата(мисс_граффити @ 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)
)


что-то тут не так... в чем дело?? Хелп
мисс_граффити
попробуй вот так (пишу здесь, навскидку)
если не пойдет - попробую дома, с автокадом, разбираться.

Код
(DEFUN REVERSE-1 (X)
(COND ((NULL X) NIL)
(T (APPEND (REVERSE-1 (CDR X)) (REVERSE-1(LIST(CAR X)))))))
kosyak
Цитата(мисс_граффити @ 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))) ".
А чем это отличается от того что я написал?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.