|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Кто сказал, что нельзя объявлять вложенные функции? Где это сказано, ткни носом!
Живейший пример - локальное переопределение *error* - как собираешься делать без локальных функций?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Да можно их объявлять - просто по моему Red Nova не очень понимает как defun работает - посмотри на код его последний - про который он спрашивает почему не работает.
Для Red Nova если в ком строке написать (setq test "123") то переменной тест будет присвоенно "123", в случае-же (defun prc () (setq test "345")), переменная не изменится, это произойдет только при вызове функции - (prc). В случае-же вложенных defun при выполнении (defun aaa () (defun bbb () (setq ccc "work"))), после этого вызвать функцию (bbb) не получиться, вначале надо запустить (aaa) - только затем (bbb) будет объявленна, но не выполнена - ссс до сих пор = nil, и только сейчас можно вызвать (bbb) и переменной ссс будет присвоенно значение "work". По этому я и советую вначале отдельно объяви все функции - parsing, check3 и пр., а только затем используй их в (test).
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 25.09.2008 в 23:43. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Red Nova, Дима_, простите, мужики, но мне бы со своим кодом разобраться...
Кстати, касательно #417: я в свое время пропустил объявление _dwgru-conv-pickset-to-list в качестве локальной переменной, хотя это и не очень хорошо (это что увидел "сразу").
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||||||
Дима_,
Цитата:
Цитата:
![]() Цитата:
Цитата:
Цитата:
Цитата:
CB, Спасибо за участие. Начало понял. А вот начиная с этой строчки - нет. Цитата:
__________________
Блог |
||||||||
![]() |
|
||||
Дима_,
А теперь что не так ? Код:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Вобщем вот-так, добавлен check2 - я правда его особо не проверял.
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 28.09.2008 в 00:51. |
|||
![]() |
|
||||
Дима_
Пока не заработало Цитата:
__________________
Блог |
||||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
>Red Nova (#426)
Не очень то я умею объяснять, но т.к. тема носит прежде всего обучающий характер все же попытаюсь. Естественно главная в фильтре - это функция wcmatch. Эта функция проверяет структуру текста на соответствие с образцом, который сделан по определенным правилам (каждый символ строки сверяется с образцом). Небольшая информация по символам образца, которые здесь применялись (естественно здесь не все...) 1. * - заменяет ВСЕ символы строки до и после *. Например: (wcmatch "Труба" "Труба") ;T - все символы строки и образца совпадают (wcmatch "Труба" "труба") ;nil - не все символы строки и образца совпадают (wcmatch "Труба" "*") ;T - все символы строки заменяет * (wcmatch "Труба" "Тр*") ;T - первые символы строки и образца совпадают, дальше * заменяет все оставшиеся символы строки (wcmatch "Труба" "*уб*") ;T - первые символы строки до символа "у" заменяет *, все символы после "б" также заменяются * (wcmatch "Труба" "*уа*") ;nil ...(надеюсь все понятно) (wcmatch "Труба" "Т*у*") ;T ...(надеюсь и здесь все понятно) Вернемся к нашему примеру: (or (wcmatch (car x) "*‘") (wcmatch (car x) "*“")) Если ПОСЛЕДНИЙ символ строки равен "‘" или "“" то ИСТИНА. 2. [...] - заменяет один любой символ строки на любой символ в [] Например: (wcmatch "1" "[0123456789]") ;T - символ строки присутствует в образце (wcmatch "a" "[0123456789]") ;nil - символ строки отсутствует в образце (wcmatch "1aа" "[0123456789]*") ;T - первый символ строки присутствует в образце, остальные заменяются * 3. - определяет диапазон однотипных символов. Например: (wcmatch "1" "[0123456789]") и (wcmatch "1" "[0-9]") абсолютно идентичы 4. ? заменяет ровно один символ строки Например: (wcmatch "1aа" "[0-9]??") ;T - заменяет два последних символа строки (они могут быть любыми) (wcmatch "1aа" "?[0-9]?") ;nil - первый символ строки любой, второй отсутствует в образце [0-9], третий любой. (wcmatch "a1а" "?[0-9]?") ;T - первый символ строки любой, второй присутствует в образце [0-9], третий любой. 5. , разделяет несколько образцов Например: (wcmatch "a1а" "[0-9]??,?[0-9]?") ;T - первое условие не выполняется, второе выполняется (wcmatch "1аа" "[0-9]??,?[0-9]?") ;T - первое условие выполняется, второе не выполняется 6. # заменяет одну любую цифру Например: (wcmatch "1аа" "#*") ;T - первый символ строки цифра, все остальные заменяются * (wcmatch "20а" "#*") ;T - первый символ строки цифра, все остальные заменяются * (wcmatch "а1а" "#*") ;nil - первый символ строки НЕ цифра, все остальные заменяются * Вернемся к примеру: "[a-gа-е0-9]?,#[a-gа-е0-9]?,##[a-gа-е0-9]?,#*#[a-gа-е0-9]?" Здесь 4 варианта образцов: Первый вариант для двух знаков строки - первый знак может быть любая цифра, буквы из диапазонов от "a" до "g" (a b c d f g) и от "а" до "е" (а б в г д е). Вторая вроде бы любая, но по условию ф-ции if (см. в конце п.1) это могут быть только знаки "‘" или "“" т.е. (wcmatch "1‘" "[a-gа-е0-9]?") ;T - первый символ строки присутствует в образце [a-gа-е0-9], второй любой (wcmatch "a‘" "[a-gа-е0-9]?") ;T - первый символ строки присутствует в образце [a-gа-е0-9], второй любой (wcmatch "q‘" "[a-gа-е0-9]?") ;nil - первый символ строки отсутствует в образце [a-gа-е0-9], второй любой Т.к. в #426 кое-что в условии поменялось, то можно поменять образец на "[A-Za-zА-Яа-я0-9]?" (wcmatch "q‘" "[A-Za-zА-Яа-я0-9]?");T - первый символ строки присутствует в образце "[A-Za-zА-Яа-я0-9]?", второй любой т.е. первый символ может быть любой цифрой или любой буквой (также и заглавной) Хочу заметить следующее - символы в [] восприннимаются не как управляющие, а как они есть т.е. (wcmatch "10" "[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "10" "[A-Za-zА-Яа-я#]?") ;nil символ # не как управляющий (wcmatch "#1" "[A-Za-zА-Яа-я#]?") ;T символ # не как управляющий Второй вариант (#[A-Za-zА-Яа-я0-9]?) для трех знаков строки - первый знак ЦИФРА, дальше по первому варианту (wcmatch "10‘" "#[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "1b‘" "#[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "1б‘" "#[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "a10‘" "#[A-Za-zА-Яа-я0-9]?") ;nil Третий вариант (##[A-Za-zА-Яа-я0-9]?) для четырех знаков строки - первый и второй знаки ЦИФРА, дальше по первому варианту (wcmatch "10a‘" "##[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "100‘" "##[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "1aa‘" "##[A-Za-zА-Яа-я0-9]?") ;nil (wcmatch "a1a‘" "##[A-Za-zА-Яа-я0-9]?") ;nil Четвертый вариант (#*#[A-Za-zА-Яа-я0-9]?) c "подводным камнем" - для случая > четырех знаков строки первый знак ЦИФРA, дальше ЛЮБЫЕ, третий с конца ЦИФРA, второй с конца ЦИФРA или буква, последний любой (в данном случае "‘" или "“"). (wcmatch "100a‘" "#*#[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "1а0a‘" "#*#[A-Za-zА-Яа-я0-9]?") ;T (не правильно) Чтобы исключить "неправильность" я думаю, что лучше это условие изменить на "###[A-Za-zА-Яа-я0-9]?" (wcmatch "1а0a‘" "###[A-Za-zА-Яа-я0-9]?") ;nil (wcmatch "999a‘" "###[A-Za-zА-Яа-я0-9]?") ;T (wcmatch "9999‘" "###[A-Za-zА-Яа-я0-9]?") ;T Ну а дальше все тоже самое, только для случая, если в конце нет знаков "‘" или "“". Последний раз редактировалось CB, 26.09.2008 в 17:34. |
|||
![]() |
|
||||
CB,
Спасибо за объяснение. Очень подробно и понятно. Есть один вопрос. Так получается что образец wcmatch работает только тогда, когда количество символов совпадает с количественным параметром образца. А что если мы напишем образцы для строк содержащих до 4-х символов, а в строке их пять?
__________________
Блог |
||||
![]() |
|
||||
Файл примера dwg прикреплен на #418
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Попробую разобрать мой код из #414:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Дима_
Укоротил список до минимума, не помогло. Код:
__________________
Блог Последний раз редактировалось Red Nova, 27.09.2008 в 11:16. |
||||
![]() |
|
||||
kpblc, Спасибо за подробности, пока не вникал, но заметил что код как и прежде фильтрует и нужную информацию. Например эту
Код:
__________________
Блог |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А как ты тогда " в текст втавишь? Интерпритатор воспимет ее как закрывающию.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Чудеса какие-то, проверь filtr на тестовом списке? Если работает, то посмотри в отлдчике что lst до него предствляет, наверняка какая-нибудь глупость типа lst в скобках два раза прописан, если сам ошибку найдешь это гораздо полезней, чем тебе ее покажут.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Дима_
Цитата:
__________________
Блог |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Вставка в таблицу поля, соотвествующего площади примитива | Profan | Готовые программы | 272 | 06.06.2021 23:12 |
Сейсмозащита и сейсмоизоляция существующих, построенных зд. | IANationalInformAgentstvo | Прочее. Архитектура и строительство | 216 | 20.01.2015 16:51 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
ЮМОР 2006 =) | Perezz!! | Разное | 1122 | 04.01.2007 00:46 |