TSourceLexeme : variant;
На строчке b выбивает: error : typing fails on finding the operator op_Addition(Translator.TSourceLexeme.WhiteSpace-- -> int-, (Translator.TSourceLexeme.WhiteSpace- * int-))
Я нечто подобное хотел записать в одну лямбду и передать в Fold без a или b, но пока даже так не компилируется.
Знаю, что не читаемо, но очень хочется побаловаться, чтобы скомпилировалось.
Есть ли более простой способ извлечения параметра WhiteSpace из таких алгебраических типах, чем a?
Здравствуйте, Meldor, Вы писали:
M>Я нечто подобное хотел записать в одну лямбду и передать в Fold без a или b, но пока даже так не компилируется. M>Знаю, что не читаемо, но очень хочется побаловаться, чтобы скомпилировалось.
Так не получится, водите имя и пишите явно.
def b = (x, y) => a(x) + y;
M>Есть ли более простой способ извлечения параметра WhiteSpace из таких алгебраических типах, чем a?
Как это еще проще ? Псевдо код покажите что ли.
Можно if-else или when задействовать:
using System.Console;
variant A { | X | Y { n : string } }
def a = A.Y("a");
if (a is A.Y(name)) { WriteLine(name); }
else WriteLine("nothing");
when (a is A.Y(name)) WriteLine(name);
_NN>Так не получится, водите имя и пишите явно. _NN>
_NN>def b = (x, y) => a(x) + y;
_NN>
Хм. А в чем причина такого странного поведения? Почему PlaceHolderы перестают работать? _+_ вроде корректная лямбда в Nemerle?
Вот и на Хаскеле такая работает: http://ideone.com/26pbn
Здравствуйте, Meldor, Вы писали:
_NN>>Так не получится, водите имя и пишите явно. _NN>>
_NN>>def b = (x, y) => a(x) + y;
_NN>>
M>Хм. А в чем причина такого странного поведения? Почему PlaceHolderы перестают работать? _+_ вроде корректная лямбда в Nemerle?
Потому что это простое выражение.
А вот скажем "!(_ is X)" сложное выражение и тут ничего не поделаешь.
M>Вот и на Хаскеле такая работает: http://ideone.com/26pbn M>
M>main = let a = (+) in print $ a 5 10
M>
Ну так простое выражение и в Nemerle работает.
Можно улучшить эвристику , но тогда есть шанс что в лямбду войдет больше чем требуется.
Тут нужно с этим осторожно.
На хаскеле такие сложные выражения конечно можно написать f(_)+_, но выглядит не лицеприятно в отличии от возможного синтаксиса на Nemerle. Я понял ситуацию, спасибо большое.
VD>А что за задача решается?
В целом или в этих строках?
В целом: Пишется лексер через парсер PegGrammar.
В этих строках: a — временно именованная лямбда, вытаскивающая из своего параметра varinat'а типа TSourceLexeme его параметр spaceAmount.
Следующей строкой проверили лямбду a на работоспособность. b — временно именованная лямбда, суммирующая spaceAmount из первого параметра и второй параметр.
Следующей строкой опять проверили лямбду b на работоспособность.
Ну и следующей строкой, хоть я этот код и не показывал:
lst.Fold(0, b);
А вообще хотел a и b сразу подставить в fold без каких-либо временных переменных a и b и посмотреть, как Nemerle это прожуёт. Недавно только начал Nemerle изучать. Он уже заслужил моё уважение. Особо по нему ничего не читал. Сразу начал писать. Все интуитивно понятное. Особенно PegGrammar по сравнению с каким-нибудь древним инструментом типа Яка или Бизона.
Места ошибок 2010 студия мне сразу ещё до компиляции все подсветила красным и я сразу исправил. Написал грамматику и все сразу скомпилировалось и заработало. Это нечто.
Re: Навороченная лямбда
От:
Аноним
Дата:
11.09.12 10:27
Оценка:
Извиняюсь за оффтоп, но почему то моё сообщение не отображается в теме Навороченная лямбда в линейном режиме. Зато его можно увидеть в древовидном режиме с названием сообщения Ошибки из-за pragma indent.
Здравствуйте, Аноним, Вы писали:
А>Извиняюсь за оффтоп, но почему то моё сообщение не отображается в теме Навороченная лямбда в линейном режиме. Зато его можно увидеть в древовидном режиме с названием сообщения Ошибки из-за pragma indent.
Скорее всего броузер закешировал страницу. Нажмите Ctrl+F5.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.