dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

valerik88 вне форума Вставить имя

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

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


Можно, почему нет. Как вариант: http://autolisp.ru/2009/10/21/lisp-overloading/
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.07.2016, 15:52
#3
valerik88


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


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 34,808


Количество параметров в AutoLISP задается один раз. Полноценного "переопределения" / "перегрузки" функций тут нет.
__________________

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

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,127


Но можно же создать функцию, в которой какой-либо из параметров (или все) может быть 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
С.-Петербург
Сообщений: 34,808


Я так понял, что ТС хочет получить нечто типа:
Код:
[Выделить все]
(fun)
(fun 1)
(fun 1 2)
(fun 3 4 5 6 7 8 9)
Т.е. название функции одно и то же, но количество и/или тип аргументов - разный.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.07.2016, 10:14
#7
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 948
Отправить сообщение для 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"В
Сообщений: 9,995


Собственно ответили уже, но для ясности:
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,151
Отправить сообщение для Александр Ривилис с помощью ICQ Отправить сообщение для Александр Ривилис с помощью Skype™


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

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

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


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

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

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


Уточнение: функция должна быть именована.
Сильно подозреваю, что ты имеешь в виду определение не через defun, а через defun-q (которым, к стыду своему, я не пользуюсь).
__________________

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

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


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 34,808


Ок, уболтал. Но условие остается прежним: функция должна иметь собственное имя
__________________

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

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


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

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

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


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


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

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,083
Отправить сообщение для Apelsinov с помощью ICQ


Пока думал над вопросом, обнаружил интересный способ записи неименованных функций, может это общеизвестно, но для меня было открытием:
Код:
[Выделить все]
 ('((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"В
Сообщений: 9,995


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

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,127


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

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


skkkk, я так понимаю, что надо создать функцию, которая корректно будет работать при вызовах типа:
(fun)
(fun nil)
(fun t "a")
(fun 1 2 "c" t nil)
(fun '(1 2))
При этом функция должна вызываться именно в стандартном варианте кода, без применения eval и read.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.07.2016, 17:56
#20
nolte

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


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

(example ‘( “Hello” “Aloha” “Hola” “Ciao” “Guten Tag”))
откопал на просторах
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Есть ли в Autolisp возможность задавать необязательные параметры для функций?

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли возможность вставить в вершины полилинии блоки? bimari AutoCAD 8 28.03.2017 19:26
Есть возможность уменьшить объект в ширину, а длина должна остаться не изменой? виктоша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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


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