Re[4]: Ой, чо с D деется-то!?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.11.06 10:20
Оценка: :)
Здравствуйте, ie, Вы писали:

ie>Прошу:


ie>
ie>#pragma indent

ie>using System.Console
ie>using System.Math

ie>def makeDistrib(trxCount : int, quantums : int)
ie>    mutable r : list[int] = []
ie>    mutable remainingTrx = trxCount
ie>    mutable remainingQuantums = quantums
ie>    foreach (_i in [1..quantums])
ie>        r ::= Round(remainingTrx / (remainingQuantums :> double)) :> int
ie>        remainingTrx -= r.Head
ie>        --remainingQuantums
ie>    r

ie>def r = makeDistrib(2, 6)
ie>WriteLine($"$r")
ie>


А без #pragma indent? (просто регулярно всплывают проблемы из-за табуляций/пробелов).
И разве WriteLine($"$r") будет печатать значения через запятую?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: Ой, чо с D деется-то!?
От: ie Россия http://ziez.blogspot.com/
Дата: 17.11.06 10:38
Оценка:
Здравствуйте, eao197, Вы писали:

E>А без #pragma indent? (просто регулярно всплывают проблемы из-за табуляций/пробелов).


Тогда чуть больше строчек из-за {}, но ведь выразительность при этом не теряется.

E>И разве WriteLine($"$r") будет печатать значения через запятую?

[1, 0, 1, 0, 0, 0]

Если надо без скобочек [], то:
WriteLine(r.ToString(", "))
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[4]: Ой, чо с D деется-то!?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.11.06 10:40
Оценка:
Здравствуйте, ie, Вы писали:

ie>Прошу:


ie>
ie>#pragma indent

ie>using System.Console
ie>using System.Math

ie>def makeDistrib(trxCount : int, quantums : int)
ie>    mutable r : list[int] = []
ie>    mutable remainingTrx = trxCount
ie>    mutable remainingQuantums = quantums
ie>    foreach (_i in [1..quantums])
ie>        r ::= Round(remainingTrx / (remainingQuantums :> double)) :> int
ie>        remainingTrx -= r.Head
ie>        --remainingQuantums
ie>    r

ie>def r = makeDistrib(2, 6)
ie>WriteLine($"$r")
ie>


Уж не знаю почему, но Nemerle 0.9.3 от 17 мая 2006 (который через MSI-инсталлятор ставится) выдает не правильный ответ:
[1, 0, 1, 0, 0, 0]


В то время как версии на Ruby, D и Scala:
0,0,1,0,1,0

Очень похоже, что Round округляет не в ту сторону, и что список не реверсирован.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: Ой, чо с D деется-то!?
От: Oyster Украина https://github.com/devoyster
Дата: 17.11.06 10:44
Оценка:
Здравствуйте, eao197, Вы писали:

E>Очень похоже, что Round округляет не в ту сторону


Возхможно. Используется Math.Round из BCL, а там по умолчанию банковское округление — если 0.5, то не от нуля (т.е. к 1), а к ближайшему чётному (т.е. 0). Это настраивается, естественно:

double x0 = Math.Round(0.5);  // x0 == 0.0
double x1 = Math.Round(0.5, MidpointRounding.AwayFromZero);  // x1 == 1.0
Re[5]: Ой, чо с D деется-то!?
От: ie Россия http://ziez.blogspot.com/
Дата: 17.11.06 10:54
Оценка:
Здравствуйте, eao197, Вы писали:

E>Очень похоже, что Round округляет не в ту сторону,


Угу, тут в примерах это хорошо видно. — почему такое поведение. Как-то, по-моему, в .NET эта тема поднималась, но к чему пришли не помню, лень искать

E>и что список не реверсирован.


+1 забыл
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[6]: Ой, чо с D деется-то!?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.11.06 11:02
Оценка:
Здравствуйте, 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++.
Re[7]: Ой, чо с D деется-то!?
От: ie Россия http://ziez.blogspot.com/
Дата: 17.11.06 11:12
Оценка:
Здравствуйте, 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>Кстати, именно учет особенности формирования списка и не нравится мне в функциональных решениях со списками. Слишком легко этот момент забыть. Императивный подход именно в данном примере лучше.


На самом деле привыкаешь быстро, однако, сам не перестаю удивляться, как уже вроде привыкши — вдруг не учел этот момент
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[8]: Ой, чо с D деется-то!?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.11.06 11:19
Оценка: :)
Здравствуйте, ie, Вы писали:

ie>
ie>    // как правильно сказал Oyster
ie>    r ::= Round(remainingTrx / (remainingQuantums :> double), 
ie>                MidpointRounding.AwayFromZero) :> int
ie>


А почему у меня на этот символ ругается, мол не знаю, что такое?

ie>На самом деле привыкаешь быстро, однако, сам не перестаю удивляться, как уже вроде привыкши — вдруг не учел этот момент


А это к стати, в другую тему, к вопросу о гарантиях статической типизации
Автор: VladD2
Дата: 08.11.06
.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[9]: Ой, чо с D деется-то!?
От: ie Россия http://ziez.blogspot.com/
Дата: 17.11.06 11:36
Оценка:
Здравствуйте, eao197, Вы писали:

ie>>
ie>>    // как правильно сказал Oyster
ie>>    r ::= Round(remainingTrx / (remainingQuantums :> double), 
ie>>                MidpointRounding.AwayFromZero) :> int
ie>>

E>А почему у меня на этот символ ругается, мол не знаю, что такое?

Ээээ... Этот enum в System лежит, может не добавил using System?

ie>>На самом деле привыкаешь быстро, однако, сам не перестаю удивляться, как уже вроде привыкши — вдруг не учел этот момент

E>А это к стати, в другую тему, к вопросу о гарантиях статической типизации
Автор: VladD2
Дата: 08.11.06
.


Дык тут руки кривые никакая типизация не спасет
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[5]: Ой, чо с D деется-то!?
От: WolfHound  
Дата: 17.11.06 11:39
Оценка:
Здравствуйте, 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) А. Эйнштейн
Re[7]: Ой, чо с D деется-то!?
От: WolfHound  
Дата: 17.11.06 11:39
Оценка: +2
Здравствуйте, 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) А. Эйнштейн
Re[3]: Ой, чо с D деется-то!?
От: FR  
Дата: 17.11.06 11:40
Оценка: +1
Здравствуйте, eao197, Вы писали:


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)))
Re[10]: Ой, чо с D деется-то!?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.11.06 11:41
Оценка: :)
Здравствуйте, ie, Вы писали:

ie>Ээээ... Этот enum в System лежит, может не добавил using System?


В твоем коде этого using-а не было, вот и не работало. Я же на .NET ничего не писал, вот и не знаю, где что лежит.
С using-ом заработало.

Резумируя -- если не считать python-вского синтаксиса, то читабельность, имхо естественно, на уровне D.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: Ой, чо с D деется-то!?
От: FR  
Дата: 17.11.06 11:49
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>>>Если бы он выбрал бы путь аля немерле то давно бы язык зарелизил и кучу фенечек прикрутил.

E>>Немерле уже в релизе?
WH>А D? К тому же опять сколько времени делают немерле и сколько D? Я вот про D узнал за несколько лет до того как первый раз услышал про немерле. И еще учти что немерле горазо технологичнее чем D (один вывод типов чего стоит), а технологии требуют исследований. В тоже время в D нет вобще ничего скольнибудь не тривиального.

D если не ошибаюсь делает всего один человек.
Насчет не тривиального, судя по последнему релизу D уже стал мощнее чем C++. И все что годами не могли реализовать большие компании (ту же подержку шаблонов) в D появилось очень быстро и гораздо удобнее чем в С++. (На возражение что D слизало готовое, Немерле тоже самое сделало с ML языков).
Re[8]: Ой, чо с D деется-то!?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.11.06 11:56
Оценка:
Здравствуйте, 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++.
Re[9]: Ой, чо с D деется-то!?
От: WolfHound  
Дата: 17.11.06 12:15
Оценка: 81 (3)
Здравствуйте, eao197, Вы писали:

E>А это к стати, в другую тему, к вопросу о гарантиях статической типизации
Автор: VladD2
Дата: 08.11.06
.

Это в другую тему
def makeDistrib(trxCount : int, quantums : int)
{
| (_, 0) => []
| (remainingTrx, remainingQuantums) =>
    def r = (remainingTrx :> double) / remainingQuantums;
    def r = Round(r, MidpointRounding.AwayFromZero) :> int;
    r :: makeDistrib(remainingTrx - r, remainingQuantums - 1);
}
def r = makeDistrib(2, 6);
WriteLine($"$r");

Просто если уж начал писать на функциональном языке так пиши в функциональном стиле.
И заметь ни одной изменяемой переменной не вобще.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Ой, чо с D деется-то!?
От: WolfHound  
Дата: 17.11.06 12:18
Оценка:
Здравствуйте, FR, Вы писали:

FR>(На возражение что D слизало готовое, Немерле тоже самое сделало с ML языков).

В немерле совершенно иной вывод типов не имеющий ничего общего в ML.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Ой, чо с D деется-то!?
От: WolfHound  
Дата: 17.11.06 12:31
Оценка:
Здравствуйте, 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) А. Эйнштейн
Re[4]: Ой, чо с D деется-то!?
От: FR  
Дата: 17.11.06 12:44
Оценка:
Здравствуйте, 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 ));
}
Re[10]: Ой, чо с D деется-то!?
От: FR  
Дата: 17.11.06 12:52
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, FR, Вы писали:


FR>>(На возражение что D слизало готовое, Немерле тоже самое сделало с ML языков).

WH>В немерле совершенно иной вывод типов не имеющий ничего общего в ML.

Точно ничего общего не имеющий?
И почему сразу вывод типов, а паттерн матчинг там откуда?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.