
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (56) « Первая ... 7 8 [9] 10 11 ... 55 56 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#121
,
|
|
Вообще-то в плюсах теперь, как и во всех нормальных языках для этого используются лямбды теперь. Ты вот скажи, то строковое выражение что, компилируется в рантайме? Или как оно работает? Цитата applegame @ Зачем и куда копировать достижимые ресурсы? Сразу предупреждаю, я не очень большой специалист в алгоритмах работы GC. Это основа работы практически всех (полноценных) GC: http://en.wikipedia.org/wiki/Garbage_colle..._vs._non-moving |
Сообщ.
#122
,
|
|
|
Ну это не стратегия, а имя стратегии. В плюсах можно использовать типы-теги, например или еще что-то такое. Цитата В качестве предикатов: http://dpaste.dzfl.pl/30cb1cd23e26 В сложных случаях будет запутано(и вообще интуитивно мне кажется это очень странной фичей), в обычных можно сделать на шаблонах и constexpr. |
![]() |
Сообщ.
#123
,
|
|
Цитата korvin @ Или как оно работает? Реализацию метода find(!) покажи. |
Сообщ.
#124
,
|
|
|
Цитата korvin @ Цитата applegame @ После того как все ссылки исчезли, деструктор вызовется, когда GC соблагоизволит прибить данный объект. Обычно же GC копируют достижимые объекты, а не «прибивают» недостижимые, зачем тратить на это время и другие ресурсы? Копировать сборщик в D не умеет. Но вот вызов деструктора(если он есть) таки приходится как-то делать при любом сборщике. Это та же история(почти), что и с финализаторами в явашарпах. |
Сообщ.
#125
,
|
|
|
Цитата korvin @ Да, оно компиляется, только компиле-тайм, а не рантайм в лямбду-предикат. Эдакий синтаксический сахарок, для простеньких предикатов. Но можно пихать, естественно и функторы и лямбды. Ты вот скажи, то строковое выражение что, компилируется в рантайме? Или как оно работает? |
Сообщ.
#126
,
|
|
|
Цитата applegame @ Эдакий синтаксический сахарок, для простеньких предикатов korvin, как ты считаешь, нужно ли такой "сахарок", прости за выражение, сделать в CL: будем парсить sexp прямо из строки? ![]() |
Сообщ.
#127
,
|
|
|
Итак, господа. Первая простейшая задача. Написать функцию-шаблон isOneOf(a, b1, b2, b3, b4, ...) возвращающую true если аргумент a равен хотя бы одному из аргументов b. Иначе false. Количество аргументов b от одного и далее. Типы аргументов могут быть разными, но подразумевается, что операция сравнения определена для a и любого из b. Два решения на D, итеративное и рекурсивное:
![]() ![]() bool isOneOf1(A, ARGS...)(A a, ARGS bb) { foreach(b; bb) // это компиле-тайм foreach, не рантайм if(a == b) return true; return false; } bool isOneOf2(A, ARGS...)(A a, ARGS bb) { if(a == bb[0]) return true; static if(bb.length > 1) return isOneOf2(a, bb[1..$]); else return false; } void main() { assert(isOneOf1(1, 2, 3, 1, 5)); // ok 1 == 1 assert(isOneOf2(1, 2, 3, 1, 5)); // ok 1 == 1 assert(isOneOf1("a", "b", "c", "d", "e")); // runtime assertion assert(isOneOf2("a", "b", "c", "d", "e")); // runtime assertion } ![]() |
![]() |
Сообщ.
#128
,
|
|
Цитата MyNameIsIgor @ korvin, как ты считаешь, нужно ли такой "сахарок", прости за выражение, сделать в CL: будем парсить sexp прямо из строки? CL и так это умеет делать, есть же процедура read, которую можно вызывать хоть в compile-time, хоть в load-time, хоть в read-time. Да и те же reader-макросы. Вот только там это делать не за чем, да и не рекомендуется. =) Цитата D_KEY @ В сложных случаях будет запутано(и вообще интуитивно мне кажется это очень странной фичей), в обычных можно сделать на шаблонах и constexpr. Кстати да, то ли дело тот же питон например, хоть он мне и не нравится. Цитата applegame @ Да, оно компиляется, только компиле-тайм, а не рантайм в лямбду-предикат. Эдакий синтаксический сахарок, для простеньких предикатов. Но можно пихать, естественно и функторы и лямбды. Что, без макросов слишком быстро компилируется после плюсов? =) В чем проблема просто сделать удобный синтаксис для лямбд? Синтаксис хаскелла конечно трудновоспринимаем для тех, кто с ним не знаком, но после знакомства все становится понятным, и не надо ломать голову, почему у тебя параметр «a» вроде как связывается с массивом foo, но обращение к нему идет как к элементу foo. |
Сообщ.
#129
,
|
|
|
Цитата applegame @ Итак, господа. Первая простейшая задача. Написать функцию-шаблон isOneOf(a, b1, b2, b3, b4, ...) возвращающую true если аргумент a равен хотя бы одному из аргументов b. Иначе false. Количество аргументов b от одного и далее. Типы аргументов могут быть разными, но подразумевается, что операция сравнения определена для a и любого из b. ![]() ![]() template<typename T, typename U> bool isOneOf(T a, U b) { return a == b; } template<typename T, typename U, typename ... Args> bool isOneOf(T a, U b, Args ... args) { return isOneOf(a, b) || isOneOf(a, args...); } Оно? Добавлено Цитата applegame @ Итеративно, насколько я знаю в плюсах вообще невозможно сделать А зачем? |
![]() |
Сообщ.
#130
,
|
|
Цитата applegame @ Два решения на D, итеративное и рекурсивное: Хотелось бы посмотреть, как ты будешь строить список bb динамически, из пользовательского ввода например. |
Сообщ.
#131
,
|
|
|
Цитата korvin @ Не понимаю, к чему это? DMD, кстати компилирует гораздо быстрее GCC. Одна из фишек D - быстрая компиляция.Что, без макросов слишком медленно компилируется после плюсов? Цитата korvin @ Он есть. Я повторяю, это просто синтаксический сахар. Не нравится - не юзай. Но сама возможность доставляет. Вот вариант с лямбдой: http://dpaste.dzfl.pl/f13179c43403В чем проблема просто сделать удобный синтаксис для лямбд? Кстати как в плюсиках создать подобную шаблоннуя inline-лямбду? Никак, только городить отдельный шаблонный предикат? |
Сообщ.
#132
,
|
|
|
Цитата D_KEY @ А зачем? D_KEY, ты и показал итеративное решение ![]() Добавлено Цитата korvin @ Вот только там это делать не за чем, да и не рекомендуется. =) Что я и говорю ![]() |
Сообщ.
#133
,
|
|
|
Цитата D_KEY @ Оно, задача была проста. Но теперь сравниваем код, для D и для C++ и смотрим, что наглядней, легче для понимания и проще в написании. В плюсях пришлось городить отдельную вспомогательную функцию, как я и думал. Оно? |
Сообщ.
#134
,
|
|
|
Цитата MyNameIsIgor @ Цитата D_KEY @ А зачем? D_KEY, ты и показал итеративное решение ![]() Это как посмотреть ![]() |
Сообщ.
#135
,
|
|
|
Цитата korvin @ Зачем? Это разве входило в условия задачи? Динамически только значения можно передавать. А длина и типы зафиксированы compile-time. Хотелось бы посмотреть, как ты будешь строить список bb динамически, из пользовательского ввода например. |