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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1973271
 
Непрочитано 15.10.2014, 00:16
#2281
Кулик Алексей aka kpblc
Moderator

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


Я хоть убей не понимаю необходимости использования vla-eval вместо обычного eval.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.10.2014, 12:16
#2282
Сергей812


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


Добрый день. В программах на lisp регулярно встречается конструкция "loc:" - но не могу найти никак, для чего она. Подскажите, пожалуйста, где можно про нее почитать?
Сергей812 вне форума  
 
Непрочитано 15.10.2014, 12:17
#2283
Кулик Алексей aka kpblc
Moderator

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


Скорее всего, это имя (или часть имени) переменной.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.10.2014, 12:31
#2284
Сергей812


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


Т.е, например, в определение функции
Код:
[Выделить все]
 (defun loc:catch (func / ret)
...
)
loc: - это лишь часть имени? Просто часто встречаю достаточно в примерах кода, подумал, что это какой-то модификатор доступа. Поискал по книжкам Полещука и Зуева, в электронном виде по форумам - ничего определенного не нашел.
Сергей812 вне форума  
 
Непрочитано 15.10.2014, 12:33
#2285
Кулик Алексей aka kpblc
Moderator

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


Имя переменной / функции в лиспе не может содержать, насколько я помню, символы ";", "(", ")" и " ". Остальные, кажется, вполне допустимы. Ну и зарезервированные имена лучше не переопределять )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.10.2014, 12:41
#2286
Сергей812


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


kpblc, Спасибо) значит, видимо просто пометка - что локальная функция, переменная.
Сергей812 вне форума  
 
Непрочитано 15.10.2014, 13:26
#2287
skkkk


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


Сергей812, тоже задавался в свое время этим вопросом. Пришел к однозначному выводу: двоеточие в имени функции или переменной есть не что иное, как система обозначений, принятая неким автором или сообществом авторов кодов для обеспечения (в том числе и себя же в последующем) понимания логики кода. Многие вместо двоеточия используют тире. Еще один пример: знаменитый Lee Mac предваряет свои функции префиксом LM:. Больше ничего это не значит. Исключение, по-видимому, составляет C:, вроде что-то еще было, но не припомню.
Вот, кстати, вспомнил про двоеточия в методах функции ssget. Насколько я разобрался, комбинировать можно ТОЛЬКО методы с двоеточием. И так и не смог разобраться, что означают и каким образом применять затронутые описанием у Полещука, как недокументированнные, методы, наследуемые от соответствующих функций ObjectARX ("M", ".", "#", ":O", ":$" и т.д.). Кто знает, о чем речь?
skkkk вне форума  
 
Непрочитано 15.10.2014, 14:34
#2288
ShaggyDoc

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


Цитата:
Пришел к однозначному выводу: двоеточие в имени функции или переменной есть не что иное, как система обозначений, принятая неким автором или сообществом авторов кодов для обеспечения (в том числе и себя же в последующем) понимания логики кода. Многие вместо двоеточия используют тире.
Именно так. Вводят свои префиксы для удобства понимания кода. Кто-то любит двоеточие. У меня у всех функций префикс "ru-", у низкоуровневых "_ru-". А в именах переменных разлелитель слогов всегда "_", что легко позволяет отличить переменную от функции. Глобальные переменные заключаю в ** и пишу в верхнем регистре.

И классический пример в AutoLisp Tutorial где все функции с префиксом GP: и пояснение
Цитата:
These names are prefixed with gp: to indicate they are specific to the garden path application. This is not a requirement, but it is a good naming convention to use to distinguish application-specific functions from general utility functions you frequently use.
ShaggyDoc вне форума  
 
Непрочитано 16.10.2014, 07:01
#2289
tehkonst


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
что легко позволяет отличить переменную от функции
Я все функции, с глагола начинаю. Если что-то получить - get: getPoint, getArea. Если что-то нарисовать - draw: drawTangent, drawWall и т.д.
tehkonst вне форума  
 
Непрочитано 16.10.2014, 11:16
#2290
skkkk


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


Offtop: tehkonst, при таком подходе при выполнении функции
Цитата:
Сообщение от tehkonst Посмотреть сообщение
getPoint
можно удивиться
skkkk вне форума  
 
Непрочитано 16.10.2014, 12:32
#2291
tehkonst


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


Offtop: Не вижу ничего странного. В любом ооп так принято методы называть.
tehkonst вне форума  
 
Непрочитано 16.10.2014, 12:51
#2292
Кулик Алексей aka kpblc
Moderator

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


tehkonst, намек: ты про зарезервированные слова наверняка слышал...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.10.2014, 14:16
#2293
ShaggyDoc

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


Цитата:
Я все функции, с глагола начинаю
Хоть как можно начинать, лишь бы была система. У меня около 3000 функций разного назначения (компилируемых в один файл библиотеки), да еще несколько сотен "функций-программ". Без системы в именовании (а также без раскладки по папкам) в них не разобраться. Помимо системы имен, еще каждая функция в отдельном файле, да в своем каталоге.
И конечно нельзя "штатные" имена применять.
Цитата:
В любом ооп так принято методы называть
Так то в ООП. Там внутри разных классов могут быть одинаковые имена, и это как раз хорошая практика. Но это не в Автокадовском Лисп.
Вот у меня для ввода точки куча функций:
Код:
[Выделить все]
 ru-get-point-reguired
ru-get-point-or-lw-or-exit
ru-get-point-or-lw-or-continue-or-exit
ru-get-point-or-exit-or-kword-base
ru-get-point-or-exit-base
ru-get-point-with-offset
ru-get-point-reguired-with-offset
ru-get-point-or-exit-with-offset
ru-get-point-or-exit-or-kword-base-with-offset
ru-get-point-or-exit-base-with-offset
ru-get-point-in-angle-with-offset
ru-get-point-or-exit
ru-get-point-on-ent
ru-get-point-and-ang-on-ent
ru-get-corner-reguired.lsp
Условно это всё разные "методы" ввода точки. Но это не ООП. А вот система имен позволяет очень облегчить собственную работу.
ShaggyDoc вне форума  
 
Непрочитано 16.10.2014, 18:15
#2294
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


раз уж снова пошел такой срач
Цитата:
LESSON 5 VARIABLES:
Variables are used as the principle means to store values. Files may also be used to store values, but variables are what store values for short term use.
AutoLisp variables may be any of (4) four "types"; integer, real, point, and string. Variables in AutoLISP are automatically "typed" depending on the value they contain, so no "typeing" of variables is required.
The function "setq" will be used to create a variable. A variable will contain a nil value until some value is bound to it. If you reference a variable before you have assigned a value to it, you will receive nil as the result of the reference.
(setq a 3) ;Integer variable
(setq a 3.00) ;Real variable
(setq a (list 1.50 2.375 1.00) ;Point variable
(setq a "This is a string.") ;String variable
VARIABLE NAMING:
When we discussed comments in lesson 3, we neglected to touch on the easiest method of commenting of all; variable names. If you use proper variable names, much of your code can be self-documenting. You need only add comments to code which is not clear simply by reading it.
Variables can be named anything you want providing the first character is alphabetic, and you don't use the reserved characters from lesson 2.
Many AutoLISP programmers try to keep variable names to (6) six characters or less. This is due to the way variables are stored in AutoLISP. If a variables name is less than 6 characters AutoLISP only requires (2) two nodes to store the value. If you make the variable name longer than (6) six characters, AutoLISP stores the value in one node and stores a pointer to the name in the other node. The name itself is stored in memory taken from the heap for string storage. Heap space is limited and that is why some programmers try to keep variable names short.
Two things have happened that makes this rule not so carved in stone as it used to be. The advent of virtual memory and learning how to program cleanly have done much to solve the problem of running out of memory. I can't do much about the amount of memory in your computer or the amount of memory AutoCAD needs, but I can show you how not to run out of memory by programming in a clean manner.
Anyway, back to naming variables.
Naming a variable is not like naming the family pet, you can't choose a name cause it's cute or it's what the variable looks like. You need to choose names based on what it is the variable holds. You must look at the variable and its name as being the same thing. If you can't tell what the variable is, maybe you don't need the variable anyway.
If a variable holds the point for a line, state that in the variable name. First tell which line, and then tell which point. Variables can be named well or they can be named badly, it's all up to you.
Good:
CenterLineStart
CtrLnStrt
CtrLnEnd
Bad:
C1 ;Start of centerline
C2 ;End of centerline
The bad variable names have been made sightly more palletable by the use of comments to say what they are, but the good variable names are much more descriptive and require no comments. Anyone who has programmed for awhile knows comments rarely come easy and sometimes not at all. It is better to give your variables names which do not need explained, so a missing comment later will not lead to confusion about what the variable is holding.
Also note that end-line comments no matter how well done, clutter up code and make it harder to read. If you can avoid using end-line comments, you will be much better off.
Sometimes you have many variables that seem to hold the same type values. They may seem the same but there is always something different about them that the name can tell you.
Good:
TapDrillCenterLineStart
TapDrCtrLnStrt
TapDrCtrLnEnd
TapCenterLineStart
TapCtrLnStrt
TapCtrLnEnd
Bad:
TDCS
TDCE
TDS
TDE
I have seen programmers go as far as giving many pages of comments to explain what each of thier variables was supposed to hold. Having a decoder ring is no substitute for proper variable naming. If you give full variable names you will have alot less commenting and alot easier time when hunting problems.
Index variables ...
Indexes through a loop are one of the areas where it is sometimes difficult to come up with a name. Many programmers have a name they give to all indexes, such as Index, Idx, Ndx, or some such thing that they are comfortable looking at. They know when they read their code what these things are, but others may not.
If you are going to use short names for indexes be sure to tell what it is that you are indexing through.
Good:
PointNdx
ListNdx
FileNdx
Bad:
x
Idx
Ndx
An index variable is like any other variable and needs a proper name to be truly understood.
Status variables ...
Status variables should be given names better than "flag". Everyone seems to use flag for status variables. The first thing we have to do to give truly meaningful names to variables, is get away from thinking about our problems from the viewpoint of the computer. A flag tells if something is right or wrong, it should be given a name that reflects the item we are checking.
Good:
FileDone
PrintDone
SortDone
Status variables are not used extensively in AutoLISP programming, but if you use them, give them real names.
Naming guidelines ...
Variables should be named in a manner that also identifies their scope and / or type.
GLOBAL variables should be identifiable as such by reading their name. Some people use prefix or suffix notations to accomplish this. An example would be to add a g or g_to the beginning of the variable name:
gScrewList
This identifies the variable as a list that is available to all the functions in your program. I am not a fan of putting the "_" character in variable names as a separator. I prefer the naming convention where you capitalize the first letter of each word or abbreviation in the variable name.
CONSTANTS are normally capitalized as a way of identifying them. They stand out from the rest of your code so you know they are a constant.
INPUT variables, which are parameters to a function, should not be modified inside the function. It is recommended that you identify input variables so if you see one getting modified you can do something else.
It will be a lot easier to read your code and tell which variables are
parameters if you identify them in the name. An "i" or "ip" may be
prefixed to the name to identify them.
gomer вне форума  
 
Непрочитано 24.10.2014, 04:46
#2295
Curiosity

Конструктор
 
Регистрация: 10.03.2014
Якутск
Сообщений: 18


Доброго времени суток!
Можно ли сформировать один набор, выбором нескольких рамок (ssget "_W" (pt1 pt2) (pt3 pt4)...)?
Curiosity вне форума  
 
Непрочитано 24.10.2014, 07:12
1 | #2296
skkkk


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


Цитата:
Сообщение от Curiosity Посмотреть сообщение
Можно ли сформировать один набор, выбором нескольких рамок (ssget "_W" (pt1 pt2) (pt3 pt4)...)?
Нельзя. Можно создать несколько наборов, а потом объединить их. LISP : Как объединить два набора в один?
skkkk вне форума  
 
Непрочитано 27.10.2014, 04:57
#2297
Curiosity

Конструктор
 
Регистрация: 10.03.2014
Якутск
Сообщений: 18


Цитата:
Сообщение от skkkk Посмотреть сообщение
Нельзя. Можно создать несколько наборов, а потом объединить их. LISP : Как объединить два набора в один?
Спасибо за ссылку
А как можно сделать так чтобы
(command "_rectang" pause pause)
повторялось до тех пор пока пользователь не нажмет enter или space?
Curiosity вне форума  
 
Непрочитано 27.10.2014, 13:13
#2298
skkkk


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


Вариант 1 (лисп):
Код:
[Выделить все]
(defun C:MULTIRECTANG ()
	(while t
		(command "_RECTANG" pause pause)
	)
)
Ввариант 2 (макрос со звездочкой на кнопку):
Код:
skkkk вне форума  
 
Непрочитано 28.10.2014, 02:41
#2299
Curiosity

Конструктор
 
Регистрация: 10.03.2014
Якутск
Сообщений: 18


Это не совсем то что мне нужно
Мне надо прервать _rectang без прекращения работы лиспа, чтобы лисп дальше выполнялся
(defun c:.... ()
........
(while (not ("Проверка нажатия enter или space"))
(command "_rectang" pause pause)
)
........
)
Curiosity вне форума  
 
Непрочитано 28.10.2014, 19:11
#2300
kurstep


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


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

Размещение рекламы


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