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

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

AutoLISP: Просачивание локальных переменных в тело используемых в выражении функций

Ответ
Поиск в этой теме
Непрочитано 25.10.2010, 20:26
AutoLISP: Просачивание локальных переменных в тело используемых в выражении функций
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Или я плохо читал книги по Автолиспу, или у меня глюки:

Случайно создал функцию, где напутал с именем локальной переменной

Код:
[Выделить все]
(defun proba (ss) (* x 2))
Видите, аргумент определен как переменная ss, а в формуле стоит не ss, а x.

Беру такое выражение:
Код:
[Выделить все]
(mapcar '(lambda (x) (vl-catch-all-apply  'proba (list x))) '(2 3 4))
и работает!

Каким-то макаром этот X "спустился" в тело функции через ее аргумент, хотя тот назван совсем иначе.

Кстати сказать
Код:
[Выделить все]
(defun proba (ss) (* ss 2))
так тоже работает.

Я очень часто использую локальное определение аргумента одной буквой, вот теперь призадумался.

Может кто знает более подробно про такие пироги?
Просмотров: 4641
 
Непрочитано 26.10.2010, 00:10
#21
Li6-D


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


Вот мы не задумаемся и используем в программах число Pi, как глобальную переменную.
А зловредный автор может включить в свою функцию строчку (setq Pi 3.14286) или более замысловато:
Код:
[Выделить все]
(eval
  (list
    (read (apply 'strcat (mapcar 'chr '(115 101 116 113))))
    (read (apply 'strcat (mapcar 'chr '(112 105))))
    (/ 22 7.)
) )
и не объявит новоиспеченную Pi в локалках своей функции.
Мелочь, а неприятная, по крайней мере в текущем сеансе.
К чему это я? Наверно к тому, что сложно создать помехозащищенный код, если не глядя заимствовать из непроверенных источников...
Li6-D вне форума  
 
Непрочитано 26.10.2010, 00:18
#22
Кулик Алексей aka kpblc
Moderator

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


Li6-D, так я и символ t могу переопределить (по крайней мере теоретически).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.10.2010, 00:27
#23
Li6-D


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


Да, t тоже можно. А nil не получается - синтаксическая ошибка
То есть ложь в отличии от истины устойчива.

А можно переопределить и функции:
Код:
[Выделить все]
(defun 1+ (x) (IF (= (type x) 'INT) (+ 1 x) (+ 1.0001 x)))
Эта функция врет, но не всегда и немного. Ладно, хватит с вредными советами...

Последний раз редактировалось Li6-D, 26.10.2010 в 00:59.
Li6-D вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLISP: Просачивание локальных переменных в тело используемых в выражении функций