Здравствуйте, 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).
Угу, работает, сенкс. Правда студия ошибки показывает, но компилит..
Здравствуйте, Jack128, Вы писали:
J>Угу, работает, сенкс. Правда студия ошибки показывает, но компилит..
Это интеллисенс от MS. Он ни о C# 4.0, ни о Nemerle ничего не знает. Так что комплитить он будет только то, что есть в этом файле и некотором наборе (который известен только кому-то из MS) стандартных сборок.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
J>>Угу, работает, сенкс. Правда студия ошибки показывает, но компилит..
VD>Это интеллисенс от MS. Он ни о C# 4.0, ни о Nemerle ничего не знает. Так что комплитить он будет только то, что есть в этом файле и некотором наборе (который известен только кому-то из MS) стандартных сборок.
Извиняюсь... прочел "комплитит" вместо "компилит".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
при подключении такого файлика 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);
}
}
}
Здравствуйте, Jack128, Вы писали:
J>Здравствуйте, hardcase, Вы писали:
J>при подключении такого файлика cs файлика к nemerle проэкту при компиляции вылазит ошибка:
Попытался воспроизвести этот баг на самом 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. Я пофиксил данную проблему в последнем комите.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>3. Я пофиксил данную проблему в последнем комите.
Мало-вероятно. Я поставил точку останова в то место обнаруживается зацикливание кортежа, но управление туда не пришло. Так что надо искать ошибку в другом месте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Jack128, Вы писали: J>>а как на практике эту фичу заюзать??? Простого добавления файла *.cs в проэкт недостаточно. VD>Достаточно. Просто для этого нужно использовать последнюю версию компилятора которая еще не доступна в виде инсталлятора.
А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, VladD2, Вы писали:
VD>>Здравствуйте, Jack128, Вы писали: J>>>а как на практике эту фичу заюзать??? Простого добавления файла *.cs в проэкт недостаточно. VD>>Достаточно. Просто для этого нужно использовать последнюю версию компилятора которая еще не доступна в виде инсталлятора.
ВВ>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то.
было. H>Как появится свободное время, соберу все в одном месте.
Да, это было бы полезно.
H>Ко всему прочему еще не в полной мере работают операторы присваивания и инкремента/декремента (сейчас они имею семантику Nemerle и возвращают void).
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Я так понимаю и присваивание возвращает void?
Имеенно.
К сожалению (или счастью?), являясь крайне ленивым человеком, я никак не соберусь отрехакторить конвертер (вернее я уже пытался, но звезды не сошлись на небе) и наконец добавить пару воркэраундов для инкрементов и присваиваний.
Я так понимаю, этот список не совсем точен. ref/out прикрутили (?). Но при этом операции типа инкремента и присваивания работают не так, как в Шарпе. Может, еще какие вещи.
Здравствуйте, VladD2, Вы писали:
ВВ>>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то. VD>Как раз goto можно и реализовать. Сложнее буде реализовать goto case.
Почему? По идее особой разницы тут быть не должно.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, VladD2, Вы писали:
ВВ>>>А есть где список неподдерживаемых фич? Я так понимаю нет goto, наверное, еще что-то. VD>>http://rsdn.ru/forum/nemerle/3945731.1.aspx
Здравствуйте, VladD2, Вы писали:
ВВ>>Но при этом операции типа инкремента и присваивания работают не так, как в Шарпе. VD>Не уверен. Они в приципе могут быть реализованы не через немерловые макры ++ и --, а через: VD>
VD><[ { $x++; $x } ]>
VD>
VD>или что-то вроде того. ВВ>>Может, еще какие вещи.
Хардкейс говорит, что такого нет. Понятно в принципе, что это не должно быть большой проблемой в реализации. Не уверен, впрочем, что и отсутствие этого является большой проблемой.
Хотелось бы просто увидеть полный актуальный список, так сказать.