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

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

Есть ли в Autolisp возможность задавать необязательные параметры для функций?

Ответ
Поиск в этой теме
Непрочитано 03.07.2016, 16:25
Есть ли в Autolisp возможность задавать необязательные параметры для функций?
valerik88
 
Регистрация: 02.07.2016
Сообщений: 249

Во многих языках программирования есть возможность создавать функции с необязательными параметрами.
Т.е. хочу вызываю её с параметрами (somefunction param), а хочу вызываю без параметров (somefuntion)
Есть ли подобная возможность в Autolisp?
Просмотров: 6391
 
Непрочитано 15.07.2016, 08:04
#21
Кулик Алексей aka kpblc
Moderator

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


http://forum.dwg.ru/showpost.php?p=1548015&postcount=2 и далее - не?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.07.2016, 09:12
#22
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


не - будет честная функция запускаемая из ком. строки автокада (из лисп файлов так-же будет работать) без всяких прелюдий типа eval и пр.
Будет корректно работать и возрващать ожидаемый результат:
Код:
[Выделить все]
 (my-fun 1)
(my-fyn 1 2)
(my-fun 1 2 3)
Я гарантирую это

----- добавлено через ~4 мин. -----
Решение элементарное - еще раз повторю - практически этот метод не сильно пригоден - включайте смекалку - как создать такую функцию средствами автолиспа и только ими - знаний у каждого участника темы более чем достаточно для его реализации.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.07.2016, 20:36
#23
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,186
<phrase 1=


кто молодец? я молодец!
Код:
[Выделить все]
 
(setq my-fun +)
(my-fun 1 2 3)
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 15.07.2016, 21:19
#24
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Зачет!

----- добавлено через ~4 мин. -----
Предлагаю поддержать викторину - кто выдаст следующую задачку.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.07.2016, 11:12
#25
Кулик Алексей aka kpblc
Moderator

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


Задачка та же, только действия посложнее. Ну типа там, изменить цвет и / или тип линии для выбранных объектов / всего файла, с обработкой описаний блоков или без. Количество параметров может быть таким:
0 (установить цвет линии)
0 "hidden" (установить цвет и тип линии)
0 "hidden" t (то же, для выбранных объектов)
0 "hidden" t t (то же, с обработкой описаний блоков)
0 t (устанавливать цвет линии, для выбранных объектов)
0 nil t (цвет, для всего файла, с обработкой описаний блоков)

Вперед?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2016, 14:02
#26
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,186
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вперед?
Тебе с такими задачками - в "Поиск исполнителей"
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 17.07.2016, 19:49
#27
Кулик Алексей aka kpblc
Moderator

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


Apelsinov, я подобные задачи буду решать по методу, описанному в #2 Дима_ просил следующую задачку - я выдал ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.07.2016, 23:15
#28
skkkk


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


Эх, не хватило меня вчера (уже позавчера, уже "в тот день") углубиться в проблему, уточнить условия задачи, и, признаюсь, она меня довольно-таки увлекла. И в свободное от других мыслей время мой мозг посвящал ей...
Однако условия "викторины" можно было понять по-разному.
Задачу
Цитата:
Сообщение от Дима_ Посмотреть сообщение
создать автолисп функцию на чистом автолиспе с переменным количеством аргументов
в какой-то спешке и в свете темы Есть ли в Autolisp возможность задавать необязательные параметры для функций? я воспринял несколько по-своему.
Я почему-то предположил, что в общем виде, эта двоякость задачи должна бы решиться при помощи одного гениального подхода.
Я полагал, что можно на чистом лиспе действительно создать для функции необязательный аргумент, да еще и аргументы при этом могут быть разных типов, ну как в ssget, например.... а тут оказалось, что надо просто "с переменным количеством аргументов"...

Признаться, я слегка разочарован. А где "необязательные параметры"? А где разные типы этих "параметров"? Я думал, что сейчас последует какая-нибудь рекурсия, обернутая в какой-нибудь vl-catch-, которая бы, "прочитав" и проанализировав сообщение об ошибке переопределила бы и вызвала бы сама себя еще разок, а может, и не один... (десяток).
Главным вопросом, терзавшим мой разум, был "А как же мне программно понять, что за аргументы, и какое именно их количество передалось функции в момент вызова?" Ну, чтобы суметь их проанализировать перед "мобильным" её переопределением. Конечно, неоднократные упоминания о незначительной практической пользе меня настораживали, но я слепо объяснял себе это тем, что смысл от этого "достижения" непонятен, и тем, что ничто и никогда не мешало мне поставить nil, если мне не нужен в этом месте аргумент.
Тем более, что из командной строки я обычно функции (с аргументами!) не вызываю.
Тем еще более, что было предложено, причем, неоднократно, весьма, на мой взгляд, гениальное решение скормить функции список любого содержания. Я просто не понимал, зачем над этим думать, если это решение было не нужно, а если было бы и очень нужно "пафосно" и часто пропустить в кодинге необязательный "параметр", то надо просто загнать его в список, а в коде - его проанализировать.
Но было прикольно.
Цитата:
Сообщение от Дима_ Посмотреть сообщение
Предлагаю поддержать викторину - кто выдаст следующую задачку.
Offtop: Есть у меня на примете одна такая. Но она совершенно из другой темы.
skkkk вне форума  
 
Непрочитано 18.07.2016, 07:28
#29
gomer

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Признаться, я слегка разочарован.
да вас Дима_ просто потроллил создать новое описание функции или создать новую ссылку на существующее описание - это не одно и тоже.
gomer вне форума  
 
Непрочитано 18.07.2016, 07:50
#30
ShaggyDoc

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Главным вопросом, терзавшим мой разум, был "А как же мне программно понять, что за аргументы, и какое именно их количество передалось функции в момент вызова?" Ну, чтобы суметь их проанализировать перед "мобильным" её переопределением. Конечно, неоднократные упоминания о незначительной практической пользе меня настораживали, но я слепо объяснял себе это тем, что смысл от этого "достижения" непонятен, и тем, что ничто и никогда не мешало мне поставить nil, если мне не нужен в этом месте аргумент
Размышления правильные. Но следует учитывать, что функции пишутся для программистов, а не для пользователей. Их не нужно вводить в командной строке. И программист должен знать, какие аргументы и каких типов должны передаваться.

Некоторые перестраховываются и в каждой функции проверяют правильность аргументов. Вот это уже излишне.

Что касается практического применения переменного количества аргументов, так выход давно известен - список в качестве одного аргумента или несколько списков. И предложенная Дима_ задача не более, чем "этюд".

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

Теоретически можно передавать и произвольные списки, но тогда потребуется большой анализ, что просто нерационально.

Ну и напомню еще одну интересную возможность Лиспа - передача имени функции в качестве аргумента. Вот есть у меня функция, объявленная так
Код:
[Выделить все]
 (ru-3d-pipe-draw-any  func   param_lst   msg_1pt  msg_2pt     dist_by_vector)
Она предназначена для моделирования в 3D любых элементов трубопроводов. Хоть просто трубы, хоть отвода, хоть тройника, перехода, задвижки или даже насоса.

Здесь аргументами являются

func - "квртированное" имя функции, которая должна что-то из "любого" уметь рисовать. Например (quote ru-3d-pipe-reducer-conc-draw) или (quote ru-3d-pipe-2-flange-draw-revolved)

param_lst - список аргументов для заданной функции рисования. Может быть и (list 159.0 6.0) и (list 159.0 300.0 250.0 25.0 212.0 3.0 68.0 26 8 6.0 nil T). Как эти аргументы обрабатывать - знает только сама функция рисования.

msg_1pt, msg_2pt - тексты приглашений для первой и второй точек.

dist_by_vector - возможное смещение точки.

И внутри ru-3d-pipe-draw-any, если опустить открывающую часть (ввод и вычисления точек start_pnt end_pnt) и завершающую часть само "рисование" происходит просто

Код:
[Выделить все]
 ((eval func)  start_pnt   end_pnt   param_lst )
Вот эта строчка позволяет нарисовать что угодно. Попробуйте сделать так на Бейсике.

А вызов ru-3d-pipe-draw-any с аргументами просто записывается в меню (у меня в XML). И уже пользователь системы "смышленая тётка" самостоятельно может добавлять или изменять набор моделируемых объектов, просто копируя образец вызова и изменяя аргументы
Код:
[Выделить все]
 
(ru-3d-pipe-draw-any (quote ru-3d-pipe-2-flange-draw-revolved) (list   159.0 300.0 250.0 25.0 212.0 3.0 68.0 26 8 6.0 T nil) "Начало фланца" "Безфланцевый конец трубы" nil) - конец трубы с фланцем
(ru-3d-pipe-draw-any (quote ru-3d-bolt-and-nut) (list 20.0 t) "Начало соединяемых деталей" "Конец соединяемых деталей" nil) - болт с гайкой в 3D
(ru-3d-pipe-draw-any (quote ru-3d-line) nil "Начало отрезка" "Направление конца" 500.0)"  - отрезок трубы с выбираемым диаметром, но заданной длины
(ru-3d-pipe-draw-any (quote ru-3d-tee-thread) (list 21.8 60.0 30 T) "Центр тройника" "Направление основного потока" 56.0)"  - тройник для металлопластика
и так далее - сотни вариантов.

Вот что eval животворящий делает!
ShaggyDoc вне форума  
 
Непрочитано 18.07.2016, 10:16
#31
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
Попробуйте сделать так на Бейсике.
легко
trir вне форума  
 
Непрочитано 18.07.2016, 10:47
#32
ShaggyDoc

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


Цитата:
Сообщение от trir Посмотреть сообщение
Не указатели, а строковое имя функции (которое еще и вычислять можно или прочитать). И сделайте, (да в одну строчку кода), а не сошлитесь на "да всякое можно делать".
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Есть ли в Autolisp возможность задавать необязательные параметры для функций?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли возможность вставить в вершины полилинии блоки? bimari AutoCAD 29 04.06.2021 14:49
Есть возможность уменьшить объект в ширину, а длина должна остаться не изменой? виктоша17 AutoCAD 4 29.03.2014 12:32
Есть ли в Civil 3D возможность выравнивания дорожного покрытия? 19th Вертикальные решения на базе AutoCAD 4 30.03.2009 17:48
Запись макросов VBA в ACAD`e; возможность есть? ssv22 Программирование 9 19.02.2009 20:22
Есть ли возможность при вставке блока разрывать линии Незнайка AutoCAD 13 03.04.2006 20:34