Здравствуйте, eao197, Вы писали:
E>Очень похоже, что Round округляет не в ту сторону
Возхможно. Используется Math.Round из BCL, а там по умолчанию банковское округление — если 0.5, то не от нуля (т.е. к 1), а к ближайшему чётному (т.е. 0). Это настраивается, естественно:
Здравствуйте, eao197, Вы писали:
E>Очень похоже, что Round округляет не в ту сторону,
Угу, тут в примерах это хорошо видно. — почему такое поведение. Как-то, по-моему, в .NET эта тема поднималась, но к чему пришли не помню, лень искать
E>и что список не реверсирован.
Здравствуйте, ie, Вы писали:
E>>Очень похоже, что Round округляет не в ту сторону,
ie>Угу, тут в примерах это хорошо видно. — почему такое поведение. Как-то, по-моему, в .NET эта тема поднималась, но к чему пришли не помню, лень искать
E>>и что список не реверсирован.
ie>+1 забыл
Опытным путем удалось установить, что достаточно прибавлять 0.1, тогда округляет как нужно. Но вот как сделать реверсию я не догнал
#pragma indent
using System.Console
using System.Math
def makeDistrib(trxCount : int, quantums : int)
mutable r : list[int] = []
mutable remainingTrx = trxCount
mutable remainingQuantums = quantums
foreach (_i in [1..quantums])
r ::= Round((remainingTrx :> double) / remainingQuantums + 0.1) :> int
remainingTrx -= r.Head
--remainingQuantums
r = r.Reverse
r
def r = makeDistrib(2, 6)
WriteLine($"$r")
Кстати, именно учет особенности формирования списка и не нравится мне в функциональных решениях со списками. Слишком легко этот момент забыть. Императивный подход именно в данном примере лучше.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Опытным путем удалось установить, что достаточно прибавлять 0.1, тогда округляет как нужно. Но вот как сделать реверсию я не догнал
def makeDistrib(trxCount, quantums : int)
mutable r = []
mutable remainingTrx = trxCount
mutable remainingQuantums = quantums
foreach (_i in [1..quantums])
// как правильно сказал Oyster
r ::= Round(remainingTrx / (remainingQuantums :> double),
MidpointRounding.AwayFromZero) :> int
remainingTrx -= r.Head
--remainingQuantums
r.Rev()
E>Кстати, именно учет особенности формирования списка и не нравится мне в функциональных решениях со списками. Слишком легко этот момент забыть. Императивный подход именно в данном примере лучше.
На самом деле привыкаешь быстро, однако, сам не перестаю удивляться, как уже вроде привыкши — вдруг не учел этот момент
ie> // как правильно сказал Oyster
ie> r ::= Round(remainingTrx / (remainingQuantums :> double),
ie> MidpointRounding.AwayFromZero) :> int
ie>
А почему у меня на этот символ ругается, мол не знаю, что такое?
ie>На самом деле привыкаешь быстро, однако, сам не перестаю удивляться, как уже вроде привыкши — вдруг не учел этот момент
ie>> // как правильно сказал Oyster
ie>> r ::= Round(remainingTrx / (remainingQuantums :> double),
ie>> MidpointRounding.AwayFromZero) :> int
ie>>
E>А почему у меня на этот символ ругается, мол не знаю, что такое?
Ээээ... Этот enum в System лежит, может не добавил using System?
ie>>На самом деле привыкаешь быстро, однако, сам не перестаю удивляться, как уже вроде привыкши — вдруг не учел этот момент E>А это к стати, в другую тему, к вопросу о гарантиях статической типизации
Здравствуйте, eao197, Вы писали:
E>А без #pragma indent? (просто регулярно всплывают проблемы из-за табуляций/пробелов).
using System.Console
using System.Math
def makeDistrib(trxCount : int, quantums : int)
{
mutable r : list[int] = []
mutable remainingTrx = trxCount
mutable remainingQuantums = quantums
foreach (_i in [1..quantums])
{
r ::= Round(remainingTrx / (remainingQuantums :> double)) :> int
remainingTrx -= r.Head
--remainingQuantums
}
r
}
def r = makeDistrib(2, 6)
WriteLine($"$r")
E>И разве WriteLine($"$r") будет печатать значения через запятую?
А ты проверь
hint: r имеет тип list[int] для которого в немерле перегружена операция преобразования к строке.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, eao197, Вы писали:
E>К тому что Nemerle здесь оффтопик, зачем его вообще поминать было я не понял.
Ну тебе этог не мешает приплетать руби куда попало.
WH>> из под стола раскажи это тем кто сделал внятные рантаймы. E>А ты из их числа?
А мне не нужно быть разработчиком рантаймов чтобы оценить их качество.
Также как мне не нужно быть кондитером для того чтобы оценить качество торта.
E>Ну вот, еще и Ruby приплели. У тебя есть проблемы с Ruby-новым runtime? Ты им вообще пользуешься? Или языком в форумах? E>На своих задачах я проблем в Ruby runtime не встречал. А что до скорости, так еще вопрос, может ли настолько динамический язык, как Ruby быть быстрым.
Может. До статики ему конечно не добратся никогда но быть гораздо быстрее чем руби можно. E>Одна горячая замена кода чего стоит.
А чего она стоит? Ее можно делать в так называемых safe-point'ах в которых GC тормозит программу. E>Erlang, к примеру, такую возможность предоставляет, но и сам при этом не быстр.
Ибо интерпритатор.
А для горячей замены не нужна ни интерпритация ни динамическая типизация. Это ортогональные понятия. E>А ведь Erlang клепают проффесиональные разработчики языков и рантаймов. Клепатели JRuby, которые на гораздо более современном языке (а не на C) пытаются интерпритатор Ruby сделать и то пока даже сравнимых результатов достичь не могут.
Сколько они затратили на это времени? А сколько эрланговцы?
WH>>Если бы он выбрал бы путь аля немерле то давно бы язык зарелизил и кучу фенечек прикрутил. E>Немерле уже в релизе?
А D? К тому же опять сколько времени делают немерле и сколько D? Я вот про D узнал за несколько лет до того как первый раз услышал про немерле. И еще учти что немерле горазо технологичнее чем D (один вывод типов чего стоит), а технологии требуют исследований. В тоже время в D нет вобще ничего скольнибудь не тривиального.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
E>А к функциональности еще привыкать нужно (например, необходимость вызова reverse после возврата из nextValue не слишком очевидна). Ну и под Scala все переписывать нужно
Да вроде в функционалном стиле код проще получается, например на питоне:
def make_dist(trx_count, quantum_count, result = []):
if quantum_count == 0:
return result
else:
result.append(int(round(float(trx_count) / quantum_count)))
return make_dist(trx_count - result[-1], quantum_count - 1, result)
print ", ".join(map(str, make_dist(2, 6)))
Здравствуйте, WolfHound, Вы писали:
WH>>>Если бы он выбрал бы путь аля немерле то давно бы язык зарелизил и кучу фенечек прикрутил. E>>Немерле уже в релизе? WH>А D? К тому же опять сколько времени делают немерле и сколько D? Я вот про D узнал за несколько лет до того как первый раз услышал про немерле. И еще учти что немерле горазо технологичнее чем D (один вывод типов чего стоит), а технологии требуют исследований. В тоже время в D нет вобще ничего скольнибудь не тривиального.
D если не ошибаюсь делает всего один человек.
Насчет не тривиального, судя по последнему релизу D уже стал мощнее чем C++. И все что годами не могли реализовать большие компании (ту же подержку шаблонов) в D появилось очень быстро и гораздо удобнее чем в С++. (На возражение что D слизало готовое, Немерле тоже самое сделало с ML языков).
Здравствуйте, WolfHound, Вы писали:
E>>К тому что Nemerle здесь оффтопик, зачем его вообще поминать было я не понял. WH>Ну тебе этог не мешает приплетать руби куда попало.
В данной теме инициатива поговорить о Nemerle и Ruby исходит от тебя.
WH>Также как мне не нужно быть кондитером для того чтобы оценить качество торта.
Доказательство по аналогии есть... ну ты знаешь.
E>>Erlang, к примеру, такую возможность предоставляет, но и сам при этом не быстр. WH>Ибо интерпритатор. WH>А для горячей замены не нужна ни интерпритация ни динамическая типизация. Это ортогональные понятия.
Сильно сомневаюсь, что для статики можно загрузить по живому новую версию класса, например, с изменившейся таблицей виртуальных функций и изменившимися прототипами методов.
E>>А ведь Erlang клепают проффесиональные разработчики языков и рантаймов. Клепатели JRuby, которые на гораздо более современном языке (а не на C) пытаются интерпритатор Ruby сделать и то пока даже сравнимых результатов достичь не могут. WH>Сколько они затратили на это времени? А сколько эрланговцы?
Зато они стали высказываться, что нынешняя реализация рантайма Ruby не так плоха, как про нее принято говорить. Сделать лучше не так уж и просто.
WH>>>Если бы он выбрал бы путь аля немерле то давно бы язык зарелизил и кучу фенечек прикрутил. E>>Немерле уже в релизе? WH>А D?
Это ты начал приводить пример Nemerle как правильный путь к достижению релиза. Имхо, пока Nemerle сам не зарелизен, делать такие сравнения преждевременно.
WH> К тому же опять сколько времени делают немерле и сколько D? Я вот про D узнал за несколько лет до того как первый раз услышал про немерле. И еще учти что немерле горазо технологичнее чем D (один вывод типов чего стоит), а технологии требуют исследований.
Вывод типов есть и в D, вообще-то говоря.
А то, что D такой долгострой, так это вообще лично мне не понятно. Видимо, Брайт считает, что спешить особо не нужно. D нацелен на нишу C++, вытеснить оттуда C++ полностью вообще не получится, а вот отвоевать свое место вполне возможно. Но для этого нужно, чтобы язык получился более качественным, чем C++. Но для этого требуется время. Какие-то вещи в D (тот же самый вывод типов, теперь вот туплы) появляются с течением времени, что делает язык лучше. В общем, обычный процесс эволюции.
К тому же за прошедшее время D стал, как минимум, достаточно известным и сформировал вокруг себя некоторую community. А это так же требует времени.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, FR, Вы писали:
FR>(На возражение что D слизало готовое, Немерле тоже самое сделало с ML языков).
В немерле совершенно иной вывод типов не имеющий ничего общего в ML.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, eao197, Вы писали:
WH>>Также как мне не нужно быть кондитером для того чтобы оценить качество торта. E>Доказательство по аналогии есть... ну ты знаешь.
Это не доказательство. Это иллюстрация.
Ибо я могу взять рантайм и посмотреть как он работает. Так вот руби тормозит ужасно.
E>Сильно сомневаюсь, что для статики можно загрузить по живому новую версию класса, например, с изменившейся таблицей виртуальных функций и изменившимися прототипами методов.
Это смотря как ее компилировать... если как С++ то конечно ничего не выдет.
E>Вывод типов есть и в D, вообще-то говоря.
Надеюсь ты не про это
auto test = new Testing(1, 2, 3);
Так вот по сравнению с неммерле это вобще ерунда. E>А то, что D такой долгострой, так это вообще лично мне не понятно. Видимо, Брайт считает, что спешить особо не нужно. D нацелен на нишу C++, вытеснить оттуда C++ полностью вообще не получится, а вот отвоевать свое место вполне возможно.
На кой черт этот мутант там вобще нужен?
Если нужно выжимать биты из быйтов то нужен либо обыкновенный С/С++ либо совершенно иная нежели CLR и JavaVM виртуальная машина. E>Но для этого нужно, чтобы язык получился более качественным, чем C++.
Для этого нужно менять основы. E>Но для этого требуется время. Какие-то вещи в D (тот же самый вывод типов, теперь вот туплы) появляются с течением времени, что делает язык лучше. В общем, обычный процесс эволюции.
Тоже самое будет в следующем стандарте С++.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, eao197, Вы писали:
E>>А к функциональности еще привыкать нужно (например, необходимость вызова reverse после возврата из nextValue не слишком очевидна). Ну и под Scala все переписывать нужно
FR>Да вроде в функционалном стиле код проще получается, например на питоне:
Кстати на D тоже:
import std.math;
import std.stdio;
int[] makeDistrib2(int trxCount, int quantums, int[] result = [])
{
if(quantums == 0) return result;
auto next = cast(int)round(cast(float)trxCount / quantums);
return makeDistrib2(trxCount - next, quantums - 1, result ~ [next]);
}
void main()
{
writefln(makeDistrib2( 2, 6 ));
}
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, FR, Вы писали:
FR>>(На возражение что D слизало готовое, Немерле тоже самое сделало с ML языков). WH>В немерле совершенно иной вывод типов не имеющий ничего общего в ML.
Точно ничего общего не имеющий?
И почему сразу вывод типов, а паттерн матчинг там откуда?