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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> LISP, работа со списками
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


рекурсивно не проще ли было бы?
соединять реверсированный остаток с реверсированным первым элементом...
(реверсированный = к которому применена наша ф-ция)?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

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

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


Цитата(мисс_граффити @ 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)
)


что-то тут не так... в чем дело?? Хелп

Сообщение отредактировано: kosyak -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


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

Код
(DEFUN REVERSE-1 (X)
(COND ((NULL X) NIL)
(T (APPEND (REVERSE-1 (CDR X)) (REVERSE-1(LIST(CAR X)))))))


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

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

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


Цитата(мисс_граффити @ 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))) ".
А чем это отличается от того что я написал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 24.10.2021 1:46
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name