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

Вернуться   Форум 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.
Просмотров: 1633595
 
Непрочитано 29.04.2020, 22:25
#3901
Browning Zed


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


Всем привет! Подскажите, как можно преобразовать строку, в которой содержится ряд цифр в числовое значение? Например, имеется строка "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
Сообщений: 52


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

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


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


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


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

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

Вариант 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,513


С точки зрения скорости, по-моему, одинаково. Но у тебя неправильно написано:
Код:
[Выделить все]
 ;; Вариант 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,267


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

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


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


Цитата:
Сообщение от Кулик Алексей 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,267


Цитата:
Сообщение от 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,513


Цитата:
Сообщение от 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
Сообщений: 45


Цитата:
Сообщение от Кулик Алексей 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,513


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

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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