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

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

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

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

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

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


Можно, почему нет. Как вариант: http://autolisp.ru/2009/10/21/lisp-overloading/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.07.2016, 15:52
#3
valerik88


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Можно, почему нет. Как вариант: http://autolisp.ru/2009/10/21/lisp-overloading/
Ну насколько я понял из ссылки, создать одну и ту же функцию с параметрами и без нельзя. Можно создать функцию обработчик со списком параметров.
valerik88 вне форума  
 
Непрочитано 04.07.2016, 16:50
1 | #4
Кулик Алексей aka kpblc
Moderator

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


Количество параметров в AutoLISP задается один раз. Полноценного "переопределения" / "перегрузки" функций тут нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.07.2016, 00:12
#5
skkkk


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


Но можно же создать функцию, в которой какой-либо из параметров (или все) может быть nil. Опустить его при запуске функции нельзя, но обработать nil можно в коде функции:
Код:
[Выделить все]
(defun somefunction (param / )
	(if (null param)
		.......
	)
)
А вызывать
Код:
[Выделить все]
(somefunction nil)
Не то?
skkkk вне форума  
 
Непрочитано 06.07.2016, 09:47
#6
Кулик Алексей aka kpblc
Moderator

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


Я так понял, что ТС хочет получить нечто типа:
Код:
[Выделить все]
(fun)
(fun 1)
(fun 1 2)
(fun 3 4 5 6 7 8 9)
Т.е. название функции одно и то же, но количество и/или тип аргументов - разный.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.07.2016, 10:14
#7
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


похоже ТС хочет что бы работало как на VB
Код:
[Выделить все]
Function MyF(a As String, b As String, c As String, _
         d As String, Optional aa As Integer, Optional bb As _
        String) As Variant
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 06.07.2016, 10:36
#8
ShaggyDoc

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


Собственно ответили уже, но для ясности:
1. Автолисп - язык функциональный. В нем нет вообще "параметров", а есть аргументы функций. "Это вам не лезгинка, а твист"!

2. На Автолисп сделать функцию с переменным количеством аргументов нельзя.

3. Но аргументы могут быть разного типа. В том числе списки. В том числе NIL. Как обрабатывать разные типы аргументов должно быть прописано в теле функции.

4. Если один или несколько аргументов являются списками, внутри следует обращаться к элементам списка по их номеру функцией nth или функциями car, cdr и им подобным - как удобнее.

5. Если "нельзя, но очень хочется", надо написать функцию с одним обязательным аргументом. А вызывать её уже можно по разному. Вызов (my_fun nil) будет соответствовать вызову без "параметров", но с одним аргументом, а вызов (my_fun (list 1 2 3 fig vam)) - переменное количество "параметров", но по-прежнему один аргумент.

6. В других языках, где допускается переменное количество аргументов в описании процедуры или функции указывается, какое значение присваивается опущенному при вызове параметру. В Автолисп это надо прописывать внутри тела функции.
ShaggyDoc вне форума  
 
Непрочитано 06.07.2016, 22:24
1 | #9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Средствами ObjectARX и AutoCAD .NET API можно создать lisp-функцию с переменным числом аргументов. По аналогии с некоторыми встроенными функциями AutoLisp, которые тоже могут принимать различное число аргументов. Например, (+ ...) или (mapcar ...)

Последний раз редактировалось Александр Ривилис, 06.07.2016 в 22:37.
Александр Ривилис вне форума  
 
Непрочитано 14.07.2016, 08:31
#10
Дима_

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


!!! ВНИМАНИЕ ОПРОВЕРЖЕНИЕ !!!

В качестве разминки для ума и проверки на смекалку - я даю 100% гарантию, что можно создать автолисп функцию на чистом автолиспе с переменным количеством аргументов, но вот правда практический смысл таких функций будет весьма ограничен - на разгадку даю 2 дня.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.07.2016, 08:40
#11
Кулик Алексей aka kpblc
Moderator

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


Уточнение: функция должна быть именована.
Сильно подозреваю, что ты имеешь в виду определение не через defun, а через defun-q (которым, к стыду своему, я не пользуюсь).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.07.2016, 08:41
#12
Дима_

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сильно подозреваю, что ты имеешь в виду определение не через defun, а через defun-q
не верное направление...
тут не знания, а смекалка на первом месте
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.07.2016, 08:43
#13
Кулик Алексей aka kpblc
Moderator

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


Ок, уболтал. Но условие остается прежним: функция должна иметь собственное имя
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.07.2016, 08:47
#14
Дима_

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


кАнечно - имя будет какое захочешь

----- добавлено через ~10 мин. -----
Кому - 2 дня будет мешать спать и работать - пишите публично "Сдаюсь" - ответ пришлю в личку.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 14.07.2016 в 08:59.
Дима_ вне форума  
 
Непрочитано 14.07.2016, 12:58
#15
trushev


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


Передача функции переменного количества "аргументов" уже озвучена:
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
my_fun (list 1 2 3 fig vam)) - переменное количество "параметров", но по-прежнему один аргумент.
trushev вне форума  
 
Непрочитано 14.07.2016, 13:01
#16
Apelsinov

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


Пока думал над вопросом, обнаружил интересный способ записи неименованных функций, может это общеизвестно, но для меня было открытием:
Код:
[Выделить все]
 ('((A B C) (LIST A B C)) 1 2 3)  

возвращает '(1 2 3)
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 14.07.2016, 13:15
#17
ShaggyDoc

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


Могу предположить, что это буде как "интерпретатор Лисп на Лиспе" из книги "Мир Лиспа".
ShaggyDoc вне форума  
 
Непрочитано 14.07.2016, 15:12
#18
skkkk


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


Она будет рекурсивно вызываться, переопределяя саму себя в зависимости от количества аргументов?
skkkk вне форума  
 
Непрочитано 14.07.2016, 15:25
#19
Кулик Алексей aka kpblc
Moderator

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


skkkk, я так понимаю, что надо создать функцию, которая корректно будет работать при вызовах типа:
(fun)
(fun nil)
(fun t "a")
(fun 1 2 "c" t nil)
(fun '(1 2))
При этом функция должна вызываться именно в стандартном варианте кода, без применения eval и read.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.07.2016, 17:56
#20
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


может так,
Код:
[Выделить все]
 
(defun example (aug1)
 
(foreach item aug1
(print item)
);_foreach
(princ)
);_defun

(example ‘( “Hello” “Aloha” “Hola” “Ciao” “Guten Tag”))
откопал на просторах
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 15.07.2016, 08:04
#21
Кулик Алексей aka kpblc
Moderator

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


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

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


не - будет честная функция запускаемая из ком. строки автокада (из лисп файлов так-же будет работать) без всяких прелюдий типа 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,202
<phrase 1=


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

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


Зачет!

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

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


Задачка та же, только действия посложнее. Ну типа там, изменить цвет и / или тип линии для выбранных объектов / всего файла, с обработкой описаний блоков или без. Количество параметров может быть таким:
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,202
<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
С.-Петербург
Сообщений: 40,450


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


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


Эх, не хватило меня вчера (уже позавчера, уже "в тот день") углубиться в проблему, уточнить условия задачи, и, признаюсь, она меня довольно-таки увлекла. И в свободное от других мыслей время мой мозг посвящал ей...
Однако условия "викторины" можно было понять по-разному.
Задачу
Цитата:
Сообщение от Дима_ Посмотреть сообщение
создать автолисп функцию на чистом автолиспе с переменным количеством аргументов
в какой-то спешке и в свете темы Есть ли в 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,372


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


Цитата:
Попробуйте сделать так на Бейсике.
легко
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,372


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