Объединение подсписков в lisp
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Объединение подсписков в lisp

Объединение подсписков в lisp

Ответ
Поиск в этой теме
Непрочитано 29.10.2010, 08:39 #1
Объединение подсписков в lisp
Лиспер
 
Регистрация: 11.10.2010
Сообщений: 979

Подскажите, а то что-то голова совсем не варит (говорю сразу - даже не могу представить, по каким критериям поиск выполнять, поэтму смотрел все подряд, и, естественно, не углядел похожего решения).
Есть список вида
Код:
[Выделить все]
(setq source-lst '(("a" "b" "c" <...>) ("d" "e" "f" <...>) ("g" "h" "i" <...>) <...>))
Количество подсписков в source-lst и количество элементов в каждом подсписке заранее неизвестно. Можно гарантировать только одно - длина всех подсписков одинакова. Вопрос: как объединить этот список в один наподобие:
Код:
[Выделить все]
'("adg<...>" "beh<...>" "cfi<...>" <...>)

Никак сообразить не могу. Моя благодарность не будет знать границ в пределах разумного
__________________
(/= RegDate StartReadDate)
Просмотров: 3205
 
Непрочитано 29.10.2010, 08:48
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Код:
[Выделить все]
(mapcar 'strcat source-lst)
Do$ вне форума  
 
Автор темы   Непрочитано 29.10.2010, 08:50
#3
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Не-а:
Код:
[Выделить все]
_$ (setq source-lst '(("a" "b" "c") ("d" "e" "f") ("g" "h" "i")))
(("a" "b" "c") ("d" "e" "f") ("g" "h" "i"))
_$ (mapcar 'strcat source-lst)
; error: bad argument type: stringp ("a" "b" "c")
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 29.10.2010, 08:55
1 | #4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Пардон
Код:
[Выделить все]
(apply 'mapcar (cons 'strcat source-lst))
Do$ вне форума  
 
Автор темы   Непрочитано 29.10.2010, 08:58
#5
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Йокъ! Спасибо Куда и что высылать?
---
P.S. А можно обнаглеть? А если список, допустим, будет таким:
Код:
[Выделить все]
(setq source-lst '(("a" "" "c") ("d" "e" "") ("g" "h" "i")))
Результатом должно быть:
Код:
[Выделить все]
'("a - d - g" "e - h" "c - i")
Исходный список преобразовывать и подставлять в №4 или как? Пока прошу только подсказки Может, мозги все-таки включатся в работу.
__________________
(/= RegDate StartReadDate)

Последний раз редактировалось Лиспер, 29.10.2010 в 09:04.
Лиспер вне форума  
 
Непрочитано 29.10.2010, 09:03
#6
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


За это "спасибо" вполне достаточно
Do$ вне форума  
 
Автор темы   Непрочитано 29.10.2010, 09:09
#7
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Цитата:
Сообщение от Do$ Посмотреть сообщение
За это "спасибо" вполне достаточно
Моему чувству справедливости - недостаточно По №5 вроде как домыслил, если получится, выложу на суд профессионалов.
Добавлено: не, не получается. Неужели исходный список все же анализировать надо и подставлять измененный??
__________________
(/= RegDate StartReadDate)

Последний раз редактировалось Лиспер, 29.10.2010 в 09:24.
Лиспер вне форума  
 
Непрочитано 29.10.2010, 09:21
1 | #8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Можно в коде из #4 strcat заменить на list и потом с результатом играться.
Do$ вне форума  
 
Автор темы   Непрочитано 29.10.2010, 09:47
#9
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Do$, проверь, пожалуйста: все верно или я где-то ошибку допускаю?
Код:
[Выделить все]
(mapcar
  (function
    (lambda (x)
      (strcat
        (car (setq x (mapcar
                       (function
                         (lambda (a) (vl-string-trim " " a))
                         ) ;_ end of function
                       (vl-remove "" x)
                       ) ;_ end of mapcar
                   ) ;_ end of setq
             ) ;_ end of car
        (apply
          (function strcat)
          (mapcar
            (function
              (lambda (a)
                (strcat " - " a)
                ) ;_ end of lambda
              ) ;_ end of function
            (cdr x)
            ) ;_ end of mapcar
          ) ;_ end of apply
        ) ;_ end of strcat
      ) ;_ end of lambda
    ) ;_ end of function
  (apply
    (function mapcar)
    (cons 'list source-lst)
    ) ;_ end of apply
  ) ;_ end of mapcar
Может, есть методы укоротить код и, возможно, ускорить его? Спасибо.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 29.10.2010, 10:04
1 | #10
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Лиспер Посмотреть сообщение
проверь, пожалуйста
Я ж не знаю, какие списки могут быть... Но вот такой не переварился:
Код:
[Выделить все]
(("a1" "" "c1" "d1" "e1" "f1") ("a2" "" "" "d2" "" "f2") ("a3" "" "c3" "d3" "" "f3"))
А можешь объяснить, зачем обработка вот этой функцией?:
Код:
[Выделить все]
(lambda (a) (vl-string-trim " " a))
Ps Я понял так: в списке могут быть элементы с пробелами спереди и сзади, их подчищаем.
То есть список может быть таким:
Код:
[Выделить все]
(("a1" "" " c1" "d1" "e1" "f1") ("a2 " "" "" "d2" "" "f2") ("a3" "" "c3" "d3" "" "   f3 "))

Последний раз редактировалось Do$, 29.10.2010 в 10:15.
Do$ вне форума  
 
Автор темы   Непрочитано 29.10.2010, 10:18
#11
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Понял, добавлю обработку. Я почему просил-то - посмотрел тему про обучение, увидел, сколько моментов не видно вопрошающему, да и понял, что сам в таком же положении...
P.S. пробелы обрубаю, чтобы корректно обрабатывались строки типа
Код:
[Выделить все]
"       йокылымыны        "
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 29.10.2010, 10:24
1 | #12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Результатом должно быть:

Код:

'("a - d - g" "e - h" "c - i")
Сейчас автокада под рукой нет, но ИХМО так должно работать:
Код:
[Выделить все]
(defune test (lst)
  (mapcar '(lambda (x)
             (apply 'strcat (cons (car x)
                                  (mapcar '(lambda (s) (if (= s "") s (strcat " - " s)))
                                          (cdr x)))))
          (apply 'mapcar (cons 'list lst))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.10.2010, 11:20
#13
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Дима_, у меня аналогичный код получился Спасибо
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Объединение подсписков в lisp

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ламерские вопросы по LISP и DCL TheBuTeK LISP 7 03.07.2016 22:15
Объединение перемещений Лира 9.6 (ферма и сендвич-панель) РастОК Лира / Лира-САПР 7 06.07.2010 10:26
Отключение привязки в lisp стеклянная собачка LISP 5 20.03.2010 00:24
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19