Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 04.10.10 07:33
Оценка: 321 (9)
Здравствуйте, hardcase, Вы писали:

H>Парсер C#4.0, генерирующий AST, вроде как принял законченную форму к r9078. Кому интересно, может посмотреть и ужаснуться.


Парсер пристыкован к компилятору в r9249.
С помощью SharpDevelop теперь возможно создавать Windows-формы на C# и компилировать их ncc.

Внимание: судя по тестам (csparser) на достаточно больших исходных текстах (SharpDevelop IDE, Janus, RServer, SharedSource CLR Implementation) в парсере нехаватет лишь поддержки директив препроцессора, в остальном он способен разбирать корректные исходные тексты на C#.

04.10.10 22:18: Ветка выделена из темы [PEG] Парсер C# 4.0
Автор: hardcase
Дата: 24.08.10
— VladD2
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [Bug]
От: hardcase Пират http://nemerle.org
Дата: 25.10.10 19:27
Оценка: 45 (1)
Здравствуйте, Jack128, Вы писали:

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


J>при подключении такого файлика cs файлика к nemerle проэкту при компиляции вылазит ошибка:


Поправил конвертацию extention-методов в r9294.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 10.10.10 11:23
Оценка: 40 (1)
Здравствуйте, hardcase, Вы писали:

Заставил компилировться XAML-разметку.
Для этого пришлось сделать очень смешную вещь в Nemerle.MSBuild.targets:

    <PropertyGroup>
        <MSBuildAllProjects>$(MSBuildAllProjects);$(Nemerle)\Nemerle.MSBuild.targets</MSBuildAllProjects>
        <DefaultLanguageSourceExtension>.cs</DefaultLanguageSourceExtension> <!-- .n -->
        <Language>C#</Language>  <!-- Nemerle -->
    </PropertyGroup>
/* иЗвиНите зА неРовнЫй поЧерК */
Re: [Bug]
От: Jack128  
Дата: 17.10.10 15:05
Оценка: 18 (1)
Здравствуйте, hardcase, Вы писали:

при подключении такого файлика cs файлика к nemerle проэкту при компиляции вылазит ошибка:


Error 21 bad method name C:\Users\Женя\Documents\Visual Studio 2008\Projects\Project1\WindowsFormsApplication3\WindowsFormsApplication3\Maybe.cs 60 10 WindowsFormsApplication3


на вот этом методе: public static Maybe<U> SelectMany<T, U>(
this Maybe<T> m,
Func<T, Maybe<U>> k)


using System;
using System.Collections.Generic;
using System.Linq;

namespace Es.Common.Monads
{
    public class Maybe<T> : IEquatable<Maybe<T>>
    {
        public readonly static Maybe<T> Nothing = new Maybe<T>();
        public T Value { get; private set; }
        public bool HasValue { get; private set; }
        Maybe()
        {
            HasValue = false;
        }
        public Maybe(T value)
        {
            Value = value;
// ReSharper disable RedundantCast
            HasValue = ((object)value != null);
// ReSharper restore RedundantCast
        }

        public bool Equals(Maybe<T> other)
        {
            if (ReferenceEquals(null, other)) return false;
            if (ReferenceEquals(this, other)) return true;
            return Equals(other.Value, Value) && other.HasValue.Equals(HasValue);
        }

        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            if (obj.GetType() != typeof (Maybe<T>)) return false;
            return Equals((Maybe<T>) obj);
        }

        public override int GetHashCode()
        {
            unchecked
            {
                return (Value.GetHashCode() * 397) ^ HasValue.GetHashCode();
            }
        }

        public static bool operator ==(Maybe<T> left, Maybe<T> right)
        {
            return Equals(left, right);
        }

        public static bool operator !=(Maybe<T> left, Maybe<T> right)
        {
            return !Equals(left, right);
        }
    }

    public static class MaybeExtentions
    {
        public static Maybe<U> SelectMany<T, U>(
             this Maybe<T> m,
             Func<T, Maybe<U>> k)
        {
            return m.HasValue ? k(m.Value) : Maybe<U>.Nothing;
        }

        public static Maybe<V> SelectMany<T, U, V>(
            this Maybe<T> m,
            Func<T, Maybe<U>> k,
            Func<T, U, V> s)
        {
            return m.SelectMany(x => k(x).SelectMany(y => s(x, y).ToMaybe()));
        }

        public static Maybe<T> ToMaybe<T>(this T value)
        {
            return new Maybe<T>(value);
        }
    }
}
Re[8]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 11:15
Оценка: 1 (1)
Здравствуйте, Воронков Василий, Вы писали:

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


ВВ>>>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.

VD>>http://rsdn.ru/forum/nemerle/3945731.1.aspx
Автор: hardcase
Дата: 03.09.10


ВВ>Я так понимаю, этот список не совсем точен. ref/out прикрутили (?).


Да.

ВВ>Но при этом операции типа инкремента и присваивания работают не так, как в Шарпе.


Не уверен. Они в приципе могут быть реализованы не через немерловые макры ++ и --, а через:
<[ { $x++; $x } ]>

или что-то вроде того.

ВВ>Может, еще какие вещи.


Может.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 27.10.10 22:22
Оценка: 1 (1)
Здравствуйте, hardcase, Вы писали:

Добавил поддержку ++ и -- операторов а также цепочечных присваиваний:
x = ++i;
a = b = c;
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 17.10.10 13:39
Оценка: +1
Здравствуйте, Jack128, Вы писали:

J>а как на практике эту фичу заюзать??? Простого добавления файла *.cs в проэкт недостаточно.


Ну и добавлять нужно так, чтобы он был <Compile>, а не <Content> или <None>.

И оверквотить не надо.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[11]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 11:55
Оценка: +1
Здравствуйте, hardcase, Вы писали:

ВВ>>Просто дело в том, что raw goto как раз используется очень редко, тогда как goto case/goto default все же почаще.

H>Это сильно сложнее, так как нужно разбираться с лапшой, в которую превращается match после работы DecisionTreeCompiler-а.

А зачем разбираться с лапшой? Ты же транслируешь C# AST в AST Немерле, т.е. можно просто тупо считать, что каждый case в шарповом свитче — это создание метки. Именем метки может быть индекс кейса, т.е. номер, под которым он идет в теле switch-а.
Re[14]: Компиляция C# 4.0 в рамках проекта Nemerle
От: catbert  
Дата: 19.10.10 16:04
Оценка: +1
Здравствуйте, Воронков Василий, Вы писали:

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


ВВ>>>Э, тут надо быть осторожнее return — это ж тоже по сути подвид goto. И так, глядишь, все C#-программисты без ног останутся.

ВВ>>>За корутины, кстати, тоже ноги надо отрывать?
VD>>Вот за подобное и...во тебе минусы и ставят.

ВВ>Ну вот я правда не понимаю, чем простое скромное goto хуже корутины, когда мы прыгаем из одной функции в другую. Тот же goto, вид сбоку. И да, можешь поставить мне минус.


If тоже подвид goto, и match в какой-то степени тоже. Но if, match, return и корутины код разъясняют, а чистый goto запутывает.
Re: Компиляция C# 4.0 рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.10.10 18:22
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Внимание: судя по тестам (csparser) на достаточно больших исходных текстах (SharpDevelop IDE, Janus, RServer, SharedSource CLR Implementation) в парсере нехаватет лишь поддержки директив препроцессора, в остальном он способен разбирать корректные исходные тексты на C#.


Давно пора реализовать обработку препроцессора. Там дел-то на пару часов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Компиляция C# 4.0 рамках проекта Nemerle
От: WolfHound  
Дата: 04.10.10 18:39
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Давно пора реализовать обработку препроцессора. Там дел-то на пару часов.

Просто там только если делать в два прохода.
Ибо код C# код препроцессора фактически два разных языка переплетающихся в одном файле.
Если же делать в один проход то нужно что-то изобретать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Компиляция C# 4.0 рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.10.10 19:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Давно пора реализовать обработку препроцессора. Там дел-то на пару часов.

WH>Просто там только если делать в два прохода.
WH>Ибо код C# код препроцессора фактически два разных языка переплетающихся в одном файле.
WH>Если же делать в один проход то нужно что-то изобретать.

Препроцессор настолько примитивен, что его даже руками можно реализовать.

В немерловом лексере он сделан в один проход. Но можно и в два. На это времени почти не уйдет.

ЗЫ

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

В теле #if-а можно было бы менять точку расширения в правиле парсинга пробелов в зависимости от значения выражения #if-а.
Если оно вычисляется в TRUE, в точку расширения запихивать правило которое пропускает все до следующего #endif или #else. Если выражение вычисляется в FALSE, то подставлять обычное правило пропуска пробелов.

При этом останется только корректно среагировать на #endif того #if-а кондишон которого вычислился в FALSE.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Компиляция C# 4.0 рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.10.10 19:25
Оценка:
Это. Ты не хочешь в Скайпе появиться?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Компиляция C# 4.0 в рамках проекта Nemerle
От: AngeL B. Россия  
Дата: 05.10.10 17:31
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Парсер пристыкован к компилятору в r9249.


эээээ, то есть я правильно понимаю, что компилятор ncc теперь умеет компилировать сразу два языка в зависимости от расширения в рамках одного проекта?
Re[2]: Компиляция C# 4.0 в рамках проекта Nemerle
От: IT Россия linq2db.com
Дата: 05.10.10 17:40
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>эээээ, то есть я правильно понимаю, что компилятор ncc теперь умеет компилировать сразу два языка в зависимости от расширения в рамках одного проекта?


Yep.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.10 17:56
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>эээээ, то есть я правильно понимаю, что компилятор ncc теперь умеет компилировать сразу два языка в зависимости от расширения в рамках одного проекта?


Да. Но второй язык поддерживается не на 100%.

Во-первых, пока что не поддерживается препроцессор. Но это скоро устраним.
Во-вторых, не все возможности C# 4.0 поддерживаются полностью.
В-третьих, это не совсем C#. Синтаксис поддерживается на 100%, а вот семантика — нет. Фактически — это автоматический конвертер из C# 4.0 в Nemerle, так что в тех случаях когда семантика (поведение) немерла отличается от шарповской, компилируемый код будет вести себя не так как C# 4.0, а как Nemerle. Простейший пример — работа с лямбдами. В отличии от шарпа в немреле есть функциональный тип, так что код вроде:
var f = x => x * x;
WriteLine(f(3));

Будет некорректен с точки зрения шарпа, но корректно с точки зрения немерла, так что оно пройдет компиляцию.

Кроме того будет работать вывод типов немерла.

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

Так что можно подключать к проекту немерла имеющиеся исходники на C# и развивать их уже на немреле.
Работают даже partial-классы. Так что можно иметь часть класса на Nemerle, а часть на C#.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 05.10.10 18:47
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Работают даже partial-классы. Так что можно иметь часть класса на Nemerle, а часть на C#.


Кстати тут и отличие. Ncc потребует указать для всех частей одинаковые модификаторы доступа.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.10 20:14
Оценка:
Здравствуйте, hardcase, Вы писали:

VD>>Работают даже partial-классы. Так что можно иметь часть класса на Nemerle, а часть на C#.


H>Кстати тут и отличие. Ncc потребует указать для всех частей одинаковые модификаторы доступа.


А шарп нет?

Ну, это уже мелочи, думаю... Таких отличий может быть много.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 06.10.10 19:37
Оценка:
Здравствуйте, hardcase, Вы писали:

H>С помощью SharpDevelop теперь возможно создавать Windows-формы на C# и компилировать их ncc.


Только что замечено: автокомплит SharpDevelop в *.cs файлах подсасывает информацию, полученную из *.n файлов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.10.10 20:11
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Только что замечено: автокомплит SharpDevelop в *.cs файлах подсасывает информацию, полученную из *.n файлов.


Чё? Я не представляю как такое возможно.

К сожалению, в студии даже дизайнер форм не подцепляется. Говорит, что проект не той системы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 07.10.10 16:00
Оценка:
Здравствуйте, VladD2, Вы писали:

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


H>>Только что замечено: автокомплит SharpDevelop в *.cs файлах подсасывает информацию, полученную из *.n файлов.


VD>Чё? Я не представляю как такое возможно.


Видимо всему виной Class View. SD поддерживает его автоматически:

/* иЗвиНите зА неРовнЫй поЧерК */
Re: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 09.10.10 18:09
Оценка:
Здравствуйте, hardcase, Вы писали:

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


H>>Парсер C#4.0, генерирующий AST, вроде как принял законченную форму к r9078. Кому интересно, может посмотреть и ужаснуться.


Теперь посмотреть можно проще: добавил парсер C# в секцию "PowerPack" инсталлятора.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.10.10 13:33
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Теперь посмотреть можно проще: добавил парсер C# в секцию "PowerPack" инсталлятора.


Надо было толкнуть сборку инсталлятора.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.10.10 13:35
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Заставил компилировться XAML-разметку.

H>Для этого пришлось сделать очень смешную вещь в Nemerle.MSBuild.targets:

H>
H>    <PropertyGroup>
H>        <MSBuildAllProjects>$(MSBuildAllProjects);$(Nemerle)\Nemerle.MSBuild.targets</MSBuildAllProjects>
H>        <DefaultLanguageSourceExtension>.cs</DefaultLanguageSourceExtension> <!-- .n -->
H>        <Language>C#</Language>  <!-- Nemerle -->
H>    </PropertyGroup>
H>


А как это дело будет в студии себя вести?

Хорошо бы создать проект демонстрирующий работу с WPF.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.10.10 13:36
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Заставил компилировться XAML-разметку.

H>Для этого пришлось сделать очень смешную вещь в Nemerle.MSBuild.targets:

H>
H>    <PropertyGroup>
H>        <MSBuildAllProjects>$(MSBuildAllProjects);$(Nemerle)\Nemerle.MSBuild.targets</MSBuildAllProjects>
H>        <DefaultLanguageSourceExtension>.cs</DefaultLanguageSourceExtension> <!-- .n -->
H>        <Language>C#</Language>  <!-- Nemerle -->
H>    </PropertyGroup>
H>


Кстати, а это дело в других местах нам не повредит? Тому же дизайрену ВинФормсов?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 11.10.10 18:27
Оценка:
Здравствуйте, VladD2, Вы писали:

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


H>>Заставил компилировться XAML-разметку.

H>>Для этого пришлось сделать очень смешную вещь в Nemerle.MSBuild.targets:

H>>
H>>    <PropertyGroup>
H>>        <MSBuildAllProjects>$(MSBuildAllProjects);$(Nemerle)\Nemerle.MSBuild.targets</MSBuildAllProjects>
H>>        <DefaultLanguageSourceExtension>.cs</DefaultLanguageSourceExtension> <!-- .n -->
H>>        <Language>C#</Language>  <!-- Nemerle -->
H>>    </PropertyGroup>
H>>


VD>А как это дело будет в студии себя вести?


Ну, этот хак я сделал у себя локально, ради теста.
Я эти свойства используются для компиляции XAML файлов, возможно файлы моделей EntityFramework также их используют.
Студию не проверял, а SharpDevelop-ный дизайнер виндовсформс на эту настройку точно не смотрит (только на xxx.Designer.cs).

В студии визуальный дизайнер WPF не загружается — жалуется что Немерловая интеграция ему null где-то вертает, но XAML редактировать позволяет. В SharpDevelop визуального дизайнера нет.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Jack128  
Дата: 17.10.10 13:34
Оценка:
Здравствуйте, VladD2, Вы писали:

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


AB>>эээээ, то есть я правильно понимаю, что компилятор ncc теперь умеет компилировать сразу два языка в зависимости от расширения в рамках одного проекта?


VD>Да.


а как на практике эту фичу заюзать??? Простого добавления файла *.cs в проэкт недостаточно.
Re[4]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.10.10 13:37
Оценка:
Здравствуйте, Jack128, Вы писали:

J>а как на практике эту фичу заюзать??? Простого добавления файла *.cs в проэкт недостаточно.


Достаточно. Просто для этого нужно использовать последнюю версию компилятора которая еще не доступна в виде инсталлятора.

Чтобы попробовать это дело можно самостоятельно собрать проект:
http://nemerle.googlecode.com/svn/nemerle/trunk/snippets/peg-parser/CSharp/CSharpParser.sln
и скопировать получившиеся файлы в каталог где установлен Nemerle (по умолчанию %ProgramFiles%\Nemerle).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Jack128  
Дата: 17.10.10 14:05
Оценка:
Здравствуйте, VladD2, Вы писали:

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


J>>а как на практике эту фичу заюзать??? Простого добавления файла *.cs в проэкт недостаточно.


VD>Достаточно. Просто для этого нужно использовать последнюю версию компилятора которая еще не доступна в виде инсталлятора.


VD>Чтобы попробовать это дело можно самостоятельно собрать проект:

VD>http://nemerle.googlecode.com/svn/nemerle/trunk/snippets/peg-parser/CSharp/CSharpParser.sln
VD>и скопировать получившиеся файлы в каталог где установлен Nemerle (по умолчанию %ProgramFiles%\Nemerle).

Угу, работает, сенкс. Правда студия ошибки показывает, но компилит..
Re[6]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.10.10 14:12
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Угу, работает, сенкс. Правда студия ошибки показывает, но компилит..


Это интеллисенс от MS. Он ни о C# 4.0, ни о Nemerle ничего не знает. Так что комплитить он будет только то, что есть в этом файле и некотором наборе (который известен только кому-то из MS) стандартных сборок.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.10.10 14:13
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>Угу, работает, сенкс. Правда студия ошибки показывает, но компилит..


VD>Это интеллисенс от MS. Он ни о C# 4.0, ни о Nemerle ничего не знает. Так что комплитить он будет только то, что есть в этом файле и некотором наборе (который известен только кому-то из MS) стандартных сборок.


Извиняюсь... прочел "комплитит" вместо "компилит".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Bug]
От: hardcase Пират http://nemerle.org
Дата: 17.10.10 17:06
Оценка:
Здравствуйте, Jack128, Вы писали:

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


J>при подключении такого файлика cs файлика к nemerle проэкту при компиляции вылазит ошибка:


Поправил (два бага).

Сейчас компилятору не нравятся экстеншн методы:
m.SelectMany(x => k(x).SelectMany(y => s(x, y).ToMaybe()));


При замене на
MaybeExtentions.SelectMany(m, x => MaybeExtentions.SelectMany(k(x), y => MaybeExtentions.ToMaybe(s(x, y))));

файл компилируется (за исключением давней проблемы с реализацией IEquatable<T>).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: [Bug]
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.10.10 19:36
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Поправил (два бага).


H>Сейчас компилятору не нравятся экстеншн методы:

H>
H>m.SelectMany(x => k(x).SelectMany(y => s(x, y).ToMaybe()));
H>


Попытался воспроизвести этот баг на самом Nemerle:
using System;
using System.Console;
using System.Linq;

public class Maybe[T]
{
    public static Nothing : Maybe[T] = Maybe();
    public Value : T { get; private set; }
    public HasValue : bool { get; private set; }
}

public module Program
{
    public static SelectMany[T, U](this m : Maybe[T], k : Func[T, Maybe[U]]) : Maybe[U]
    {
        if (m.HasValue) k(m.Value) else Maybe.Nothing;
    }
        
  public static SelectMany[T, U, V](
      this m : Maybe[T],
      k : Func[T, Maybe[U]],
      s : Func[T, U, V]) : Maybe[V]
  {
    m.SelectMany(x => k(x).SelectMany(y => s(x, y).ToMaybe()))
  }

  public static ToMaybe[T](this _value : T) : Maybe[T] { null }

  Main() : void { }
}


Код успешно компилируется.

Так что одно из трех:
1. Ошибка все же в конверторе C# -> Nemerle.
2. Я не смог воспроизвести проблему.
3. Я пофиксил данную проблему в последнем комите.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Bug]
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.10.10 19:43
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>3. Я пофиксил данную проблему в последнем комите.


Мало-вероятно. Я поставил точку останова в то место обнаруживается зацикливание кортежа, но управление туда не пришло. Так что надо искать ошибку в другом месте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Bug]
От: hardcase Пират http://nemerle.org
Дата: 17.10.10 20:17
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Попытался воспроизвести этот баг на самом Nemerle:

VD>Код успешно компилируется.


Ок, я на недели посмотрю что там за ерунда творится.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 10:11
Оценка:
Здравствуйте, VladD2, Вы писали:

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

J>>а как на практике эту фичу заюзать??? Простого добавления файла *.cs в проэкт недостаточно.
VD>Достаточно. Просто для этого нужно использовать последнюю версию компилятора которая еще не доступна в виде инсталлятора.

А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.
Re[6]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 19.10.10 10:26
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

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


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

J>>>а как на практике эту фичу заюзать??? Простого добавления файла *.cs в проэкт недостаточно.
VD>>Достаточно. Просто для этого нужно использовать последнюю версию компилятора которая еще не доступна в виде инсталлятора.

ВВ>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.


Тут
Автор: hardcase
Дата: 24.08.10
было.
Как появится свободное время, соберу все в одном месте.

Ко всему прочему еще не в полной мере работают операторы присваивания и инкремента/декремента (сейчас они имею семантику Nemerle и возвращают void).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 10:33
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Тут
Автор: hardcase
Дата: 24.08.10
было.

H>Как появится свободное время, соберу все в одном месте.

Да, это было бы полезно.

H>Ко всему прочему еще не в полной мере работают операторы присваивания и инкремента/декремента (сейчас они имею семантику Nemerle и возвращают void).


Я так понимаю и присваивание возвращает void?
Re[8]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 19.10.10 10:37
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Я так понимаю и присваивание возвращает void?


Имеенно.
К сожалению (или счастью?), являясь крайне ленивым человеком, я никак не соберусь отрехакторить конвертер (вернее я уже пытался, но звезды не сошлись на небе) и наконец добавить пару воркэраундов для инкрементов и присваиваний.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 11:03
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.


http://rsdn.ru/forum/nemerle/3945731.1.aspx
Автор: hardcase
Дата: 03.09.10
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 11:04
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.


Как раз goto можно и реализовать. Сложнее буде реализовать goto case.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 11:12
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.

VD>http://rsdn.ru/forum/nemerle/3945731.1.aspx
Автор: hardcase
Дата: 03.09.10


Я так понимаю, этот список не совсем точен. ref/out прикрутили (?). Но при этом операции типа инкремента и присваивания работают не так, как в Шарпе. Может, еще какие вещи.
Re[7]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 11:13
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.

VD>Как раз goto можно и реализовать. Сложнее буде реализовать goto case.

Почему? По идее особой разницы тут быть не должно.
Re[9]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 11:20
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>Но при этом операции типа инкремента и присваивания работают не так, как в Шарпе.

VD>Не уверен. Они в приципе могут быть реализованы не через немерловые макры ++ и --, а через:
VD>
VD><[ { $x++; $x } ]>
VD>

VD>или что-то вроде того.
ВВ>>Может, еще какие вещи.

Хардкейс говорит, что такого нет. Понятно в принципе, что это не должно быть большой проблемой в реализации. Не уверен, впрочем, что и отсутствие этого является большой проблемой.
Хотелось бы просто увидеть полный актуальный список, так сказать.
Re[8]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 11:24
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Почему? По идее особой разницы тут быть не должно.


В типизированном AST есть аналог goto. А вот в match такого аналога нет. Эмулирвоать конечно можно, но объем работ будет существенно больше. "goto" же можно реализовать за пол часа.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 11:26
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Хардкейс говорит, что такого нет. Понятно в принципе, что это не должно быть большой проблемой в реализации. Не уверен, впрочем, что и отсутствие этого является большой проблемой.


+1

ВВ>Хотелось бы просто увидеть полный актуальный список, так сказать.


Я поправил тот список. Если еще что-то найдете, сообщите мне, я поправлю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 11:27
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>Почему? По идее особой разницы тут быть не должно.

VD>В типизированном AST есть аналог goto. А вот в match такого аналога нет. Эмулирвоать конечно можно, но объем работ будет существенно больше. "goto" же можно реализовать за пол часа.

Ну т.е. в AST есть понятие goto, значит должно быть и понятие label? На первый взгляд все, что нужно сделать — это генерировать лабел для каждого вхождения матча. Или я не вижу какие-то нюансы?

Просто дело в том, что raw goto как раз используется очень редко, тогда как goto case/goto default все же почаще.
Re[10]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 19.10.10 11:42
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну т.е. в AST есть понятие goto, значит должно быть и понятие label? На первый взгляд все, что нужно сделать — это генерировать лабел для каждого вхождения матча. Или я не вижу какие-то нюансы?


TExpr.Goto и TExpr.Label, но есть ньюансик — нужно типизировать тело, думаю, задача решается с использованием какого-нить вспомогательного макроса, который типизирует блок и изготовит переход на метку.

ВВ>Просто дело в том, что raw goto как раз используется очень редко, тогда как goto case/goto default все же почаще.


Это сильно сложнее, так как нужно разбираться с лапшой, в которую превращается match после работы DecisionTreeCompiler-а.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 19.10.10 11:45
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Просто дело в том, что raw goto как раз используется очень редко, тогда как goto case/goto default все же почаще.


Хмм. Я вот ни разу не пользовался goto case или goto default. Только простейшим goto.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 12:01
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну т.е. в AST есть понятие goto, значит должно быть и понятие label?


Естественно.

ВВ>На первый взгляд все, что нужно сделать — это генерировать лабел для каждого вхождения матча. Или я не вижу какие-то нюансы?


Много работы. Причем не тривиальной. Но реализовать конечно можно.

ВВ>Просто дело в том, что raw goto как раз используется очень редко, тогда как goto case/goto default все же почаще.


Тем кто использует goto вообще надо ноги отрывать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 12:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Много работы. Причем не тривиальной. Но реализовать конечно можно.


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

ВВ>>Просто дело в том, что raw goto как раз используется очень редко, тогда как goto case/goto default все же почаще.

VD>Тем кто использует goto вообще надо ноги отрывать.

Э, тут надо быть осторожнее return — это ж тоже по сути подвид goto. И так, глядишь, все C#-программисты без ног останутся.

За корутины, кстати, тоже ноги надо отрывать?
Re[12]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 14:06
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>>>Просто дело в том, что raw goto как раз используется очень редко, тогда как goto case/goto default все же почаще.

VD>>Тем кто использует goto вообще надо ноги отрывать.

ВВ>Э, тут надо быть осторожнее return — это ж тоже по сути подвид goto. И так, глядишь, все C#-программисты без ног останутся.


ВВ>За корутины, кстати, тоже ноги надо отрывать?


Вот за подобное и...во тебе минусы и ставят.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 14:09
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>Э, тут надо быть осторожнее return — это ж тоже по сути подвид goto. И так, глядишь, все C#-программисты без ног останутся.

ВВ>>За корутины, кстати, тоже ноги надо отрывать?
VD>Вот за подобное и...во тебе минусы и ставят.

Ну вот я правда не понимаю, чем простое скромное goto хуже корутины, когда мы прыгаем из одной функции в другую. Тот же goto, вид сбоку. И да, можешь поставить мне минус.
Re[11]: Компиляция C# 4.0 в рамках проекта Nemerle
От: IT Россия linq2db.com
Дата: 19.10.10 15:48
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Это сильно сложнее, так как нужно разбираться с лапшой, в которую превращается match после работы DecisionTreeCompiler-а.


А если case в который делается goto завернуть в локальную функцию?
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:24
Оценка:
Здравствуйте, hardcase, Вы писали:

H>TExpr.Goto и TExpr.Label, но есть ньюансик — нужно типизировать тело, думаю, задача решается с использованием какого-нить вспомогательного макроса, который типизирует блок и изготовит переход на метку.


Не надо ничего типизировать.

Зоворачиваешь TExpr.Goto и TExpr.Label в PExpr.Typed и вперед. Можно даже через квази-цитату <[ $(texpr : typed) ]>.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:25
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Это сильно сложнее, так как нужно разбираться с лапшой, в которую превращается match после работы DecisionTreeCompiler-а.


В принципе это опять же можно сделать до типизации. Просто влепить в начало вхождений по лэйблу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:27
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А зачем разбираться с лапшой? Ты же транслируешь C# AST в AST Немерле, т.е. можно просто тупо считать, что каждый case в шарповом свитче — это создание метки. Именем метки может быть индекс кейса, т.е. номер, под которым он идет в теле switch-а.


Да, так можно. Но есть одна проблема. Дело в том, что при преобразовании match-а иногда выражения дублируются (копируются). Это может привести к непредсказуемым последствиям.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:28
Оценка:
Здравствуйте, catbert, Вы писали:

C>If тоже подвид goto, и match в какой-то степени тоже. Но if, match, return и корутины код разъясняют, а чистый goto запутывает.


Можно еще проще сказать if, match, return и т.п. — это конструкции структурного программирования, а goto средство обфускации кода.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:29
Оценка:
Здравствуйте, IT, Вы писали:

IT>А если case в который делается goto завернуть в локальную функцию?


То:
1. Будет оверхэд.
2. Будет возврат управления в точку вызова.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 16:30
Оценка:
Здравствуйте, VladD2, Вы писали:

C>>If тоже подвид goto, и match в какой-то степени тоже. Но if, match, return и корутины код разъясняют, а чистый goto запутывает.

VD>Можно еще проще сказать if, match, return и т.п. — это конструкции структурного программирования, а goto средство обфускации кода.

Выход из цикла? — break, "структурное программирование".

Выход из двух циклов сразу?
Re[17]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:54
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Выход из цикла? — break, "структурное программирование".


Ага — структурное, так как ясно откуда и куда осуществляется выход.

ВВ>Выход из двух циклов сразу?


Да хоть из трех — блок немерла:
[img]
exitAllLoops :
{
foreach (...)
foreach (...)
foreach (...)
when (cond)
exitAllLoops(returnValue); // может ничего не возвращать, если тип блока — void

value
}
[/img]
break реализован на его базе.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Компиляция C# 4.0 в рамках проекта Nemerle
От: catbert  
Дата: 19.10.10 17:11
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Выход из двух циклов сразу?


Ну, в холопских языках вроде C# ничего лучше и не придумаеш :-D
Re[18]: Компиляция C# 4.0 в рамках проекта Nemerle
От: Воронков Василий Россия  
Дата: 19.10.10 17:45
Оценка:
Здравствуйте, catbert, Вы писали:

ВВ>>Выход из двух циклов сразу?

C>Ну, в холопских языках вроде C# ничего лучше и не придумаеш :-D

SelectMany?
Re[12]: Компиляция C# 4.0 в рамках проекта Nemerle
От: hardcase Пират http://nemerle.org
Дата: 19.10.10 18:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Зоворачиваешь TExpr.Goto и TExpr.Label в PExpr.Typed и вперед. Можно даже через квази-цитату <[ $(texpr : typed) ]>.


Я правильно понял, что TExpr.Label должен быть с пустым блоком?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[13]: Компиляция C# 4.0 в рамках проекта Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 19:46
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Я правильно понял, что TExpr.Label должен быть с пустым блоком?


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