Здравствуйте, я столкнулся с такой ситуацией:
[Record]
class Foo[T,U]{public data : int;}
type IntFoo[U] = Foo[int, U];
type IntStrFoo = IntFoo[string];
static class Program
{
static Main() : void
{
_ = IntStrFoo(5);
_ = IntFoo.[string](5); //error
_ = Foo.[int, string](5);
def myFun = f : IntFoo.[string] => f.data;
_ = myFun(IntStrFoo(5));
_ = myFun(IntFoo.[string]()); //error
_ = myFun(Foo.[int, string](5));
}
}
В
статьеАвтор(ы): Сергей Туленцев, Владислав Чистяков
Дата: 23.05.2006
Производительность труда программиста в основном зависит от самого программиста. Однако даже самый опытный и знающий программист мало что может без подходящего инструмента. Эта статья открывает цикл статей об одном из таких инструментов, еще мало известном среди программистов, но очень многообещающем. Язык Nemerle, о котором пойдет речь в этих статьях, на первый взгляд очень похож на слегка улучшенный C#, но привносит многое из передовых исследовательских языков. Данная статья рассказывает об отличиях Nemerle от C# (как наиболее близкого языка)и является неформальным введением в язык.
достаточно расплывчато сказано, что
с помощью этой возможности можно объявлять даже открытые generic-типы. Собственно а subj вообще поддерживается? Вроде получается что частичная специализация есть, но не совсем
Здравствуйте, _ALeRT_, Вы писали:
_AL>В статьеАвтор(ы): Сергей Туленцев, Владислав Чистяков
Дата: 23.05.2006
Производительность труда программиста в основном зависит от самого программиста. Однако даже самый опытный и знающий программист мало что может без подходящего инструмента. Эта статья открывает цикл статей об одном из таких инструментов, еще мало известном среди программистов, но очень многообещающем. Язык Nemerle, о котором пойдет речь в этих статьях, на первый взгляд очень похож на слегка улучшенный C#, но привносит многое из передовых исследовательских языков. Данная статья рассказывает об отличиях Nemerle от C# (как наиболее близкого языка)и является неформальным введением в язык.
достаточно расплывчато сказано, что с помощью этой возможности можно объявлять даже открытые generic-типы. Собственно а subj вообще поддерживается? Вроде получается что частичная специализация есть, но не совсем
Там имелось в виду что как раз специализации нет, а есть только алиасы/синонимы. (специализация просто игнорируется насколько я помню)
В общем-то надо прикрыть это сообщением об ошибке, пока кто-нибудь не реализует этот функционал
P.S. подходящий баг в трекере:
http://nemerle.org/bugs/view.php?id=830
Здравствуйте, _ALeRT_, Вы писали:
_AL>В статьеАвтор(ы): Сергей Туленцев, Владислав Чистяков
Дата: 23.05.2006
Производительность труда программиста в основном зависит от самого программиста. Однако даже самый опытный и знающий программист мало что может без подходящего инструмента. Эта статья открывает цикл статей об одном из таких инструментов, еще мало известном среди программистов, но очень многообещающем. Язык Nemerle, о котором пойдет речь в этих статьях, на первый взгляд очень похож на слегка улучшенный C#, но привносит многое из передовых исследовательских языков. Данная статья рассказывает об отличиях Nemerle от C# (как наиболее близкого языка)и является неформальным введением в язык.
достаточно расплывчато сказано, что с помощью этой возможности можно объявлять даже открытые generic-типы. Собственно а subj вообще поддерживается? Вроде получается что частичная специализация есть, но не совсем
Если речь идет об налоге из С++, то нет, не поддерживается. В С++ шаблоны сродни макросам Немерле, а может и еще проще, сродни строковым макросам. В них специаилизация — это подстановка рукопашного кода для некоторого частного случая. Возможно это так как раскрытие шаблонов возможно только в рамках одного компилируемого модуля (их нельзя класть в бибилотеки).
Немерле же использует дотнетные дженерики которые являются фичей компонетной (их можно создавать динамически и совместно использовать несколькими модулями). Это приводит к тому, что текстуальные или компайл-тайм-возможнсоти для дженериков не применеимы. Описанная возможность Немрле не более чем синтаксический сахар позволяющий ввести для типа сокращенное имя — краткий синоним. Специализации он не поддерживает. Код дженерико истенно полиморфен и не поддерживает перегрузки (коей и является специализация в С++).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Здравствуйте, VladD2, Вы писали:
VD>Немерле же использует дотнетные дженерики которые являются фичей компонетной (их можно создавать динамически и совместно использовать несколькими модулями). Это приводит к тому, что текстуальные или компайл-тайм-возможнсоти для дженериков не применеимы. Описанная возможность Немрле не более чем синтаксический сахар позволяющий ввести для типа сокращенное имя — краткий синоним. Специализации он не поддерживает. Код дженерико истенно полиморфен и не поддерживает перегрузки (коей и является специализация в С++).
Похоже я не совсем точно выразился
Я имел ввиду не частичную специализацию в смысле переопределения поведения дженерик класса для какой-то более узкой группы типов, а просто введение сокращенного названия для типа (как template typedef). Например так:
type MySet[T] = Dictionary[T,DBNull];
Здравствуйте, _ALeRT_, Вы писали:
_AL>Похоже я не совсем точно выразился Я имел ввиду не частичную специализацию в смысле переопределения поведения дженерик класса для какой-то более узкой группы типов, а просто введение сокращенного названия для типа (как template typedef). Например так:
_AL>_AL>type MySet[T] = Dictionary[T,DBNull];
_AL>
Дык это и есть синонимы ака aliases.
... << RSDN@Home 1.2.0 alpha rev. 637>>
_AL>Похоже я не совсем точно выразился Я имел ввиду не частичную специализацию в смысле переопределения поведения дженерик класса для какой-то более узкой группы типов, а просто введение сокращенного названия для типа (как template typedef). Например так:
_AL>_AL>type MySet[T] = Dictionary[T,DBNull];
_AL>
А обычное наследование с частичной специализацией почему не подходит? Вроде обладает всеми теми-же свойствами...
public class MySet[T] : Dictionary[T, DBNull]
{
}
public static Main(params args : array[string]) : void
{
def mySet = MySet();
mySet["aa"] = DBNull.Value;
mySet["bb"] = DBNull.Value;
WriteLine($"count = $(mySet.Count)");
_ = ReadKey();
}