состояние типа, нитра
От: s22  
Дата: 22.01.16 16:46
Оценка:
type variant 
{
 | int
   {
     func asInt()
   }
  | string
    {
      func asString()
    }
  | time
    {
      func asTime()
    }
}

mut a:Variant;

if()
{
  a = 1;
}
else
{
  a = "eddd";
}

a.asInt()    // Корректно
a.asString() // Корректно
a.asTime()   // Ошибка состояния типа asTime не доступен


возможно такое?
Отредактировано 22.01.2016 17:13 VladD2 . Предыдущая версия .
Re: состояние типа, нитра
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.01.16 22:54
Оценка:
Здравствуйте, s22, Вы писали:

s22>возможно такое?


Можно все что не противоречит законам природы.

А вот чтобы понять не противоречат ли твои желания оным нужно понять, что ты тут понаписал и что ты под этим имел.

Опиши семантику твоего примера. Когда ошибка в рантайме или во время компиляции? Т.е. динамическая типизация или статическая?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: состояние типа, нитра
От: s22  
Дата: 23.01.16 08:44
Оценка:
Здравствуйте, VladD2, Вы писали:

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


s22>>возможно такое?


VD>Можно все что не противоречит законам природы.


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


VD>Опиши семантику твоего примера. Когда ошибка в рантайме или во время компиляции? Т.е. динамическая типизация или статическая?


во время вывода типов (компиляции)
Re[2]: состояние типа, нитра
От: s22  
Дата: 23.01.16 17:10
Оценка:
Здравствуйте, VladD2, Вы писали:


примерное описание

переменная имеет поля времени компиляции

class A
{
 a:int;
 comp a:int; // данное поле существует только при компиляции
}


mut a:A;
 
func f(a:A) where a.b=1 or a.b=3
{
}

{
    mut a:A;
    a.b=2;
    f(a) // ошибка
}

{
    mut a:A;
    f(a) // ошибка
}

{
    mut a:A;
        a.b=1;
    f(a) // успешно
}

{
    mut a:A;
    a.b=1
    f(a) // успешно
    a.b=3
    f(a) // успешно
    a.b=2
    f(a) // ошибка компиляции

}
Отредактировано 23.01.2016 18:06 VladD2 . Предыдущая версия .
Re[3]: состояние типа, нитра
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.01.16 20:49
Оценка:
Здравствуйте, s22, Вы писали:

s22>class A
s22>{
s22> a:int;
s22> comp a:int; // данное поле существует только при компиляции
s22>}
s22>    mut a:A;
s22>    a.b=2;
s22>    f(a) // ошибка
s22>}
s22>


Сделать то подобное можно. Но только какой в этом смысл? Ты сможешь пользоваться только константами. Если данные придут извне, то проверки времени компиляции будут невозможны.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: состояние типа, нитра
От: s22  
Дата: 24.01.16 10:05
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>Сделать то подобное можно. Но только какой в этом смысл? Ты сможешь пользоваться только константами. Если данные придут извне, то проверки времени компиляции будут невозможн

Если не возможно определить значение, то выдавать ошибку компиляции...
И не только константы, но и выражения....
Re[5]: состояние типа, нитра
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.16 06:49
Оценка:
Здравствуйте, s22, Вы писали:

s22>Если не возможно определить значение, то выдавать ошибку компиляции...

s22>И не только константы, но и выражения....

Пойми, такой язык будет чем-то вроде калькулятора. Он сможет вычислять (сворачивать) только выражения данные в которых доступны во время компиляции. С файлами, клавиатурой, сетью твой язык работать не сможет.

Какой в нем смысл?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: состояние типа, нитра
От: s22  
Дата: 30.01.16 11:31
Оценка:
Здравствуйте, VladD2, Вы писали:

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


s22>>Если не возможно определить значение, то выдавать ошибку компиляции...

s22>>И не только константы, но и выражения....

VD>Пойми, такой язык будет чем-то вроде калькулятора. Он сможет вычислять (сворачивать) только выражения данные в которых доступны во время компиляции. С файлами, клавиатурой, сетью твой язык работать не сможет.


VD>Какой в нем смысл?



type into=
{
 vl:int?;
 comp isint:bool;
 comp isnil:bool;
 assign (v:int)
{
 vl=v;
 isint=true;
 isnil=false;
}
 assign (nil)
{
 vl=v;
 isint=false;
 isnil=true;
}

use :int
{
if(isnul) 
Error("ошибка, может быть nil")
if(!isint) 
Error("ошибка, не число")
}

use :nil
{
if(isint)
Error("ошибка, может быть число")
if(!isnil) 
Error("ошибка, не nil")
}

 assign (nil)
{
 vl=v;
 isint=false;
 isnil=true;
}

unionbranch(v:[into])
{
(isint, isnil)=fold([false,false],((initisint, initisnul),(v.isint, v.isnil)) => (initisint||v.isint, initisnul||v.isnil))
}

}

func f(a:int)
{
}
func f1(a:into)
{
}
func f2(a:int?)
{
}
func f3(nil)
{
}


mut a:into;

a=1;

f(a) // норма
f1(a) // норма
f2(a) // норма
f3(a) // ошибка 
if (.....)
a=1 else a=nil;

f(a) // ошибка 
f1(a) // норма
f2(a) // норма
f3(a) // ошибка
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.