Как на немерли будет конструктор присвоения?
От: Аноним  
Дата: 29.11.13 18:32
Оценка:
mutable x:aaa = 5;


как для типа aaa сделать конструктор присвоения.
Re: Как на немерли будет конструктор присвоения?
От: hardcase Пират http://nemerle.org
Дата: 29.11.13 19:13
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>mutable x:aaa = 5;
А>


А>как для типа aaa сделать конструктор присвоения.


Определить оператор неявного приведения типа.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Как на немерли будет конструктор присвоения?
От: Аноним  
Дата: 29.11.13 19:47
Оценка:
Здравствуйте, hardcase, Вы писали:

  public  static @: [T](first : T):rrr[T]   {
      rrr.[T]  (first)
  };

не помогает.
Re[3]: Как на немерли будет конструктор присвоения?
От: hardcase Пират http://nemerle.org
Дата: 30.11.13 19:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>не помогает.


К сожалению, у телепатов бессрочный отпуск.


Код ниже претендует на работоспособность на моей машине.
using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;

using System;
using System.Console;

[Record]
class X[T]
{
  public Value : T;
  public static @: (value : T) : X[T] { X(value) }
  public override ToString() : string { Convert.ToString(Value) }
}

[Record]
class Y
{
  public Value : object;
  public static @: [T](value : T) : Y { Y(value) }
  public override ToString() : string { Convert.ToString(Value) }
}

module Program
{
    
  Main() : void
  {
    mutable a : X[_] = 1;
    WriteLine(a);
    
    mutable b : Y = 1;
    WriteLine(b);
    _ = ReadLine();
  }
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Как на немерли будет конструктор присвоения?
От: Аноним  
Дата: 01.12.13 07:34
Оценка:
Здравствуйте, hardcase, Вы писали:
    mutable x=0;

    WriteLine(x);
    
    x = x:X[int];




expected int, got Program.X[int] in assigned value: Program.X.[T] is not a subtype of System.Int32 [simple require] c:\users\сергей\documents\visual studio 2012\Projects\MacroLibrary2\ConsoleApplication1\Main.n 32 9 ConsoleApplication1

не работает, в то время как
    mutable x:X[_]=0;

    WriteLine(x);
    
    x = x:X[int];


Вполне работоспособен

Ошибка вывода типов?
Re[5]: Как на немерли будет конструктор присвоения?
От: catbert  
Дата: 01.12.13 09:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ошибка вывода типов?


Не ошибка, а принцип. Принцип такой что как только компилятор типизирует сверху вниз слева на право. И как только есть достаточно информации чтобы вывести тип, он выводит самый конкретный из возможных.

В первой строке x получает тип int.
Re[5]: Как на немерли будет конструктор присвоения?
От: _NN_ www.nemerleweb.com
Дата: 01.12.13 09:49
Оценка:
Здравствуйте, Аноним, Вы писали:

Советую почитать статьи http://rsdn.ru/summary/3766.xml
В частности Как работает система вывода типов?
Автор(ы): Владислав Юрьевич Чистяков
Дата: 03.09.2009
В данной части статьи рассказывается о том, как работает система вывода типов Nemerle, о том, как с ней могут взаимодействовать макросы Nemerle, и что это дает


Т.е как получается:
А>
А>    mutable x=0; // Тут компилятор предполагает что x может быть int

А>    WriteLine(x); // Здесь пока откладываем типизацию
    
А>    x = x:X[int]; // Здесь говорим что x это X[int]
А>


Далее компилятор пытается совместить int и X[int].
Это у него конечно не выходит , типы не совместимые.

А>не работает, в то время как

А>
А>    mutable x:X[_]=0; // Возможно X[что-то]

А>    WriteLine(x);
    
А>    x = x:X[int]; // X[int]
А>


X[что-то] и X[int] совместимы и получаем X[int].

Для новой переменной тип выведется без проблем:
mutable x=0;

WriteLine(x);

def y = x : X[_]; // y : X[int]


P.S.
Код вида "x = x : SomeType;" скорее всего не будет у вас встречаться.
В 99% случаев используется 'def', а если mutable то обычно без приведения типа на самого себя.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Как на немерли будет конструктор присвоения?
От: Аноним  
Дата: 01.12.13 13:56
Оценка:
Здравствуйте, _NN_, Вы писали:

Это номально, что механизм вывода типов зависит от порядка инициализации?
зачем так сделано?
Re[7]: Как на немерли будет конструктор присвоения?
От: hardcase Пират http://nemerle.org
Дата: 01.12.13 14:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это номально, что механизм вывода типов зависит от порядка инициализации?


От порядка инициализации чего?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: Как на немерли будет конструктор присвоения?
От: Аноним  
Дата: 02.12.13 09:39
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Аноним, Вы писали:


А>>Это номально, что механизм вывода типов зависит от порядка инициализации?


H>От порядка инициализации чего?



mutable x;
x = x:X[_];
x=1;

Компилируется нормально

mutable x;
x=1;
x = x:X[_];

Выдает ошибку.

Ошибка1 expected int-, got Program.X[int-] in assigned value: common super type of types [int, Program.X[int-]] is just `object', please upcast one of the types to `object'
т.е. вывод типов работает по разному.
Это нормально? Так задумано?
Re[9]: Как на немерли будет конструктор присвоения?
От: _NN_ www.nemerleweb.com
Дата: 02.12.13 12:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>mutable x;
А>x = x:X[_];
А>x=1;

А>

А>Компилируется нормально

А>
А>mutable x;
А>x=1;
А>x = x:X[_];

А>

А>Выдает ошибку.

1 приводится к X[_], а наоборот нет.
Вот и не компилируется.

Если добавить в X преобразование из X[T] в int, то нет проблем.

// X[T] -> T
public static @: (value : X[T]) : T { default(T) }


Это аналогично инициализации массива:
Так не будет компилироваться, т.к. Nemerle не делает неявных преобразований в object без необходимости.
def a = [1, "a"];

И нужно писать так:
def a = [1 : object, "a"];
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[9]: Как на немерли будет конструктор присвоения?
От: hardcase Пират http://nemerle.org
Дата: 02.12.13 12:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это нормально? Так задумано?


Да это нормально и это ожидаемое поведение.
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.