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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проверка функции на локальность переменных

Проверка функции на локальность переменных

Ответ
Поиск в этой теме
Непрочитано 12.08.2010, 13:24 #1
Проверка функции на локальность переменных
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,202

Код:
[Выделить все]
(defun F (/ a b)
  (setq c T)
)
(F)
как узнать, меняет ли функция F значение каких-либо переменных, в данном случае с?
Просмотров: 3240
 
Непрочитано 12.08.2010, 13:31
#2
Кулик Алексей aka kpblc
Moderator

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


atoms-family запусти перед вызовом функции, сохрани значения в список; потом после вызова функции. И сравнивай списки.
Например:
Код:
[Выделить все]
(defun _dwgru-check-variables (func-call / before after res)
                              ;|
(defun f (/ a b)
  (setq c t)
  ) ;_ end of defun

(_dwgru-check-variables "(f)")
|;
  (setq before (mapcar (function (lambda (x) (strcase x t))) (atoms-family 1)))
  (eval (read func-call))
  (setq after (vl-remove "before" (mapcar (function (lambda (x) (strcase x t))) (atoms-family 1))))
  (foreach item after
    (if (not (member item before))
      (setq res (cons item res))
      ) ;_ end of if
    ) ;_ end of foreach
  (vl-sort res '<)
  ) ;_ end of defun
P.S. Код особо не гонял, возможно, для функций с параметрами результат будет некорректным.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.08.2010, 13:32
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Вызвать:
(F)
(print c)
Если c локальная, и нет других одноименных переменных, напечатает nil.
ShaggyDoc вне форума  
 
Непрочитано 13.08.2010, 09:43
#4
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Или набрать в командной строке -
CB вне форума  
 
Непрочитано 13.08.2010, 10:08
#5
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Там было "в данном случае с". Задача более общая. Переменных могут быть десятки, строк кода сотни.

Кулик Алексей aka kpblc, в твоём случае необходимо условие: _dwgru-check-variables будет давать нужный результат только в том случае, если функция f ни разу до этого не запускалась. Это не очень удобно.

И ещё: (eval (read func-call)) собственно запускает подопытную функцию в работу, а там может быть что угодно.

Вообще универсального решения я пока не вижу, кроме как непосредственно анализировать лисп-файл с кодом на предмет соответствия списка локальных переманных и всех setq в нём.
Makswell вне форума  
 
Непрочитано 13.08.2010, 10:21
#6
Кулик Алексей aka kpblc
Moderator

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


Для сотен строк кода организовывай анонимные и / или локальные функции. Короче, разбивай код на логические куски. И писать проще, и отладку вести
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.08.2010, 10:43
#7
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Спасибо, Кэп.
Давай по-другому сформулирую вопрос. Допустим вот уже есть код из немеряного количества строк (ну допустим тот же известный на этом форуме CTS от VVA). Как его можно проверить на наличие глобальных переменных за минимальное количество времени?
Makswell вне форума  
 
Непрочитано 13.08.2010, 10:49
#8
Кулик Алексей aka kpblc
Moderator

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


Если без муторного анализа кода - то через atoms-family. Лично я другого варианта не вижу
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2010, 11:16
#9
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Вопрос был именно общий, т.е. необходима функция test, аргументом которой будет выполняемое выражение, например, функция F

(test '(F a b)) => должно вернуть 'C, при этом F выполняется.

вот что я хочу.

Нужно это стало в связи с тем, что какие-то из запускаемых функций явно мусорят необьявленными переменными. А какие это функции - я не знаю, а этих функций очень много, и переменных в них много. Но функции у меня запускаются все через обертку, на подобии test, куда включены обработка ошибок, UndoMark, и прочие прелести. Вот туда то я и хотел вставить проверку на переменные, чтобы отловить подобные ошибки в написании функций.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
atoms-family запусти перед вызовом функции, сохрани значения в список; потом после вызова функции. И сравнивай списки.
Идея понятна, спасибо. Попробую.
Apelsinov вне форума  
 
Непрочитано 13.08.2010, 11:40
1 | #10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Makswell Посмотреть сообщение
Давай по-другому сформулирую вопрос. Допустим вот уже есть код из немеряного количества строк (ну допустим тот же известный на этом форуме CTS от VVA). Как его можно проверить на наличие глобальных переменных за минимальное количество времени?
Да очень просто. Проверять-то где? В AutoCAD! Значит открываем файл в VLIDE и жмем Ctrl-Alt-C (в меню Tools - Check Text In Editor)

В окне Build Output будет выведена полная статистика по всем функциям - имена функций, количество аргументов и глобальные переменные.

Наподобие:

Код:
[Выделить все]
[CHECKING TEXT ru-init-start-rucad.lsp loading...]
.
; === Top statistic:
; Global variables: (*RU_SBB_LAYOUTS_SRV* *RU_SHOW_SUMMARY*)
; Function definition (with number of arguments): ((RU-INIT-START-RUCAD . 0))
; Check done.
В данном случае обнаружены две глобальные. Они специально введены и выделены именами - чтобы не путать со случайными.
А вот если что-то забыли описать, вид может быть:
Код:
[Выделить все]
[CHECKING TEXT ru-init-start-rucad.lsp loading...]
.
; === Top statistic:
; Global variables: (*RU_SBB_LAYOUTS_SRV* *RU_SHOW_SUMMARY* ANNO_LIST)
; Function definition (with number of arguments): ((RU-INIT-START-RUCAD . 0))
; Check done.
Здесь появилась забытая глобальная ANNO_LIST.

Этим надо пользоваться постоянно! Как руки мыть...

Аналогичная статистика выводится при Build Project - только будут выведены данные из всех файлов проекта.
ShaggyDoc вне форума  
 
Непрочитано 13.08.2010, 11:49
#11
Кулик Алексей aka kpblc
Moderator

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


ShaggyDoc, позволю себе дополнить: для получения подобного результата в Tools -> Environment Options -> Global Options -> Diagnostics надо отметить как минимум Report statistics during syntax checking. Иначе для кода
Код:
[Выделить все]
(defun test ()
  (setq a 1
        b 2
        c 3
        ) ;_ end of setq
  ) ;_ end of defun
можно получить в Build Output:
Код:
[Выделить все]
[CHECKING TEXT <Untitled-1> loading...]
.
; Check done.
Мне так каэцца.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.08.2010, 12:17
#12
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


ShaggyDoc, Кулик Алексей aka kpblc
Вот ведь как. Удивительно, но впервые слышу о таком.
Тогда я думаю вопрос исчерпан.

Offtop: PS Кулик Алексей aka kpblc, так бы и сказал сразу. А то лисп сразу наваял, совсем запутал вконец.
Makswell вне форума  
 
Непрочитано 13.08.2010, 13:16
#13
Кулик Алексей aka kpblc
Moderator

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


Makswell, не поверишь, но я этой функцией практически не пользуюсь. В случае локальных функций с параметрами (лично у меня) иногда начинается кавардак в отчете, хрен разберешься. Закономерность как-то не уловил, но испуга до сих пор хватает.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проверка функции на локальность переменных



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Предложение: Готовые функции Apelsinov Библиотека функций 170 27.06.2010 23:51
Функции AutoLISP из ... DLL! Supermax LISP 21 27.06.2010 14:18
Как Извлечь из строки числа Kostinok Программирование 7 12.08.2008 08:00
Как связать две функции Holon Программирование 11 30.07.2007 13:32
Странности функции rtos FWA Программирование 2 16.02.2005 11:37