| Автоматическая перегрузка функций | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | _nn_ | http://our-site.3dn.ru |
| Дата: | 15.03.08 23:20 | |
| Оценка: | 37 (2) | |
| Re: Автоматическая перегрузка функций | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 модератор | www.k-press.ru/cs |
| Дата: | 16.03.08 10:17 | |
| Оценка: | 12 (1) | |
| Здравствуйте, _nn_, Вы писали: __>Пока это предварительная версия, улучшения и пожелания принимаются. Для начала, вот эта конструкция какая-то не внятная:
С трудом в ней можно угадать банальный цикл. Вот только не ясно зачем так переусложнять. Разберем по пунктам. 1. Конструкция "args.Nth(cur)" является крайне не эффективной, так как list[T] — это однонаправленный список. Доступ по индексу (коим и является Nth) приводит к перебору cur элементов списка. Надо стараться перебирать списки всегда в прямом направлении. 2. Конструкция:
аналогична конструкции:
или
3. Если нужен цикл который делает некие императивные действия (вроде добавления методов, то наверно лучше и воспользоваться циклом или методами Iter/IterI). В данном случае, наверное, лучше всего подошел бы IterI:
![]() |
| Re: Автоматическая перегрузка функций | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 модератор | www.k-press.ru/cs |
| Дата: | 16.03.08 11:16 | |
| Оценка: | 12 (1) | |
| Здравствуйте, _nn_, Вы писали: Вот этот код тоже надо прокомментировать: __>
1. Literal — это вариант, а стало быть его значения не надо проверять по "is" (т.е. "p is Literal.Bool"). Вместо этого его можно просто описывать образцом "конструктор". Вместо
можно писать:
или даже:
так как название варианта можно опускать если тип аргумента соответствует этому типу. 2. Literal содержится в PExpr следующим образом:
Таким образом, чтобы преобразовать литерал в PExpr достаточно написать "PExpr.Literal(lit)". Естественно, что создавать для этого метод излишне. Нужно просто переписать строчку:
следующим образом:
Кстати, в Немерле параметры могут быть ref/out, а значения по умолчанию могут быть заданы не только у последних параметров, но и у любых других (для вызова можно обращаться к значениям параметров по именам). ![]() |
| Re: Автоматическая перегрузка функций | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 модератор | www.k-press.ru/cs |
| Дата: | 16.03.08 11:19 | |
| Оценка: | 1 (1) | |
| Здравствуйте, _nn_, Вы писали: Вот так сложно:
тоже писать не надо. Можно так:
![]() |
| Re[2]: Автоматическая перегрузка функций | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | _nn_ | http://our-site.3dn.ru |
| Дата: | 16.03.08 22:44 |
| Здравствуйте, VladD2, Вы писали: VD>1. Конструкция "args.Nth(cur)" является крайне не эффективной, так как list[T] — это однонаправленный список. Доступ по индексу (коим и является Nth) приводит к перебору cur элементов списка. Надо стараться перебирать списки всегда в прямом направлении. Это я знаю. Проблема в том, что мне нужно делать перебор с конца, т.к. как только есть аргумент без значения по умолчанию смысла в перегрузки нет. Если же конечно не изменить логику макроса:
Сейчас:
Другая логика:
Вопрос насколько такое поведение очевидно и удовлетворит пользователя макросом. VD>3. Если нужен цикл который делает некие императивные действия (вроде добавления методов, то наверно лучше и воспользоваться циклом или методами Iter/IterI). В данном случае, наверное, лучше всего подошел бы IterI: К сожалению на официальном сайте узнать о всех методах невозможно. Object Browser помогает А хотя очень нужно было бы обновить страницу на сайте или хотя бы выложить файл со списком всех классов и методов ![]() ![]() |
| Re[3]: Автоматическая перегрузка функций | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 модератор | www.k-press.ru/cs |
| Дата: | 17.03.08 09:10 |
| Здравствуйте, _nn_, Вы писали: __>Проблема в том, что мне нужно делать перебор с конца, т.к. как только есть аргумент без значения по умолчанию смысла в перегрузки нет. Какая разница как перебирать? В Nemerle параметры со значениями по умолчанию могут быть в любом параметре. К тому же можно воспользоваться вункцией Rev() переворачивающей список. VD>>3. Если нужен цикл который делает некие императивные действия (вроде добавления методов, то наверно лучше и воспользоваться циклом или методами Iter/IterI). В данном случае, наверное, лучше всего подошел бы IterI: __>К сожалению на официальном сайте узнать о всех методах невозможно. Object Browser помогает Можно просто пользоваться списком выподающем при комплите. Там же и подсказки есть (если релиз используется). __>А хотя очень нужно было бы обновить страницу на сайте или хотя бы выложить файл со списком всех классов и методов Я никогда туда не заглядывал. ![]() |
| Re[2]: Автоматическая перегрузка функций | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | _nn_ | http://our-site.3dn.ru |
| Дата: | 19.03.08 22:23 |
| Здравствуйте, VladD2, Вы писали: VD>3. Если нужен цикл который делает некие императивные действия (вроде добавления методов, то наверно лучше и воспользоваться циклом или методами Iter/IterI). В данном случае, наверное, лучше всего подошел бы IterI: VD>
Что-то не работает:
Почему-то не создаются методы. А так работает:
Получается, что все таки есть разница между IterI и функцией ? ![]() ![]() |
| Re[3]: Автоматическая перегрузка функций | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 модератор | www.k-press.ru/cs |
| Дата: | 20.03.08 12:27 |
| Здравствуйте, _nn_, Вы писали: __>Почему-то не создаются методы. Ну, так запусти из под отладчика и погляди в чем проблема. ЗЫ Вот эта проверка:
Снижает производительность (при обращении к свойству Length списка каждый раз происходит перебор всего списка). И вообще, ты тут что-то странное выделываешь. Просто разверни список и возьми его хвост. Код будет примерно таким:
![]() |
| Re: Автоматическая перегрузка функций №2 | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | _nn_ | http://our-site.3dn.ru |
| Дата: | 07.04.08 18:47 |
| Здравствуйте, _nn_, Вы писали: Вторая и улучшенная версия. C# тест:
Nemerle тест:
1: На данный момент недоработка. В следующей версии постараюсь исправить. Nemerle Макрос:
1: Пока нельзя так, но очень хотелось бы. Критика приветсвуется Спасибо. ![]() ![]() |
| Re[2]: Автоматическая перегрузка функций №2 | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 модератор | www.k-press.ru/cs |
| Дата: | 09.04.08 13:38 |
| Здравствуйте, _nn_, Вы писали: __>
А почему опять параметры без префикса parameters описываешь? ![]() |
| Re[3]: Автоматическая перегрузка функций №2 | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | _nn_ | http://our-site.3dn.ru |
| Дата: | 09.04.08 13:48 |
| Здравствуйте, VladD2, Вы писали: VD>Здравствуйте, _nn_, Вы писали: __>>
VD>А почему опять параметры без префикса parameters описываешь? Нельзя, ошибки компиляции mparms нужен для вызова функции, а fparms для аргументов функции. Иначе нужно дублировать код:
А этот код делает совершенно другое:
![]() ![]() |
| Re[4]: Автоматическая перегрузка функций №2 | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 модератор | www.k-press.ru/cs |
| Дата: | 09.04.08 14:13 |
| Здравствуйте, _nn_, Вы писали: __>Иначе нужно дублировать код: __>
А ты знаешь о том, что в Fun_header есть свойства Parameters и ParametersReferences реализующие свойства ParametersDeclarations и ParametersReferences интерфейса IParametersProvider? Насколько я понимаю, это то, что тебе нужно, причем в готовом виде. Поляки как раз ими обычно оперируют. ![]() |
| Re[5]: Автоматическая перегрузка функций №2 | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | _nn_ | http://our-site.3dn.ru |
| Дата: | 09.04.08 16:06 |
| Здравствуйте, VladD2, Вы писали: VD>Здравствуйте, _nn_, Вы писали: __>>Иначе нужно дублировать код: __>>
VD>А ты знаешь о том, что в Fun_header есть свойства Parameters и ParametersReferences реализующие свойства ParametersDeclarations и ParametersReferences интерфейса IParametersProvider? Насколько я понимаю, это то, что тебе нужно, причем в готовом виде. Поляки как раз ими обычно оперируют. Можно и так тоже:
Т.е. создать <[ parameter: ... ]> а оттуда вытаскивать аргументы без parameter:, вместо простого создания списка через Fun_param ? Какой в этом сакральный смысл ? ![]() ![]() |
| Re[6]: Автоматическая перегрузка функций №2 | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 модератор | www.k-press.ru/cs |
| Дата: | 10.04.08 13:32 |
| Здравствуйте, _nn_, Вы писали: __>Т.е. создать <[ parameter: ... ]> а оттуда вытаскивать аргументы без parameter:, вместо простого создания списка через Fun_param ? __>Какой в этом сакральный смысл ? Смысл в том, что первый список (у тебя) не является реально ссылкой на параметр. Могут, например, имена пересечься. Да и более понятно, что происходит. ![]() |