[Nemerle] Ковариантнось массивов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.01.07 13:17
Оценка:
А где ковариантность массивов?

module A {
    public Foo(x : array[object]) : void { }
}

def x = array["a", "b", "c"];
A.Foo(x); // не катит
A.Foo(x :> array[object]); // тоже не катит


30.01.07 17:51: Перенесено модератором из 'Декларативное программирование' — IT
Re: [Nemerle] Ковариантнось массивов
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 13:47
Оценка: 1 (1)
Здравствуйте, nikov, Вы писали:

N>А где ковариантность массивов?


Нету. Насколько я помню у компиляторщиков были большие пробемы с ним и они отказались от поддержки неявного приведения типов для массивов.

N>
N>A.Foo(x :> array[object]); // тоже не катит
N>


Так работает. Явное приведение допустимо.
Видимо ты опять старым компилятором воспользовался.
Плюс еще если нужно просто создать массив object-ов, то можно сделать так:
def x = array["a" : object, "b", "c"];
A.Foo(x);
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nemerle] Ковариантнось массивов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.01.07 14:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Так работает. Явное приведение допустимо.

VD>Видимо ты опять старым компилятором воспользовался.

Попробовал взять свежие исходники из SVN. Потом запустил Build.cmd и Reg.cmd
Теперь при попытке запуска компилятор всегда выдает следующее:
------ Build started: Project: NemerleProject, Configuration: Debug Any CPU ------
C:\Program Files\Nemerle\ncc.exe /no-color /no-stdlib /define:DEBUG;TRACE /debug+ /out:obj\Debug\NemerleProject.exe /target:exe Properties\AssemblyInfo.n Main.n /ref:"C:\Program Files\Nemerle\\Nemerle.dll" /ref:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /ref:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /ref:"C:\Program Files\LINQ Preview\Bin\System.Query.dll" /ref:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembly 'Nemerle, Version=0.9.3.7342, Culture=neutral, PublicKeyToken=e080a9c724e2bfcd' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Nemerle, Version=0.9.3.7342, Culture=neutral, PublicKeyToken=e080a9c724e2bfcd'
   at Nemerle.Compiler.CompilationOptions..ctor()
   at Nemerle.CommandlineCompiler.MainClass.Main() in C:\Nemerle\ncc\main.n:line 60

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========


В чем может быть причина?
Re[3]: [Nemerle] Ковариантнось массивов
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 14:41
Оценка:
Здравствуйте, nikov, Вы писали:

VD>>Так работает. Явное приведение допустимо.

VD>>Видимо ты опять старым компилятором воспользовался.

N>Попробовал взять свежие исходники из SVN. Потом запустил Build.cmd и Reg.cmd

N>Теперь при попытке запуска компилятор всегда выдает следующее:...

1. Удали переменную стреды окуржения Nemerle. Или хотя бы исправь в ней путь. Старый инсталлятор засовывал туда путь в кавычках.
2. Открой в Windows Explorer путь %WinDir%\assembly и удали из GAC-а все вхождения немерловских сборок.
3. На всякий пожарный, сделай поиск старых версий сборок немерла и грохни их.

N>В чем может быть причина?


Скорее всего в:

/target:exe Properties\AssemblyInfo.n Main.n /ref:"C:\Program Files\Nemerle\\Nemerle.dll"

что скорее всего вызвано тем, что старый инсталлятор засовывал в переменную среды окружения Nemerle путь в кавычках.
Но лучше сделать все что я описал.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nemerle] Ковариантнось массивов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.01.07 16:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>1. Удали переменную стреды окуржения Nemerle. Или хотя бы исправь в ней путь. Старый инсталлятор засовывал туда путь в кавычках.


Заработало!
Кавычки-то я сразу после установки удалил. Оказалось, проблема была в завершающем бэк-слэше. Его удалил, перекомпилировал компилятор, и все заработало.

Вообще, это очень здорово, что компилятор написан на том же языке, который он компилирует. Это помогает исправлять многие ошибки еще на этапе разработки языка, и исключает досадные недоразумения которые есть в C# (например, когда числовые литералы по-разному разбираются на этапе компиляции и в рантайме).

В общем, си-шарп идет фтопку.
Re[5]: [Nemerle] Ковариантнось массивов
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 16:43
Оценка:
Здравствуйте, nikov, Вы писали:

N>Вообще, это очень здорово, что компилятор написан на том же языке, который он компилирует.


Ага.

N>Это помогает исправлять многие ошибки еще на этапе разработки языка, и исключает досадные недоразумения которые есть в C# (например, когда числовые литералы по-разному разбираются на этапе компиляции и в рантайме).


Это дает гораздо большее:
1. Компилятор может использовать все возможности языка. Это значит, что компилятор становится проще разрабатывать и сопровождать.
2. Это дополнительный стимул для улучшения языка. Вот недавно Камил Скальски добавил реализацию Абстрактной фабрики и Агрегации так как решал задачи требующие реализации этих паттернов.

N>В общем, си-шарп идет фтопку.


Думаю он еще помучается.
Ведь очень многие дизайнеры рассчитаны именно на него.
К тому же в 3.0 будет LINQ который стоило бы повторить.

Но в общем, согласен. При прочих равных смысла использовать C# нет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nemerle] Ковариантнось массивов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 28.01.07 09:06
Оценка: 31 (1)
Здравствуйте, VladD2, Вы писали:

VD>Так работает. Явное приведение допустимо.


Оказалось, что оно допустимо слишком часто.
Вот, например, два интересных бага:

http://nemerle.org/bugs/view.php?id=845
http://nemerle.org/bugs/view.php?id=846

Интересно, что в свое время точно такая же проблема была у РеШарпера.
Re[3]: [Nemerle] Ковариантнось массивов
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.01.07 10:30
Оценка:
Здравствуйте, nikov, Вы писали:

N>Оказалось, что оно допустимо слишком часто.

N>Интересно, что в свое время точно такая же проблема была у РеШарпера.

Дык, логично. Ведь пляски с вэлью-типами и ссылочными типами — это оптимизация дотнета которая совершенно не естественна. Подобные оптимизации зачастую являются причинами огромного количества "но". И все эти "но" нужно учесть. А это море проверок в совершенно разных местах.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.