CAD БИБЛИОТЕКА
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,977

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 1669661
 
Непрочитано 29.04.2020, 22:25
#3901
Browning Zed


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


Всем привет! Подскажите, как можно преобразовать строку, в которой содержится ряд цифр в числовое значение? Например, имеется строка "402". Как из нее получить значение 402, чтобы в дальнейшем с ним можно было работать как с числом (например, вставить в формулу).
Browning Zed вне форума  
 
Непрочитано 29.04.2020, 22:31
1 | #3902
AlexSheep


 
Регистрация: 08.09.2010
Москва
Сообщений: 27


atoi
AlexSheep вне форума  
 
Непрочитано 29.04.2020, 22:42
#3903
Browning Zed


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


А в чем отличие atoi от read заключается?
Browning Zed вне форума  
 
Непрочитано 29.04.2020, 22:59
#3904
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 1,751


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
А в чем отличие atoi от read заключается?
Если аргумент содержит только
Цитата:
Сообщение от Browning Zed Посмотреть сообщение
ряд цифр
, то ничем.
SetQ вне форума  
 
Непрочитано 29.07.2020, 18:12
#3905
modest-bp


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


Здравствуйте!

Подскажите, пожалуйста, какая структура лучше (наверняка у этих вариантов есть какие-то названия, но я их не знаю, поэтому постараюсь обозначить схематично):

Вариант 1 ("главная" функция оборачивает собой определения всех остальных функций):

Код:
[Выделить все]
 (defun funMain ()
    (defun fun2 ())
    (defun fun3 ())
    (fun2)
    (fun3)
)

Вариант 2 ("главная" функция только вызывает другие функции, а определения их даются вне "главной")

Код:
[Выделить все]
 (defun funMain ()
    (fun2)
    (fun3)
)
(defun fun2 ())
(defun fun3 ())

Вариант 3 (Имеется только одна громоздкая функция, внутри которой вшиты все необходимые процедуры)
Код:
[Выделить все]
 (defun fun ()
  .......
      ........
         ........
      .......
    ........
)
Варианты 1-2 и 2-2 (Частные случаи вариантов 1 и 2, когда функции последовательно ссылаются одна - на другую
Так, вариант 1-2 - "матрёшка": определение каждой последующей функции лежит в теле той, которая её вызывает.
Вариант 2-2 - "лесенка": каждая функция вызывает следующую, но определения функций лежат отдельно.

С точки зрения написания самого кода и ориентирования в нём самым удобным вариантом видится 2-й, а самый жуткий - 3-й.
Интуитивно кажется, что если процедуры внутри функции не повторяются, то 3-й вариант должен быть самым быстрым и жрущим минимум ресурсов.

Но есть ли разница между 1, 2 (и 1-2, 2-2) вариантами с точки зрения их обработки (с точки зрения программирования она понятна)?

Куда во 2-м варианте деваются функции, объявленные вне основной после того, как основная будет выполнена? Выгружаются, или остаются висеть в памяти?

Выгружаются ли функции, объявленные внутри "материнской" после выполнения "материнской"? А после полного завершения работы всех процедур?

Как эти варианты соотносятся с точки зрения скорости обработки?

П.С. Что происходит с объявленными функциями и подгруженными переменными при аварийном выходе (ESC или ошибка)?
П.П.С. Существует ли возможность вычистить память от мусора, не закрывая документ?

Последний раз редактировалось modest-bp, 29.07.2020 в 18:37.
modest-bp вне форума  
 
Непрочитано 29.07.2020, 20:37
#3906
Кулик Алексей aka kpblc
Moderator

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


С точки зрения скорости, по-моему, одинаково. Но у тебя неправильно написано:
Код:
[Выделить все]
 ;; Вариант 1
 (defun funMain (/ fun2 fun3)
    (defun fun2 ())
    (defun fun3 ())
    (fun2)
    (fun3)
)
Только в таком случае он будет отличаться от варианта 2.
Вариант 3 подойдет, если локальные функции будут вызываться только один раз.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.07.2020, 22:22
#3907
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 8,851


modest-bp,
Имхо, почитайте книгу "САПР на базе AutoCAD - как это делается" - тут даже на форуме выкладывалась в этом году.

Цитата:
Сообщение от modest-bp Посмотреть сообщение
Выгружаются ли функции, объявленные внутри "материнской" после выполнения "материнской"? А после полного завершения работы всех процедур?
а куда они выгрузятся?) код загрузился и загрузился, это память под данные может выделяться и освобождаться.. а может выделяться и оставаться занятой - так называемая утечка памяти.
Сергей812 вне форума  
 
Непрочитано 29.07.2020, 23:10
#3908
modest-bp


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Но у тебя неправильно написано:
;; Вариант 1
(defun funMain (/ fun2 fun3)
(defun fun2 ())
(defun fun3 ())
(fun2)
(fun3)
)
Что-то у меня лыжи не едут...
Функции объявляются как локальные переменные?
А как же "warning: local variable used as function"?

Вот, даже специально повторил этот пример:


Я, наверное, что-то не так понял в этом примере? Потому как у меня "Варианте 1" внутренние функции не объявлялись в локальных переменных "материнской" функции...

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
С точки зрения скорости, по-моему, одинаково
Так что, выходит, можно смело делать, как удобно? Т.е. объявлять функции вне тела основной - это вполне "чистое" и "правильное" решение? А ведь, главное, оно легко читаемое, с таким кодом проще всего обращаться: сделал много "заготовок" - и в новых программах просто обращаешься к ним, а их - выписываешь внизу под кодом основной функции... Удобно же, когда код длинный с большим количеством условий, циклов и т.п...

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а может выделяться и оставаться занятой - так называемая утечка памяти
Она происходит только при аварийном завершении процедуры, или "течёт" всегда, поскольку подо все объявленные функции выделяется память, которая потом ими же и остаётся занятой?
Вот просто по логике, мне так кажется, если "вложенные" функции объявляются внутри "материнской" (их вызывающей), то при завершении выполнения всех "материнских" процедур они должны бы освободить место.
А в ситуации, когда функции объявляются вне тела вызывающей их функции, мне так кажется, существует высокая вероятность того, что они будут продолжать занимать память и после того, как "материнская" функция своё отработает... Нет?
modest-bp вне форума  
 
Непрочитано 29.07.2020, 23:29
#3909
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 8,851


Цитата:
Сообщение от modest-bp Посмотреть сообщение
Она происходит только при аварийном завершении процедуры, или "течёт" всегда, поскольку подо все объявленные функции выделяется память, которая потом ими же и остаётся занятой?
аварийное завершение процедуры - это когда она упала вместе с программой нафиг). Утечка памяти - это неправильная спроектированная архитектура программы/процедуры/функции - т.е. кривые руки программиста.

Цитата:
Сообщение от modest-bp Посмотреть сообщение
Вот просто по логике, мне так кажется, если "вложенные" функции объявляются внутри "материнской" (их вызывающей), то при завершении выполнения всех "материнских" процедур они должны бы освободить место.
есть код, есть данные. Код никуда не девается, локальные переменные должны автоматически освобождаться после выхода из функции, глобальные переменные - нет. А со всей этой матрешкой из функций скоро сами запутаетесь просто. Почитайте книжку - там и про организацию кода в лиспе тоже есть, насколько помню.
Сергей812 вне форума  
 
Непрочитано 29.07.2020, 23:52
#3910
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от modest-bp Посмотреть сообщение
warning: local variable used as function
Забей. Но только на это сообщение.

----- добавлено через 45 сек. -----
Цитата:
Сообщение от modest-bp Посмотреть сообщение
когда код длинный с большим количеством условий, циклов и т.п..
Разделяй и властвуй. Последуй совету Сергей812, он дело говорит.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2020, 12:27
#3911
modest-bp


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Разделяй и властвуй
Коротко и ясно. Понял) Спасибо!
modest-bp вне форума  
 
Непрочитано 30.07.2020, 14:32
| 1 #3912
Кулик Алексей aka kpblc
Moderator

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


Лично я лентяй. И если один и тот же код длиной больше 5-10 строк приходится повторять больше чем 1 раз, я из него делаю функцию (локальную или глобальную - это уже другой вопрос). Может, это неправильно, может - нет, не знаю.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.08.2020, 16:52
#3913
Browning Zed


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


Всем привет!
Есть код который подсчитывает количество определенных блоков в чертеже и отображает информацию в командной строке.
Код:
[Выделить все]
 (defun c:BLCT ( / cnt )
  (setq cnt (itoa (sslength (ssget "x" '((0 . "INSERT")(2 . "Мой_блок"))))))
  (princ cnt)
  (princ)
 )
Как сделать то же самое для блоков имеющих несколько состояний видимости? Нужно два варианта:
1. Подсчет количества всех вхождений заданного динамического блока.
2. Подсчет количества определенного состояния видимости всех вхождений заданного динамического блока.
Browning Zed вне форума  
 
Непрочитано 22.08.2020, 17:28
#3914
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 8,851


не все так просто с динблоками - выборку с фильтрами не применить, скорее всего на лиспе перебирать все блоки придется.
Сергей812 вне форума  
 
Непрочитано 23.08.2020, 22:30
#3915
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,544


Dynamic Block Counter не подойдет?
skkkk вне форума  
 
Непрочитано 16.09.2020, 15:55
#3916
gnuvse


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


Добрый день.

Пожалуйста подскажите несколько моментов:
1. Как программно задать определенный contents для mleader?
2. Можно ли как-то программно сделать mleader, а то AddLeader не очень
gnuvse вне форума  
 
Непрочитано 16.09.2020, 20:04
1 | #3917
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,544


gnuvse, в этом посте есть описание функции draw-mleader. Там и ее содержимое, и ее построение в коде имеется.
skkkk вне форума  
 
Непрочитано 23.09.2020, 14:23
#3918
gnuvse


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


Здравствуйте.

Пожалуйста накидайте ссылок на хорошие лисп исходники для изучения и понимания
Интересующие темы:
создание таблица и их заполнение
чтение данных из блоков
gnuvse вне форума  
 
Непрочитано 23.09.2020, 14:32
#3919
Кулик Алексей aka kpblc
Moderator

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


А если в гугле поискать именно по таким словам?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.09.2020, 21:26
#3920
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А если в гугле поискать именно по таким словам?
Вы правы, но у меня низкая квалификация для оценки чужого кода, поэтому я пришел сюда с данным вопросом.
Если я взялся осваивать, то хотелось бы учиться по программе, которую написал опытный разработчик, например вы

Поэтому, если вам не сложно, то скиньте пару примеров исходников, я думаю мне надолго хватит вникать.
gnuvse вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Система Техэксперт дает уверенность в правильности и эффективности принимаемых инженерных решений!
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 270 19.07.2020 23:34
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46