
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (56) « Первая ... 9 10 [11] 12 13 ... 55 56 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#151
,
|
|
applegame, кстати, а если вместо первого аргумента будет вызов функции, она вызовется один раз и сохранит значение или будет вызываться на каждое сравнение? типа
![]() ![]() int foo() { writeln 1; return 1; } void main() { isOneOf(foo(), 2 3, 1, 4, 5); } |
Сообщ.
#152
,
|
|
|
korvin, это не макросы. Совсем.
|
![]() |
Сообщ.
#153
,
|
|
Цитата applegame @ Это переменные локальные для самой лямбды, внутренности find не имеют к ним никакого отношения. Не нравятся a и b, используй другие имена, главное два аргумента и возвращение значения, которое может быть неявно приведено к bool. Как тогда компилятор выясняет, какие идентификаторы в строке являются аргументами лямбды, а какие — нет? Или контекст вызова просто игнорируется и его также нужно явно передавать параметром? ![]() ![]() int b = 3; find!"a.key == b"(foo, 2); Добавлено Цитата D_KEY @ korvin, это не макросы. Совсем. Это не значит, что они могут самостоятельно решить, вызывать предварительно foo(), или нет. |
Сообщ.
#154
,
|
|
|
sensored, и ты туда же. Я эти рекурсивные шаблоны разбирал по косточкам, вплоть до ассемблера, когда баги в LLVM репортил. Инлайнирование функций (в обсуждаемом случае) полностью равнозначно разворачиванию рекурсии: превратит в тупую цепочку проверок. Причем итеративное решение приведет к такому же результату. То что функций будет много и компилятор их инлайнит - это вообще особенности компиляции, с функциональной точки зрения isOneOf в дешном варианте - одна функция с переменным числом аргументов, а не куча с разными сигнатурами.
|
Сообщ.
#155
,
|
|
|
Цитата applegame @ с функциональной точки зрения isOneOf в дешном варианте - одна функция с переменным числом аргументов, а не куча с разными сигнатурами. оО Кстати, именно это как раз деталь реализации, даже если так D делает. А вот семантически там как раз совершенно разные вызовы. Разве нет? Ты не нервничай так, а то сам понимаешь, что будет с темой Добавлено Цитата korvin @ Как тогда компилятор выясняет, какие идентификаторы в строке являются аргументами лямбды, а какие — нет? Или контекст вызова просто игнорируется и его также нужно явно передавать параметром? ![]() ![]() int b = 3; find!"a.key == b"(foo, 2); Присоединяюсь к вопросу. |
Сообщ.
#156
,
|
|
|
Цитата applegame @ То что функций будет много и компилятор из инлайнит - это вообще особенности компиляции То, что инлайнит - да, особенность компиляции. То, что функции разные - семантика языка. А если разные, то это не рекурсия просто по определению. Цитата applegame @ с функциональной точки зрения isOneOf Что такое "функциональная точка зрения"? Цитата applegame @ isOneOf в дешном варианте - одна функция с переменным числом аргументов Нет, ибо она параметризуется их типами. И потому это не просто переменное число аргументов - инстанцирование приводит к разным функциям хотя бы из-за проверки типов. |
Сообщ.
#157
,
|
|
|
Цитата D_KEY @ Нет D так не делает. Это будут разные функции. Так как CTFE, то фактически рекурсия разворачивается в итеративный вариант (с foreach) с последующим разворачиванием цикла в последовательность проверок.Кстати, именно это как раз деталь реализации, даже если так D делает. А вот семантически там как раз совершенно разные вызовы. Разве нет? Оторвитесь уже, блджад, от плюсов. Представьте это математически: одна функция, рекурсивная, с переменным числом аргументов, вызывает сама себя. |
Сообщ.
#158
,
|
|
|
Цитата applegame @ рекурсия разворачивается Так а где здесь рекурсия то? ![]() |
Сообщ.
#159
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Нет D так не делает. Это будут разные функции.Кстати, именно это как раз деталь реализации, даже если так D делает. А вот семантически там как раз совершенно разные вызовы. Разве нет? Значит, нет и рекурсии. |
Сообщ.
#160
,
|
|
|
Цитата applegame @ Представьте это математически: одна функция, рекурсивная Мы представили. Математически мы не видим одной функции, мы видим метафункцию (шаблон), порождающую разные функции. Добавлено Метафункция рекурсивна, да. Порождённые ею функции - нет. |
Сообщ.
#161
,
|
|
|
Тут вот есть рекурсия?
![]() ![]() bool isOneOf__2(int a, int b) { return a == b; } bool isOneOf__3(int a, int b, int c) { return isOneOf__2(a, b) || isOneOf__2(a, c); } bool isOneOf__4(int a, int b, int c, int d) { return isOneOf__2(a, b) || isOneOf__3(a, c, d); } bool isOneOf__5(int a, int b, int c, int d, int e) { return isOneOf__2(a, b) || isOneOf__4(a, c, d, e); } ... |
![]() |
Сообщ.
#162
,
|
|
Цитата korvin @ Цитата D_KEY @ korvin, это не макросы. Совсем. Это не значит, что они могут самостоятельно решить, вызывать предварительно foo(), или нет. Или «имеют право решать». Пример, конечно, надуманый, но всякое ведь бывает. =) |
Сообщ.
#163
,
|
|
|
Цитата korvin @ но всякое ведь бывает. В C++ там идет обычный вызов функции, если что. Т.е. вся магия была на этапе инстанцирования шаблона функции. После инстанцирования ты вызываешь обычную функцию. |
![]() |
Сообщ.
#164
,
|
|
Цитата D_KEY @ В C++ там идет обычный вызов функции, если что. Т.е. вся магия была на этапе инстанцирования шаблона функции. После инстанцирования ты вызываешь обычную функцию. Да я как бы вижу по результату и спрашивал не «почему так происходит». =) |
Сообщ.
#165
,
|
|
|
Вот специально для вас. Тут будет ровно одна функция, вызывающая сама себя.
Математически одно и то же, скажите мне еще, что это не рекурсия: http://dpaste.dzfl.pl/3c5b2e014724 Хз хватит ли ума у компилятора D развернуть эту рекурсию в цикл. Но это не важно, важно чтобы стало понятно, о чем я. Добавлено Цитата korvin @ Эм, я полагаю она вызовется один раз. applegame, кстати, а если вместо первого аргумента будет вызов функции, она вызовется один раз и сохранит значение или будет вызываться на каждое сравнение? типа |