Здравствуйте, FDSC, Вы писали:
FDS>По C# есть? Можно ссылку? Интересно посмотреть... (если не трудно, конечно)
FDS>Да, я не часто туда захожу.
Ссылки не храню. А так искать в лом.
FDS>По поводу ответов и вопросов — они действительно интересные, не спорю, но, скажем, конкретно по C# у меня ещё не возникало ни одного вопроса, на который бы мне нужно было обращаться в форум: это огромный плюс для этого языка в моих глазах (и в форуме не видел такого, что бы вообще нельзя было понять самостоятельно).
Все можно понять самостоятельно. То что ты в большинстве случае можешь решить проблемы сам, то скорее твое достоинство нежели Шарпа.
Что касается вопросов, то там бывает что задают вопросы люди которые пишут парсеры того самого Шарпа (работники ДжетБрэйнс, те что РеШарпер пишут). И не думаю, что они задают вопросы только потому что сами тупы. Все же в огромном количестве мнений всегда найдется то что стоит узнать.
FDS> А по Nemerle у меня уже десяток вопросов (на которые я сам не знаю ответа), которые возникли просто после написания простейших функций.
Ну, вот у меня и с Немерле вопросов обычно не возникает. Я чаще удивляюсь тому, что я только подумал что было бы здорово сделать так-то, а оно уже сделано.
FDS> [я бы сказал, что на уровне простейших функций Scheme гораздо легче для изучения, чем Nemerle
]
Я бы не скалал бы. Для императивного программиста Немерле в сто раз ближе. Просто новое всегда кажется более сложным.
FDS>Хм, может я и не вчитывался (кое-где честно говоря действительно по диагонали), но этот раздел я раза три или четыре прочитал (включая файлы на самом сайте), и вот ну не вижу отличий: чем в Delphi функции — не замыкания! (см. пример ниже)
Вот это и есть момент ктода ты думаешь (иточнее видишь) императивно. Тут нужно изменить сознание. А это не просто.
Надо осознать что такое замыкание. (оно, кстати, есть и в анонимных методах C# с которым у тебя проблем нет). Так же нужно осознать что функция может быть значением (не тлько в события помещатсья, но и просто тупо в массив класться, передаваться и комбинироваться с другим функциями).
Как только ты это поймешь, ты поймешь и то что Дельфи это даже на породию не катит. Это просто прошлый век.
FDS>Но чем Delphi в данном случае уступает [кроме отсутствия type inference]?
В том что функции не могут быть замыканиями. В том что они не могут быть объявлены внутри выражений. В том что их нельзя возвратить куда угодно. В том что их нельзя комбинировать.
Еще нужно понимть что будет если эту функцию возврарить из метода или поместить в некое поле. У Делфьи это будет потенциальная ошибка. В Немерле — совершенно корректная операция. Если замыкание захватывает переменные, то создается невидмый класс, а переменные заменяются на его поля.
FDS>Выводит в консоль число "7", так же как и ваш пример.
Тут как минимум стоит сравнить объем и понятность кода. Если код меньше и проще, то это уже приемущество. Но это еще простой случай. В более сложном разница будет еще более очевидна.
В C# же где все просто вообще нет локальных фукнций.
VD>>VD>>def addX = add(x, _);
FDS>// Я думаю, надо def addX = add(_, x); ?
Без разницы. Сложение не позволят переставлять параметры.
FDS>Да, с этим согласен - это круто, не считая замечания, так как несвязанный параметр, как мне кажется, тут первый, а не второй, как вы написали. Но это, собственно, уже не к локальным функциям относится, а к созданию новых функций из старых.
Это не круто. Это то что должно быть. А теперь переходим к более интересным вещам.
Часто бывает нужно передать некой универсальной фукнции кусок кода который ее специализует.
Например, у нас есть списко и мы хотим найти в нем некое значение. Как ты это сделаешь на Дельфи? Цикл? Сколько строк это займет? А как будет читаться?
В Немерле можно просто создать лямбу (ананимную фукнцию).
Вот, например, как можно найти значение в списке:
[c#]
def result = users.Filter(user => user.Name ==
"Вася");
Вот рельный код написанный мной пару дней назад:
/// Remove extension methods defined in code (not external).
public RemoveInternalExtensionMethods() : void
{
foreach ((name, lst) when lst.Exists(_ is MethodBuilder) in _extension_methods.KeyValuePairs)
{
def newList = lst.RevFilter (x => !(x is MethodBuilder));
if (newList is [])
_ = _extension_methods.Remove (name);
else
_extension_methods[name] = newList;
}
}
Попробуй тди хохмы напасать его аналог на Дельфи.
И это еще я занимался оптимизациями по производительности.
FDS>Конечно, как мне вчитываться, когда я на первом же своём тесте получил ошибку, которую не могу исправить, потому что не понимаю.
FDS>(пожалуй первый раз в жизни у меня т а к и е проблемы с синктасисом
)
Это после Схемы то?
FDS>Некомпилируется:
FDS>FDS>...
FDS>class C
FDS>{
FDS> public static Method(i : ref int) : int
FDS> {
FDS> i = i + 1;
FDS> i
FDS> }
FDS>}
FDS>def MM(i : ref int) : int
FDS>{
FDS> i = i + 1;
FDS> i
FDS>}
FDS>mutable x = 5;
FDS>WriteLine(C.Method(ref x));
FDS>WriteLine(MM(ref x));
FDS>_ = ReadLine();
FDS>
FDS>Ошибки:...
Похоже баг.
FDS>Что я должен думать о вменяемости компилятора? Естественно у меня чисто познавательные вопросы: потому что язык мне всё-таки интересен для практических целей.
Откровенно говоря ref/out параметры в этом языке используются не часто и уж точно без таких наворотов. Видимо что-то не учли.
Зато ты моещь возвращать множественные значения из фукнции. Это намного добнее.
FDS>P.S. Можно самый важный вопрос: вы знаете о Nemerle довольно много: это вы исходники разбирали или всё из примеров вывели?
В основном я читал то что написно на сайте. Но конечно многое услышал от других. Vermicious Knid, например, очень многое подсказал.
Ну, и конечно читая исходники компилятора получаешь много реального опыта. Ведь одно дело прочесть про что-то, а другое видить применение этого на практике.
Код компилятора вообще уникален. Это супер хай-тэк заключенный в обалденно малый объем исходников. Исходники компилятора 1.5 метра. А сложность превышает все что я видел. Немерле очень выразителен. Особенно если нужно описывать иерархически и дургие констуркции.
FDS>Вообще, там есть в исходниках какой-нибудь отдельный файл описания синтаксиса (вкл. макросы)?
ЕБНФ есть на сайте. А код компилятора это куча сложного кода. Декларатвно там только АСТ описан.
... << RSDN@Home 1.2.0 alpha rev. 637>>