Вернуть итератор

Aug 23, 2016 05:36

А между тем, зацените, в nightly rust научились делать вот так:

#![feature(conservative_impl_trait)]

fn numbers() -> impl Iterator {
1 ..
}
Дословно, мы из функции возвращаем некоторый анонимный тип, всё что известно про которого - это то, что он реализует типаж Iterator, ассоциативный тип Item коего установлен в i32Выглядит сумбурно, ( Read more... )

code, anonymous type, rust, programming language, iterator, closures, trait

Leave a comment

thedeemon August 23 2016, 06:04:45 UTC
А что в Расте с тайп-левел арифметикой? У меня на плюсах некоторое количество важного кода, который я считал непереводимым на другие языки. Там много функций, работающих с изображениями поблочно, причем размер блока передается в ф-ию шаблонным параметром, в результате я могу спокойно разместить на стеке (с нужным выравниванием) несколько блоков нужного размера и работать с ними, и компилятор в каждом случае будет точно знать число итераций в циклах и сможет правильно анроллить эти циклы и оптимизировать между итерациями. При этом ф-я, работающая с блоками NxN, может их бить на части и рекурсивно вызывать себя или соседние ф-ии для обработки блоков (N/2)x(N/2), те могут делить блоки дальше и т.д. Т.е. мне нужны целые числа, которые можно делить/умножать, и которые в рамках одного вызова ф-ии при этом компайл-тайм константы, и при этом я не хочу эти ф-ии по много раз писать, т.к. кроме значений этих констант они могут и не отличаться. Кроме того мне нужно уметь передавать туда-сюда "блоки", размер которых должен быть отражен в типе.
Т.е. типичен код вроде
halveBlock : Block -> Block
где halveBlock может вызывать себя рекурсивно с разными значениями N.
И нужны типы вроде

YUVBlock {
Block Y;
Block U;
Block V;
}
Насколько это все переводимо на Раст?

Reply

metaclass August 23 2016, 06:41:33 UTC
А на каком языке это изначально написано?

Reply

thedeemon August 23 2016, 06:51:19 UTC
Тут у меня в примерах псевдокод.
А настоящий код тот на С++.

Reply

swizard August 23 2016, 14:14:15 UTC
Ну вот ровно прямо так же точно нельзя - в расте генерики можно биндить только типами, а значениями нет.

Конкретно твой пример можно сделать, если вынести параметр из шаблона в название, типа: Block2, Block4, Block8 и тд - и дальше макросом, чтобы не писать одно и то же для каждого блока.

Но что использовать вместо сложных вычислений на шаблонах (рекурсия там и тд) я точно не могу сказать, у меня пока такой нужды не возникало. В принципе, бывают плагины компилятора и билд скрипты, но надо смотреть внимательней на каждый случай.

Reply


Leave a comment

Up