
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (56) « Первая ... 10 11 [12] 13 14 ... 55 56 ( Перейти к последнему сообщению ) |
Сообщ.
#166
,
|
|
|
Тут да. Потому что здесь нет зависимости аргументов шаблона от аргументов функции. Это есть шаблон функции с переменным числом параметров. А вот это ![]() ![]() bool isOneOf2(A, ARGS...)(A a, ARGS bb) есть шаблон функции с переменным числом параметров разного типа. Если семантика (а не компилятор) D сводит второе к первому, то D убог. Но я не думаю, что он так делает. Добавлено applegame, можно ли в D сделать такую проверку? (грязный хак, знаю) |
Сообщ.
#167
,
|
|
|
Вообще это фактически пошел холивар терминов. Факт в том, что я прекрасно знаю, что такое разворачивание хвостовых рекурсий, как именно работают шаблонные функции, как они инлайнятся (зависит от компилятора и от опций компиляции). Если кто считает, что я в этом деле профан - ваше право так думать и заявлять об этом, а мое право сказать вам: "до свидания".
А я тем временем вернусь к основному холивару и подгоню более сложную задачу. |
Сообщ.
#168
,
|
|
|
Цитата applegame @ Факт в том, что я прекрасно знаю, что такое разворачивание хвостовых рекурсий Только её здесь нет ![]() |
Сообщ.
#169
,
|
|
|
Цитата applegame @ Вообще это фактически пошел холивар терминов. Факт в том, что я прекрасно знаю, что такое разворачивание хвостовых рекурсий, как именно работают шаблонные функции, как они инлайнятся (зависит от компилятора и от опций компиляции). Если кто считает, что я в этом деле профан - ваше право так думать и заявлять об этом, а мое право сказать вам: "до свидания". А я тем временем вернусь к основному холивару и подгоню более сложную задачу. А ты мог бы ответить на вопрос korvinа по поводу кода из строки и аргументов/захвата? |
Сообщ.
#170
,
|
|
|
Цитата MyNameIsIgor @ Так устроит? http://dpaste.dzfl.pl/1e63ac0de3b5applegame, можно ли в D сделать такую проверку? (грязный хак, знаю) Цитата D_KEY @ На что-то я уже отвечал, процитируй вопрос еще раз. А ты мог бы ответить на вопрос korvinа по поводу кода из строки и аргументов/захвата? |
![]() |
Сообщ.
#171
,
|
|
Цитата applegame @ На что-то я уже отвечал, процитируй вопрос еще раз. D vs C++ (сообщение #3413091) Добавлено Я думаю, Игорь имел в виду эту проверку: http://dpaste.dzfl.pl/7ee97716f99f |
Сообщ.
#172
,
|
|
|
Цитата korvin @ А, если предикат задан строкой, то имена жестко зафиксированы за "a" и "b". Дело в том, что D умеет компилировать выражение в строке (конечно, только если значение строки вычисляемо compile-time). Как тогда компилятор выясняет, какие идентификаторы в строке являются аргументами лямбды, а какие — нет? Или контекст вызова просто игнорируется и его также нужно явно передавать параметром? Добавлено А в чем принципиальная разница? |
Сообщ.
#173
,
|
|
|
Цитата applegame @ А в чем принципиальная разница? Принципиальной разницы нет - функции разные. |
![]() |
Сообщ.
#174
,
|
|
Цитата applegame @ А в чем принципиальная разница? Я не знаю, есть ли в D разница между твоим и моим примером, но, думаю, разные адреса намекают на разные функции, а кто-то утверждал, что функция одна. |
Сообщ.
#175
,
|
|
|
Цитата MyNameIsIgor @ Это очевидно. При присвоении значения первому указателю, будут сгенерены две функции для двух и трех int. Для второго указателя сгенерится еще одна функция - для четырех int (для трех и двух уже нет необходимости, так как они уже есть). Если включить оптимизацию, то в готовом коде, вероятно, останутся только две функции: для трёх и для четырех int. Причем также вероятно, что та, что с четырмя не будет вызывать ту, что с тремя. Если компилер совсем крут, аки GCC, то в конечном коде функций может не быть совсем, все будет заинлайнено "в нули". Принципиальной разницы нет - функции разные. Добавлено Цитата korvin @ Господи, я же говорил, с математической точки зрения. Можете обзывать это метафункцией: а кто-то утверждал, что функция одна. |
Сообщ.
#176
,
|
|
|
Цитата applegame @ Цитата korvin @ А, если предикат задан строкой, то имена жестко зафиксированы за "a" и "b". Дело в том, что D умеет компилировать выражение в строке (конечно, только если значение строки вычисляемо compile-time).Как тогда компилятор выясняет, какие идентификаторы в строке являются аргументами лямбды, а какие — нет? Или контекст вызова просто игнорируется и его также нужно явно передавать параметром? Можно подробнее? И есть ли способ захвата контекста в ..эм.. строку? |
Сообщ.
#177
,
|
|
|
Цитата applegame @ Это очевидно Собственно, не понятно чем вы тогда весь такой недовольный. Я ведь говорил Цитата MyNameIsIgor @ Рекурсивно определение шаблона. Но не определения функций, порождаемых этим шаблоном. |
Сообщ.
#178
,
|
|
|
Цитата D_KEY @ Строка будет скомпилирована в контексте того места, где она собственно скомпилирована, простите за тавтологию. Ща приведу пример, может станет понятней. Можно подробнее? И есть ли способ захвата контекста в ..эм.. строку? |
![]() |
Сообщ.
#179
,
|
|
Цитата applegame @ Господи, я же говорил, с математической точки зрения. Можете обзывать это метафункцией С «математической» точки зрения у всех функций только один аргумент например. =) Не знаю, зачем вообще надо было приплетать в обсуждение математику и какой «физический смысл» у этой «математической точки зрения» как в контексте обсуждения, так и для компиляторов. |
Сообщ.
#180
,
|
|
|
Цитата MyNameIsIgor @ Я против этого не возражал. Случилось, вероятно, недопонимание. Предлагаю закрыть эту тему. Собственно, не понятно чем вы тогда весь такой недовольный. Я ведь говорил Добавлено Цитата korvin @ Да, с ясностью выражения мыслей у меня иногда бывают проблемы, как собственно и у всех. Исключение разве что FlexFerrum, по крайней мере в темах о C++ С «математической» точки зрения у всех функций только один аргумент например. =) ![]() Цитата korvin @ Смысл был в ответе на вопрос корректно ли называть второе решение - рекурсивным? То, что оно семантически будет итеративным - вызов нескольких функций одна внутри другой - очевидно, но само решение, я считаю, можно вполне назвать рекурсивным. Не знаю, зачем вообще надо было приплетать в обсуждение математику и какой «физический смысл» у этой «математической точки зрения» как в контексте обсуждения, так и для компиляторов. Добавлено Вот обещанный пример. Обратите внимание на удобство и простоту использования auto в качестве возвращаемого типа: [URL=http://dpaste.dzfl.pl/82aacb91bb0b ![]() ![]() import std.conv; auto foo(string code)(int a, int b) { int c = a - b; return mixin(code); } void main() { assert( foo!("a + b")(1, 2) == 3 ); assert( foo!("a == b")(1, 2) == false ); assert( foo!("a + c")(1, 2) == 0 ); assert( foo!("a.to!string ~ b.to!string")(1, 2) == "12" ); } ![]() ![]() import std.conv; auto foo(string code)(int a, int b) { int c = a - b; return mixin(code); } void main() { assert( foo!("a + b")(1, 2) == 3 ); assert( foo!("a == b")(1, 2) == false ); assert( foo!("a + c")(1, 2) == 0 ); assert( foo!("a.to!string ~ b.to!string")(1, 2) == "12" ); } Добавлено И да, на всякий случай, уточню: будет сгенерено четыре функции foo, для разных строковых параметров. |