|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
25.10.2010, 20:26 | #1 | |
AutoLISP: Просачивание локальных переменных в тело используемых в выражении функций
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 4414
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
Ты с областью видимости определись:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 571
|
Supermax, я тоже не очень понял, что Вас удивляет. Так Вы написали
(lambda(x) ...), то для (defun proba (ss) (* x 2)) которое вызывается через (vl-catch-all-apply 'proba (list x)) x - уже как бы "глобальная" переменная. Напишите так (defun proba (ss) (* y 2)) и Вы получите: Код:
__________________
cadtools |
|||
|
||||
Offtop: Привет! Ты что, с мобильника пишешь в тему? Что это за кракозябры в строках?
Как ты заметил (если заметил) я нигде setq не использовал. Я вообще ни разу, ни одной переменной не создал (в смысле глобальной). Так что с видимостью у меня все в порядке. Я создал при определении функции ее аргумент, а в теле самой функции мои выражения начинают разговаривать с внешними переменными. Если бы не этот аргумент (я его пробовал удалять) внутрь ничего не попадает. Только с его присутствием этот x в теле пашет. Или это что-то другое. Никак не пойму что происходит. |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
Хоссспидяяяя.... Ну сделай полноценную функцию, внутрь mapcar'a воткни точку останова и посмотри, чего чему равно.
Вот тебе код для отладки: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
gomer, ты к кому обращался? Хоть аргументируй, что ли...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
Это напоминает мне ситуацию, когда есть ГЛАВНАЯ функция/команда с кучей непонятных аргументов, а в ней куча маленьких подфункций которые используют эти переменные (для них (функций) эти переменные глобальны) Например, Прокат В.Кондрата... Все работает, вроде, но разобраться как... очень сложно...
Для меня глобальная переменная - это та которая хранит данные в течение сеанса работы с документом... все остальное - параметры функций... Локальные переменные я использую для уменьшения длины кода, при пользовательском вводе и в циклах при работе с коллекциями... другие функции в теле использую или без аргументов или с аргументами в качестве местных локальных и т.д. т.е. оперирую только локальными данными... |
|||
|
||||
Во, блин! А че я раньше-то парился?
Li6-D, ты прав на все 100. Код:
От сюда вывод: Какой? - А вот такой! "Не упоминай в суе имя господа твоего!" (в смысле имена переменных определенных как локальные, но в вышестоящей инстанции) Или вот такой пример: Код:
Последний раз редактировалось Supermax, 25.10.2010 в 22:18. |
||||
|
||||
Регистрация: 03.05.2009
Сообщений: 112
|
Цитата:
Выигрываем в скорости вычислений и размере кода, проигрываем в читаемости и универсальности. Конечно автор может сделать доброе дело и написать в комментариях к подфункции какие глобальные переменные она использует и какие создает. Прежде всего, чтобы самому не запутаться... Последний раз редактировалось Li6-D, 25.10.2010 в 22:42. |
|||
|
||||
Это не есть хорошо. Тут я с gomer-ом полностью согласен. Что же это получается? Я взял чужую библиотеку функций (допустим даже скомпилированную) и использую их в качестве подфункций в своих функциях, так мне надо чтобы я обозначал свои переменные совсем не так как они обозначены в этих подфункциях. Они ж мне весь Марлезонский балет могут испортить.
Есть такой милый способ временного хранения, сначала создавать переменную, а потом ее убивать. А если ее имя совпадает с глобальной переменной? Ай-яй-яй. |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
Мораль сей басня очень прост: сначала надо разобраться с вызовом и областью видимости переменных.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
gomer, я понял, что ты сказал что-то очень умное... Я понял, что я что-то не понял, но что конкретно я не понял, я не понял
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 03.05.2009
Сообщений: 112
|
Цитата:
Последний раз редактировалось Li6-D, 25.10.2010 в 23:16. |
|||
|
||||
Цитата:
Тут как тут старпом или другой матрос с невозмутимым видом тебе сообщают, что это не .... а фок-гик. Вот так ходишь по кораблю и лбом изучаешь названия его элементов. |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
Supermax, все проще. Задай глобальную переменную, потом функцию с параметром, у которого такое же имя. Вызови функцию и внутри нее посмотри значение параметра. 90% вопросов снимется.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Я вот о чем беспокоюсь:
Код:
Проба3 создала и убила аргумент функции. А вот так, возвращает 5 Код:
В целом все стало на свои места. Последний раз редактировалось Supermax, 25.10.2010 в 23:39. |
||||