Re[14]: Вопрос к Vlad2: Nemerle & R#
От: kan_izh Великобритания  
Дата: 27.03.06 11:59
Оценка:
kan_izh wrote:

> Зачем тут valarray?

Хотя да, понял, для красоты. fixed_valarray ещё есть смысл использовать ради этого, но valarray — действительно странно.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[36]: Вопрос к Vlad2: Nemerle & R#
От: Oyster Украина https://github.com/devoyster
Дата: 27.03.06 11:59
Оценка:
Здравствуйте, eao197, Вы писали:

E>По-моему, твой первый вариант выдал бы 0, но после длительных вычислений в compile-time. Не так?


Я про второй вариант. Первый — да, но я не хочу снова рассказывать, почему там была ошибка, ок?
Re[32]: Вопрос к Vlad2: Nemerle & R#
От: Oyster Украина https://github.com/devoyster
Дата: 27.03.06 11:59
Оценка:
Здравствуйте, Cyberax, Вы писали:

>> C>1. Интероперабельность с остальным кодом на C#.

>> А как насчёт интероперабельности решения на C++ с остальным кодом на Си?
C>В С++ с интероперабельностью все нормально.

В Nemerle тоже, пока код, который использует "физические величины", будет на Nemerle. Т.е. тут как и с C++.

>> Всё-таки Nemerle — это не C#, это совсем другой язык.

C>Тем не менее, интероперабельность нужна.

Она есть

>> В код — куда же ещё?

C>Я понял. А где оно в скомпилированом виде будет храниться?

В макробиблиотеке — просто подключаемая сборка.

C>Или как с

C>template'ами в С++ — при компиляции нужен исходный код?

К счастью, нет.
Re[16]: Вопрос к Vlad2: Nemerle & R#
От: FR  
Дата: 27.03.06 12:06
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>>>Мне вот интересно если Мэерс не описал этот прикол, то сколько бы программистов доперли до него?


FR>>Достаточно того что он допер. Остальные могут использовать.


VD>Это не ответ на мой вопрос.


многие, после того как прочитали Александреску и Со, или просто немного понимают функцианольное программирование.

VD>>>Склько программистов используют подобные приколы в своем коде?


FR>>Обычно подобный код сидит в библиотеках, а тот же boost уже достаточно массово используется.


VD>Примеры, именно такого использования приведи, плиз.


Примеры использования boost?
Это уже почти тоже что просить показать примеры использования FCL
Re[33]: Вопрос к Vlad2: Nemerle & R#
От: FR  
Дата: 27.03.06 12:06
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:


VK>А теперь вариант на D. Как говорится почувствуйте разницу.

VK>[ccode]
VK>import std.stdio;

VK>// можно и специализацию использовать(или вообще тернарный оператор ? : )

VK>// но я намеренно выбрал самый непохожий на C++ вариант
VK>template fact(uint n)
VK>{
VK> static if (n <= 1)
VK> const ulong fact = 1;
VK> else
VK> const ulong fact = n * fact!(n — 1);
VK>}


Это с какой версии он начал такое переваривать?
У меня v0.122 не понимает, вообще интересно что там еще нового есть?
Re[36]: Вопрос к Vlad2: Nemerle & R#
От: Vermicious Knid  
Дата: 27.03.06 12:12
Оценка:
Здравствуйте, eao197, Вы писали:

E>Да просто задумался о глубине вложенных в друг-друга макросов


Глубина произвольная. Компилятор не ставит никаких ограничений. Пример с макросом FactRec правда вызывает ошибку компиляции на больших константах, но это из-за переполнения вычисляемой константы, а не из-за проблем с глубиной вложенных выражений. Он собственно так и пишет:
the operation overflows at compile-time during constants folding in checked mode

За что кстати ему большое спасибо, так как D не удосуживается такое написать скажем при вычислении факториала от 50.

E>из которых вызываются функции, из которых вызываются другие макросы и т.д. Но, собственно, не важно. Просто хотел уточнить.


Напомню, что даже элементарные синтаксические конструкции типа if, while, for, foreach это макросы. Макросы на самом деле это очень масштабируемая штука. Компилятор Nemerle только стартует не очень быстро(скорее всего из-за проблем которые сейчас есть со стандартной библиотекой и global assembly cache, а еще правда какое-то время тратиться на поиск макросов по сборкам), а работает он весьма шустро. И использование сложных макросов практически не замедляет работу, все таки макросы это скомпилированный код.

А по поводу функций из которых вызываются другие макросы — они же не вызываются каждый раз при вызове этих функций. Достаточно и одного раза.
Re[34]: Вопрос к Vlad2: Nemerle & R#
От: Vermicious Knid  
Дата: 27.03.06 12:25
Оценка: 8 (1)
Здравствуйте, FR, Вы писали:

Это уже пошел злостный оффтопик.

FR>Это с какой версии он начал такое переваривать?

У меня версия 0.150.

FR>У меня v0.122 не понимает,

В версии 0.122 это можно было сделать, просто без static if.

FR>вообще интересно что там еще нового есть?

По changelog и документации можно попытаться отследить. Самые большие изменения конечно в шаблонах, по этому поводу можно почитать вот это.
Re[32]: Вопрос к Vlad2: Nemerle & R#
От: Дарней Россия  
Дата: 27.03.06 12:38
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>В С++ с интероперабельностью все нормально.


и для шаблонов тоже?
конкретно тот код, который здесь обсуждается — ты сможешь использовать его в любом языке, кроме плюсов?
Да ты его даже не на каждом компиляторе С++ использовать сможешь
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[34]: Вопрос к Vlad2: Nemerle & R#
От: Kluev  
Дата: 27.03.06 17:28
Оценка: :)
Здравствуйте, eao197, Вы писали:

E>Да, действительно. Но это легко исправляется. Код даже меньше получится:

E>

E>template< int N >
E>struct Factorial {
E> enum { value = N * Factorial< N-1 >::value };
E>};

E>template<>
E>struct Factorial< 0 > {
E> enum { value = 1 };
E>};


E>Но вообще я согласен с Oyster, что сложные compile-time вычисления (если все типы заранее известны) на Nemerle могут выглядеть проще, чем на C++.


compile-time вычисления — это редкость.
А вот рантайм факториал я бы написал так:

extern const double precomputed_factorials[];

inline double factorial(int n)
{
   if ( n < precomp_factorial_max ) // берем готовый из таблицы
      return precomputed_factorials[n];

   // вычисляем по необходимости
}
Re[33]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 22:06
Оценка: 12 (1)
Здравствуйте, Oyster, Вы писали:

O>Попробуй скомпилить — скажет, что не все ветки возвращают значения. Для того, чтобы это понять, Nemerle знать не надо — достаточно знать тот же C++


Вообще-то match в Немерле просто неявно дописывает возбуждение исключения для не перекрытого диапазона значений и выдается предупрждение компилятора. Но вот if без else недопустим.
Наверно самая разумная запись будет:
def Fact(x : int) : int
{ | 0
  | 1 => 1
  | x when x > 0 => x * Fact(x - 1)
  | _ => throw ArgumentException("x")
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[34]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 22:06
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:

VK>>
VK>>fact(n : uint) : ulong
VK>>{
VK>>  | 0 => 1ul
VK>>  | 1 => 1ul
VK>>  | _ => (x :> ulong) * fact(x - 1) 
VK>>}
VK>>


Внимание на выделение!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 23:40
Оценка: +1 -1
Здравствуйте, Vermicious Knid, Вы писали:

VK>Самый близкий к истине вариант привел xbit. А вот полностью идеологически правильный и грамотный(имхо) вариант:

VK>
VK>fact(n : uint) : ulong
VK>{
VK>  | 0 => 1
VK>  | 1 => 1
VK>  | _ => (x :> ulong) * fact(x - 1) 
VK>}
VK>


Не понял этого шаманства. Соственно вот так будет достаточно:
def Fact(x : uint) : ulong
{ | 0U | 1U => 1UL
  | _       => x * Fact(x - 1U)
}

WriteLine(Fact(20));


ЗЫ

А вообще, когда я вижу примеры факториала с Фибоначи, то понимаю, что начилась функциональная пенесометрия.
Главное, что по жизни подобный код невозможно встретить днем с огнем. Но как только появляется функциональный язык, то в примерах раз за разом появляются Финбоначи и факториалы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 23:40
Оценка: +3
Здравствуйте, eao197, Вы писали:

E>Ты уходишь от проблемы. Сколько бы ни была задача маловероятна и редка на практике, если лично тебе или лично мне придется ее решать (это будет нам выгодно), то решать ее придется.


Ключевое слово здесь "если". В качестве примеров приводятся крайне радкие на практике и в общем-то решаемые другими средствами задачи, но при этом на них делается такой акцент, что может показаться, что именно из-за этого программисты выбирают С++.

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

Результаты этого решения...

Сначала позитивные:
1. Возможность упростить решение очень узкого класса задач.
2. Возможность метапрограммирования.

Теперь негативные:
1. Усложнение языка и (в особенности) компиляторов.
2. Море малопонятного, трудного в отладке, выдающего ужасные диагностические сообщения, медленно компилируемого, порождающего огромные количества ненужных временных типов кода.
3. Ограниченность решения связанная с тем, что типы можно параметризовать только целочисленными константами которые к тому же не могут получаться компилятором извне.

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

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

Плюсы подхода очевидны. Минус только один. Конкретная задача на которой заострено внимание решается менее элегантно (с большими трудозатратами).

Теперь собственно вопрос. Какова цель таких примеров?
Мне кажется это всего лишь хорошо придуманный прием защиты далеко не лучшего решения.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 23:40
Оценка: +1
Здравствуйте, Дарней, Вы писали:

E>>Нужно эти слова к Nemerle для очень горячих голов отнести.


Д>а никто такого и не говорил. Вполне очевидно например, что немерле не приспособлен для программирования на низком уровне,


+1
В нем вообще нет небезопастных конструкций.

Д> равно как и для RTS.


А вот это не факт. В самом языке нет никаких ораничений в поддержке СРВ. Ограничения есть в реализации дотната. Но это не языковая проблема.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 23:40
Оценка: -1
Здравствуйте, Oyster, Вы писали:

O>Я не вижу принципиальных проблем в том, чтобы реализовать эту функциональность на макросах Nemerle (ради пресловутого compile-time) — это сделать будет непросто, но и решение на шаблонах непростое. Естественно, это будут не скалярные параметры generic-ов (так делать просто нельзя), а нечто иное.


+1

O>Я сам думал (ещё до того, как начались все эти обсуждения про физические величины) заимплементать этот код на Nemerle (понравился мне вариант на C++, чего уж там) чисто ради спортивного интереса, но времени нету...


Откровенно говоря мне подобные узкоспецифические задачи не интересны. Но можно сделать ход конем и предложить решить задачку авторов языка. Думаю, что им это может быть интересно, так как они в принципе люди науки.

Кто у нас может хорошо сформулировать вопрос на английском?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 23:40
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>Но поинт здесь был в другом. Хоть на C++ решение и не тривиальное на первый взгляд, но самое сложное в нем -- это додуматься до него. Сама же реализация отнюдь не сложная. Бывают гораздо более сложные навороты (например, проверка чисел на простоту в compile-time). И, возвращаясь к первоначальному замечанию VladD2 о скалярных параметрах шаблонах, вполне себе востребованный и жизнеспособный код.


Вот, вот, вот. Замечательный пример!
Он как раз демонстрирует как примитивная задача будучи решенная через задницу становится "гораздо более сложным наворотом".

Вот проверить число на то является ли оно простым примитивнейшая задача для Немерла (если конечно знать алгоритм проверки/иметь готовый список), так как его макросы это просто код выполняемый во время компиляции.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 23:40
Оценка: +1
Здравствуйте, Oyster, Вы писали:

O>Сейчас дам ма-аленький такой пример. Будем считать факториал в compile-time:...


Еще про частичные вычисления нужно не забывать (http://nemerle.org/Partial_evaluation), так как порой можно если не вычислить все заранее, то хотя бы ускорить вычисления предварительными рассчетами. Хорой пример здесь парсинг чего угодно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 23:40
Оценка: -1
Здравствуйте, Oyster, Вы писали:

O>
O>namespace Oyster
O>{
O>  public module Math
O>  {
O>    // Просто метод, который просто считает факториал в рантайме
O>    static public Fact(x : int) : int
O>    {
O>      | 1 => 1
O>      | _ =>
O>        if (x > 1)
O>          x * Fact(x - 1)
O>        else
O>          throw ArgumentException("x")
O>    }
O>  }
O>}
O>


Кстати, раз уж мы говорим о функциональном языке, то факториалы лучше тоже в функциональном стиле описывать:
def Fact(x : uint) : ulong
{
  def Loop(acc : ulong, x : uint)
  {
    if (x <= 1) acc else Loop(acc * x, x - 1)
  };
  
  Loop(1UL, x)
}

WriteLine(Fact(20));

Учитывая не нениальный оптимизатор данный код окажется самым шустрым, так как он использует концевую рекурсию. Компилятор развернет концевую рекурсии и подставить вычисление прямо по месту. Думаю процентов 20% на этом можно выиграть.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Вопрос к Vlad2: Nemerle & R#
От: Vermicious Knid  
Дата: 27.03.06 23:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кстати, раз уж мы говорим о функциональном языке, то факториалы лучше тоже в функциональном стиле описывать:


Код который ты привел крайне похож на то, что генерирует макрос for. Уж проще воспользоваться им. Ну его к черту, этот функциональный стиль. В этой задаче он ни к чему, особенно если он не способствует улучшению читабельности.
Re[24]: Вопрос к Vlad2: Nemerle & R#
От: Vermicious Knid  
Дата: 28.03.06 00:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Думаю, что им это может быть интересно, так как они в принципе люди науки.

VD>Кто у нас может хорошо сформулировать вопрос на английском?

Я как-то задавал подобные вопросы авторам языка. Судя по ответам их подобные задачи совсем не интересуют. Это было достаточно давно и вопросы были о проблемах и упрощении реализации аналога expression templates на Nemerle.

Мой подход был как раз заключался в использовании макро-операторов и проверке типов. Тогда честно говоря возникали серьезные проблемы с таким подходом. Сейчас ситуация возможно изменилась, но я думаю не сильно.

Зато мои собственные взгляды на программирование с тех пор сильно изменились и подобные вещи мне теперь даром не нужны. Если кто-то такое заимплементирует, то никаких положительных эмоций лично у меня не возникнет. Тем более если это будут разработчики языка. Больше пользы будет если они потратят это время на фиксинг багов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.