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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Lambda на .Net?

Lambda на .Net?

Ответ
Поиск в этой теме
Непрочитано 14.03.2011, 14:18 #1
Lambda на .Net?
Дима_
 
Продуман
 
Питер
Регистрация: 22.02.2007
Сообщений: 2,843

Вопрос скорее к знатокам ARX(Net в частности). Недавно, в очередной раз, "всплывала" тема про "перегрузку" функций. Не очень понимаю возможно-ли это, но в качестве темы для обсуждения - есть идея написать "перегруженную" лямбду - синтаксис (упрощенный) предлагаю позаимоствовать из Schema:
(lambda [arg1] [arg2]... . X [/ tmpname1 [tmpname2]...])
простыми словами - создается обычная лямбда-функция имеющая некоторое (возможно нулевое) количество обязательных аргументов (arg1 arg2...) и произвольное количество дополнительных аргументов (X - отделенный "." точкой) - который передается программе в виде списка под именем X (естественно - может быть пустым), ну и как в стандартной лямбде - через "/" "временные переменные".

Для ясности примера - при создании такой функции должна работать конструкция типа (вычисление разницы произведения и суммы):
Код:
[Выделить все]
 (setq pr-sum
  (net-lambda ( . x)
    (if x (- (apply '* x)
             (apply '+ x)))))
Ну и соответственно - если возможно такая net-lambda - то и какой-нибудь net-defun можно будет сварганить.
Описать (ударение на последний слог)-то функцию не сложно - но как ее реализовать я ума не приложу - что должно возращаться в лисп? явно имя какой-то новообразованной функции которая при вызове как-то преобразует аргументы и создает уже лисп lambd'у с конкретным количеством аргументов. Но как ее динамически связать (создать аттрибут в dll-ке или на каждую новую netload производить) и каким образом GC проводить я не представляю - знаний маловато. Если у кого есть идеи - либо понимание что это не возможно - поделитесь ими.
p.s. - если это и возможно - то ИХМО замкнутую лямбд'у (считающею значения аргументов только при создании функции) будет создать проще - по мне так это еще и лучше.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Просмотров: 3146
 
Непрочитано 14.03.2011, 15:27
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


X - это логический оператор? Покажи реальный пример с исходными данными и что должно получиться.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 14.03.2011, 15:48
#3
gomer

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


Овчинка выделки не стоит... имхо в лиспе все функции должны иметь один списочный аргумент...
gomer вне форума  
 
Автор темы   Непрочитано 14.03.2011, 16:03
#4
Дима_

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


Цитата:
Сообщение от hwd Посмотреть сообщение
X - это логический оператор? Покажи реальный пример с исходными данными и что должно получиться.
x - это имя (произвольное) аргумента который будет передаватся функции как список из всех дополнительных аргументов, код из #1 должен работать так:
(pr-sum 10 20 30)
5940 ;10*20*30-(10+20+30)
(pr-sum 1 2)
-1 ;1*2-(1+2)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.03.2011, 16:09
#5
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
x - это имя (произвольное) аргумента который будет передаватся функции как список из всех дополнительных аргументов, код из #1 должен работать так:
(pr-sum 10 20 30)
5940 ;10*20*30-(10+20+30)
(pr-sum 1 2)
-1 ;1*2-(1+2)
Набор операций фиксирован? Т.е. всегда нужно вычитать из произведения элементов их сумму?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 14.03.2011 в 16:16.
hwd вне форума  
 
Непрочитано 14.03.2011, 16:12
#6
gomer

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


что мешает написать
Код:
[Выделить все]
(pr-sum '(10 20 30))
gomer вне форума  
 
Автор темы   Непрочитано 14.03.2011, 16:14
#7
Дима_

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


HWD: набор операций - да, количество аргументов может быть разное - соответственно возможно разветвление - в #1, в третей строке if x - то есть если x='() - он же nil - то есть пустому списку, то есть нет дополнительных аргументов - никакого умножения не производится - вернет nil.

Gomer: мешает опыт работы с функциями (языками) где это возможно - слыхал про классику:
(apply 'mapcar (cons 'list lst)) - вот попробуй "исполни" ее без "многоаргументного" mapcara.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 14.03.2011 в 16:20.
Дима_ вне форума  
 
Непрочитано 14.03.2011, 16:35
#8
gomer

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


Дима_, конечно же я перегнул палку, на вкус и цвет товарищей нет... но однородные данные принято группировать в списки, из-за 3х символов вы готовы привязать себя к определенной версии автокада и даже операционной системе... купить ms vs и подписаться на лицензию от autodesk... это как-то не рационально вам не кажется?
gomer вне форума  
 
Автор темы   Непрочитано 14.03.2011, 16:37
#9
Дима_

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


да в том то и беда что иногда это совсем не 3 символа
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.03.2011, 16:37
#10
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
HWD: набор операций - да, количество аргументов может быть разное - соответственно возможно разветвление - в #1, в третей строке if x - то есть если x='() - он же nil - то есть пустому списку, то есть нет дополнительных аргументов - никакого умножения не производится - вернет nil.

Gomer: мешает опыт работы с функциями (языками) где это возможно - слыхал про классику:
(apply 'mapcar (cons 'list lst)) - вот попробуй "исполни" ее без "многоаргументного" mapcara.
Либо я неверно понял автора, либо Gomer прав...
что мешает написать lisp-функцию, в теле которой и проверить, является ли список пустым, а по результату - либо вернуть nil, либо выполнить арифметику?

Я могу показать пример на .Net, но... Мне кажется, что подобного рода Lisp-функции писать на .Net - это изврат... имхо

Offtop:
И тут Gomer'а в очередной раз понесло:
Цитата:
Сообщение от Gomer:
вы готовы привязать себя к определенной версии автокада и даже операционной системе... купить ms vs и подписаться на лицензию от autodesk...
зачем покупать ms vs? зачем подписываться на лицензию от autodesk? Видать Gomer знает много тайн, а автокад у него установлен в какой-то неизвестной никому операционной системе, которая свободна от всего земного....
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 14.03.2011 в 16:43.
hwd вне форума  
 
Автор темы   Непрочитано 14.03.2011, 17:18
#11
Дима_

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


Цитата:
Сообщение от hwd Посмотреть сообщение
Либо я неверно понял автора, либо Gomer прав...
Скорее первое - функция из первого поста как раз и проверяет список только он ей передается не в виде списка а в виде последовательности аргументов, которые та-самая навеска, которая непонятно может-ли быть сделанна, превращает последовательность аргументов в список.
То Gomer - а кто сказал что в списке обязательно должны хранится однородные данные?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.03.2011, 17:23
#12
gomer

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
То Gomer - а кто сказал что в списке обязательно должны хранится однородные данные?
А для кого есть функции null и vl-remove-if-not чем не проверка?
gomer вне форума  
 
Непрочитано 14.03.2011, 17:28
#13
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
а кто сказал что в списке обязательно должны хранится однородные данные?
А что, в списке данной задачи юзеру разрешается передавать данные разных типов? Как складывать/умножать/вычитать строку с числом или логическим значением? Я так и не увидел необходимости дотнета для решения данной задачи. Проверил на nil, если это не nil/пустой список - выполнил арифметику (пара строк на лиспе).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 14.03.2011, 17:36
#14
Дима_

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


Цитата:
Сообщение от hwd Посмотреть сообщение
А что, в списке данной задачи юзеру разрешается передавать данные разных типов?
С моей точки зрения в этом и есть основная фишка списков - многие из "классического" программирования - считают что список- это типа такой вид массива - это в корне не так - это совершенно другая логическая структура.
Цитата:
Сообщение от hwd Посмотреть сообщение
Я так и не увидел необходимости дотнета для решения данной задачи. Проверил на nil, если это не nil/пустой список - выполнил арифметику (пара строк на лиспе).
Видимо Вы так и не поняли задачу - задача не проверить список на пустоту, а преобразовать последовательность аргументов функции в список и САМОЕ ГЛАВНОЕ сделать возможность создавать функции с произвольным количеством аргументов - не как в С подобных языках (методом описания действий для каждого количества аргументов) - а возможности обработки функицией любого их количества.

то Gomer - смотри допустим у нас есть несколько списков одинаковой длинны и нам надо получить список сумм - это лекго делается с посмощью "многоаргументной функции" +:
(mapcar '+ lst1 lst2 lst3 ...)
тоже самое с произведениями:
(mapcar '* lst1 lst2 lst3...)
но допустим мы хотим получить что-то посложней, на что нет встроенной многоаргументной функции с учетом что количество списков может быть любым, например сумму квадратных корней - если бы синтаксис позволял создавать "многоаргументную" лямбду то функция выглядела бы так (синтаксис из 1 примера):
(mapcar '(net-lambda ( . x) (apply '+ (mapcar 'srqt x))) lst1 lst2 lst3 ...)
а без нее ... попробуй написать сам.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 14.03.2011 в 17:58.
Дима_ вне форума  
 
Непрочитано 14.03.2011, 17:51
#15
Александр Ривилис

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


Дима! Лучше на эту тему и не думать. Аргументы против:
1. .NET/ARX принимают далеко не все типы параметров, которые может передать VLisp. В частности не передаются vla-объекты, имена функций (их нужно передавать как строки).
2. Параметры передаются в .NET/ARX как список.
3...
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 14.03.2011, 20:51
#16
Дима_

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


Маэстро - слава богу хоть Вам не надо объянсять что я имею в виду (видимо вопрос включает в себя 2 слишком разные области программирования) - поверю Вам на слово - жаль конечно, но видимо не судьба.
p.s. Чтож я раньше не додумался - проверить элементарной фунцией которая возращает свой-же аргумент(ResultBuffer) -net аналог list - ведь даже лямбду он не понимает - то есть - код только в строки загонять (даже на quote руганулся) - да еще и обратный лисп парсинг - нафиг - тут действительно овчинка выделки не стоит.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 15.03.2011 в 12:59.
Дима_ вне форума  
 
Непрочитано 26.12.2012, 16:58
#17
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,777


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
.NET/ARX принимают далеко не все типы параметров, которые может передать VLisp
Списки (в том числе вложенные) тоже никак?
crosandr вне форума  
 
Непрочитано 26.12.2012, 17:09
#18
Александр Ривилис

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


Цитата:
Сообщение от crosandr Посмотреть сообщение
Списки (в том числе вложенные) тоже никак?
Списки, в том числе и вложенные - запросто. НО!
1. Элементами этих списков не могут быть vla-object, функции и др.
2. Если список подобен DXF-коду, то он будет передан именно как DXF-код. Т.е. '(10 1 2 3) будет передано как '(10 1.0 2.0 3.0)
3. В версиях AutoCAD до 2007 вложенные списки передавать нельзя.
4. Ну и наверняка еще что-нибудь я забыл. :-)
Александр Ривилис вне форума  
 
Непрочитано 26.12.2012, 17:55
#19
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Ну и наверняка еще что-нибудь я забыл. :-)
Offtop: Ну да... вы ведь самый "забывчивый"
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 26.12.2012, 17:58
#20
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от crosandr Посмотреть сообщение
Списки (в том числе вложенные) тоже никак?
Что именно имеешь ввиду, можно все
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Lambda на .Net?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение разбитого на слова текста Mist AutoCAD 43 28.01.2014 16:54
Возможно ли автоматизировать подобный процесс? Shaft Программирование 13 24.06.2010 09:18
Как автоматизировать печать чертежа? Serge_BN Программирование 13 04.03.2010 14:34
Отыскание условного экстремума с помощью множителей Лаграньжа slogos Программирование 19 11.02.2010 12:59
(GRREAD) и привязка Ева Программирование 17 18.12.2009 09:10