Как удалить строку в которой содержится определённый символ из списка...?
Реклама i
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как удалить строку в которой содержится определённый символ из списка...?

Как удалить строку в которой содержится определённый символ из списка...?

Ответ
Поиск в этой теме
Непрочитано 14.10.2010, 19:40 #1
Как удалить строку в которой содержится определённый символ из списка...?
МихМих
 
Калининград
Регистрация: 06.12.2006
Сообщений: 38

Подскажите пожалуйста как можно с помощью Lispa удалить строку содержающую определённый символ из списка....к примеру имею список вида:
("Привет1" "Привет2" "%Привет3" "Привет4")

какую команду правильнее применить чтобы например удалить строку в которой содержится знак %
можно через vl-remove но как задать чтобы удалялись все строки со знаком % ?
Спасибо
Просмотров: 4624
 
Непрочитано 14.10.2010, 19:43
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


Код:
[Выделить все]
_$ (setq lst '("Привет1" "Привет2" "%Привет3" "Привет4"))
("Привет1" "Привет2" "%Привет3" "Привет4")
_$ (vl-remove-if '(lambda(x)(wcmatch x "*%*")) lst)
("Привет1" "Привет2" "Привет4")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.10.2010, 22:18
#3
МихМих


 
Регистрация: 06.12.2006
Калининград
Сообщений: 38
<phrase 1=


Спасибо ОГРОМНОЕ!!
крутил вертел с vl-remove-if и wcmatch ничего не получалось.... а вот lambda помог..... тока даж после прочтения справки не могу понять как этот lambda работает......
МихМих вне форума  
 
Непрочитано 14.10.2010, 22:43
#4
Дима_

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


lambda это по сути главная функция лиспа - (lambda ([x y ...])) возращает функцию (не выполняет, а просто создает с аргументами x y ... (или без них)). По сути defun это производная от lambda,
Код:
[Выделить все]
(defun test (a) (* a a))
это не что иное как
Код:
[Выделить все]
(setq test (lambda (a) (* a a)))
Но самое интересное то, что и setq - производная от lambda (просто он работает в "глобальном" окружении) - набор команд
Код:
[Выделить все]
(setq a 5)
 (* a (+ a 2))
это не что иное как
Код:
[Выделить все]
((lambda (a) (* a (+ a 2))) 5)
- то есть выполнить "жирную" функцию с аргументом 5.
Offtop: p.s. "вторая" функция лиспа по моей иерархии - cons - попробуй сам разберись.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 14.10.2010, 22:52
#5
МихМих


 
Регистрация: 06.12.2006
Калининград
Сообщений: 38
<phrase 1=


Дима_ спасибо большое за подробное разъяснение ))) Видно долго мне ещё постигать секреты LISP .... в принципе тему можно закрывать
МихМих вне форума  
 
Непрочитано 15.10.2010, 08:22
#6
Лиспер


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


Для последователей VBA / VB:
Код:
[Выделить все]
(vl-remove-if '(lambda(x)(wcmatch x "*%*")) lst)
Может быть переведен как (только в целях улучшения понимания!):
Код:
[Выделить все]
(defun test (/ res)
  (foreach item lst
    (if (not (wcmatch x "*%*"))
      (setq res (cons item res))
      ) ;_ end of if
    ) ;_ end of foreach
  (reverse res)
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 15.10.2010, 17:52
#7
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Для последователей русского языка:
1 вариант если нашли в элементе "*%*", убираем его из списка...
2 вариант Для каждого элемента списка, если нашли в нем "*%*", добавляем его в новый список...
gomer вне форума  
 
Непрочитано 15.10.2010, 21:20
#8
Дима_

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


Не владея предметом не говорите - лисп не умеет "убирать" из списков - и тот и другой лисп возращает НОВЫЙ список с удаленными элементами - так уж он устроен.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.10.2010, 21:24
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


Дима_, переведи, а то лично меня ты в ступор вогнал
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.10.2010, 21:33
#10
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Дима_, переведи, а то лично меня ты в ступор вогнал
Я его понял так, что список является неизменяемой структурой, а то, что воспринимается как "удаление" из списка, на самом деле является формированием нового списка, но уже без "удалённого" элемента.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 15.10.2010, 21:52
#11
Дима_

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


то крыс - hwd сказал абсолютно верно, попробуй без setq измени какой либо список (сохраненный например), да и с setq его-же можно только перепсать.
p.s. надо-же, я, что-то Крысу объясняю - маэстро что с Вами?
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 15.10.2010 в 22:02.
Дима_ вне форума  
 
Непрочитано 15.10.2010, 21:59
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


Ну вы еще распределение памяти прикрутите сюда
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.10.2010, 10:24
#13
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от hwd Посмотреть сообщение
список является неизменяемой структурой, а то, что воспринимается как "удаление" из списка, на самом деле является формированием нового списка, но уже без "удалённого" элемента.
Возможно, vl-remove-if работает аналогично 2-му примеру, а, возможно нет...
Тем более что 2-й вариант - не рабочий
Тогда уж так...

Код:
[Выделить все]
 (setq lst '("Привет1" "Привет2" "%Привет3" "Привет4"))

(defun test (/ res)
  (setq	res lst
	lst '()
  )
  (foreach item	res
    (if	(not (wcmatch item "*%*"))
      (setq lst (cons item lst))
    )
  )
  (setq lst (reverse lst))
)
(test)
или так
Код:
[Выделить все]
(setq lst '("Привет1" "Привет2" "%Привет3" "Привет4"))

(defun test (/ res)
  (setq res '())
  (foreach item	lst
    (if	(not (wcmatch item "*%*"))
      (setq res (cons item res))
    )
  )
  (setq lst (reverse res))
)
(test)

Последний раз редактировалось gomer, 16.10.2010 в 10:31.
gomer вне форума  
 
Непрочитано 16.10.2010, 15:37
1 | #14
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


еще один пример, без setq и lambda...
Код:
[Выделить все]
(defun f (l)
 (cond ((not l) nil)
       ((wcmatch (car l) "*%*") (f (cdr l)))
       ((cons (car l) (f (cdr l))))
 )
)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как удалить строку в которой содержится определённый символ из списка...?