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