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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > defun и факультативный аргумент

defun и факультативный аргумент

Ответ
Поиск в этой теме
Непрочитано 10.03.2011, 23:56 #1
defun и факультативный аргумент
baaba
 
архитектор
 
Москва
Регистрация: 07.07.2007
Сообщений: 664

Скажите пожалуйста, можно ли с defun использовать факультативные аргументы? Например:
Код:
[Выделить все]
(defun foo (a b _c) (* a b _c))
при том что a, b - обязательные параметры, а _c можно указать а можно и не указывать.

И ещё хотел узнать, какие есть функции для работы с массивами, где почитать?

Спасибо!
Просмотров: 4944
 
Непрочитано 11.03.2011, 00:24
#2
Кулик Алексей aka kpblc
Moderator

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


В lisp'e все аргументы обязательны. Другой вопрос, что это можно немного обойти: http://autolisp.ru/2009/10/21/lisp-overloading/
Весь лисп - для работы с массивами. Точнее, со списками. Что конкретно интересует?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.03.2011, 00:45
#3
gomer

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


Цитата:
Сообщение от baaba Посмотреть сообщение
при том что a, b - обязательные параметры, а _c можно указать а можно и не указывать.
как пример для размышления, посмотрите функцию strcase
а массивы влиспе есть только безопасные
gomer вне форума  
 
Автор темы   Непрочитано 11.03.2011, 00:50
#4
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Другой вопрос, что это можно немного обойти: http://autolisp.ru/2009/10/21/lisp-overloading/
Спасибо!!
Цитата:
Весь лисп - для работы с массивами. Точнее, со списками. Что конкретно интересует?
Есть ли какие то функции для получения смешанного произведения по методу треугольников?
Есть ли что то подобное вот этому:

http://www.wolframalpha.com/input/?i=det%28{{7.5%2C+6.25%2C+z-18}%2C+{0%2C+25%2C+18}%2C+{15%2C+0%2C+-18}}%29

Что бы сразу определить детерминанту.
Правилен ли подход к решению методом треугольников матриц, использованный мной тут:

http://forum.dwg.ru/showthread.php?p=714567
baaba вне форума  
 
Непрочитано 11.03.2011, 08:42
#5
Лиспер


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


gomer, функции, написанные на С++, могут иметь необязательные аргументы (нормальная полноценная перегрузка функций). lisp подобным механизмом не обладает
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 11.03.2011, 11:26
#6
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от gomer Посмотреть сообщение
как пример для размышления, посмотрите функцию strcase
а массивы влиспе есть только безопасные
Как strcase может реализовать факультативный аргумент???
baaba вне форума  
 
Непрочитано 11.03.2011, 18:26
#7
gomer

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
функции, написанные на С++, могут иметь необязательные аргументы (нормальная полноценная перегрузка функций). lisp подобным механизмом не обладает
Цитата:
Сообщение от baaba Посмотреть сообщение
Как strcase может реализовать факультативный аргумент???
Еще раз повторю пост #3
Код:
[Выделить все]
 (defun test (_AVal1 _AVal2 / Val2 Val1 #Val2 )

 (setq
  #Val2 "abracadabra"
  Val1  (some_func1 AVal1)
  Val2  (some_func2 (cond (_AVal2) (#Val2))))

 (some_func3 Val1 Val2 )

)
gomer вне форума  
 
Непрочитано 11.03.2011, 18:30
#8
Кулик Алексей aka kpblc
Moderator

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


Ничего не понял
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.03.2011, 18:41
#9
gomer

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ничего не понял
Объясню, Способ в #2 хорош, например при создании примитивов, обработке массива точек...
Если исходные данные имеют всего несколько параметров, то можно задавать параметры как nil и программа, видя такое, будет подхватывать значения по умолчанию, например
Код:
[Выделить все]
 (eq (test 0 "abracadabra") (test 0 nil) )
gomer вне форума  
 
Непрочитано 11.03.2011, 19:01
#10
Кулик Алексей aka kpblc
Moderator

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


По моему личному опыту: если параметров больше 2, а функций хотя бы десяток, то удержать их в памяти - какой параметр что означает и в какой последовательности они идут... Уже тяжко.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.03.2011, 19:30
#11
gomer

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
если параметров больше 2, а функций хотя бы десяток, то удержать их в памяти - какой параметр что означает и в какой последовательности они идут... Уже тяжко.
Это не фатально, ведь параметры несут смысловую и логическую нагрузку...
gomer вне форума  
 
Непрочитано 11.03.2011, 19:34
#12
Кулик Алексей aka kpblc
Moderator

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


Отлично! Что делает такая строка:
Код:
[Выделить все]
(setq res (fun_loc-get loc_file loc_g loc_v))
Что надо подставлять?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.03.2011, 20:43
#13
gomer

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



Код:
[Выделить все]
 (setq r (flg lf lg lv))
так вот будет понятнее
Цитата:
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 comuter 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 discriptive 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.

Some times 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.
gomer вне форума  
 
Непрочитано 12.03.2011, 00:33
#14
VH_


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


«В lisp'e все аргументы обязательны...»
Скорее, в диалекте AutoLISP все аргументы (defun) обязательны.
А в CommonLISP (и XLISP-PLUS) возможностей побольше:
(defun имя (обязательный_аргумент... &optional необязательный_аргумент... &rest оставшийся_аргумент &key ключевой_аргумент... &aux локальный_аргумент...) ...)
Предлагаемый аргумент-список скорее соответствует &rest оставшийся_аргумент.
VH_ вне форума  
 
Непрочитано 12.03.2011, 06:06
#15
ShaggyDoc

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


Вроде все правильно пишут, но как-то заумно, чтобы запутать новичков.
Давайте проще:

1. Рассматриваем только диалект LISP, используемый в AutoCAD.

2. LISP-функции могут быть двух видов:

а) Штатные, а также экспортированные из ARX. В таких функциях может быть переменное количество аргументов. Они написаны не на AutoLISP, а возможность "факультативных" переменных определяется языком реализации.

б) "Пользовательские", написанные на самом AutoLISP. В таких фунциях не может быть переменного количества аргументов. Сколько "штук" записано в определении defun, столько "штук" и должно передаваться в каждом вызове.

А вот типы аргументов могут быть любые. В том числе и список. А уж в самом списке может быть любое количество элементов. Если, например, нужна функция обработки заранее неизвестного количества точек, то точки должны передаваться одним аргументом - списком. Обработка списка должна производиться внутри функции.

Некоторые аргументы могут передаваться в виде NIL. Обычно предполагается, что внутри функции такие аргументы заменяются на какие-то значения по умолчанию.

Вот, для примера, определение функции рисования полилинии:

Код:
[Выделить все]
 (defun ru-pline-add (points is_closed width lineweight ltype / ....)

.....

)
Здесь аргументы:

points - список координат вершин

is_closed - признак замкнутости или NIL, если не замкнута

width - физическая ширина полилинии или NIL, если использовать текущую.

lineweight - "вес" полилинии или NIL, если использовать текущий

ltype - тип линииили NIL, если использовать текущий

Количество аргументов при вызове всегда должно быть ровно 5. Количество вершин в списке points может быть любым.

PS. Слово "массив" в отношении LISP лучше вообще не употреблять - это происки "сионистов". Чтоб охмурить...
ShaggyDoc вне форума  
 
Непрочитано 12.03.2011, 10:39
#16
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
функции, написанные на С++, могут иметь необязательные аргументы (нормальная полноценная перегрузка функций). lisp подобным механизмом не обладает
Это как посмотреть, я например считаю что т.к. в С подобных языках, нет возможности работать с символьными списками переменной длинны (теперь уже стало можно работать с перемеными массивами), поэтому чтобы восполнить данный недочет им пришлось сделать "перегрузку", хотя по сути это еще одна доп функция, определенная внутри фукции. В лиспе можно создать еще одну функцию с другим кол-вом аргументов. Разница лишь в том, что в лиспе функции будут называться по разному, а в Си одинаково. От кол-ва кода это никак не спасает, а кол-во кода ведет к объему работы и к увеличению ошибок, так что толку от перегрузки - ноль.
Например в Framework метод Concat имеет несколько перегрузок, куда можно ввести две, либо три, либо четыре строки. Гениальная реализация, человеку писавшему на лиспе просто не понятно почему нельзя конкатенировать сколько угодно строк, а когда узнаешь как реализовать конкатенацию произвольного кол-ва строк, плохо становится. Это вобщем-то не сложно, но чтобы пойти этим путем нужно быть профи, и чтобы написать даже простенькую программку нужно понимать все принципы ООП.
Sleekka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > defun и факультативный аргумент



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение разбитого на слова текста Mist AutoCAD 46 24.05.2020 21:08
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
AutoCAD2010 выдает 82 отчета об ошибке за раз Nusia AutoCAD 22 29.08.2012 16:11
Express Tools Bugs ( Ошибки Express Tools ) VVA Программирование 49 02.02.2012 20:35
3D Konstruktor для проектировщиков КМ. Дима_ Готовые программы 17 10.07.2008 10:03