Навороченная лямбда
От: Meldor  
Дата: 05.09.12 09:49
Оценка:
def a = _ => { | TSourceLexeme.WhiteSpace(spaceAmount) => spaceAmount};
def _ = a(TSourceLexeme.WhiteSpace(4));
def b = (a(_))+_;
def _ = b(TSourceLexeme.WhiteSpace(4),5);

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?
ошибка компиляции
Re: Навороченная лямбда
От: _NN_ www.nemerleweb.com
Дата: 05.09.12 09:56
Оценка:
Здравствуйте, 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);
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Навороченная лямбда
От: Meldor  
Дата: 05.09.12 10:10
Оценка:
_NN>Так не получится, водите имя и пишите явно.
_NN>
_NN>def b = (x, y) => a(x) + y;
_NN>

Хм. А в чем причина такого странного поведения? Почему PlaceHolderы перестают работать? _+_ вроде корректная лямбда в Nemerle?
Вот и на Хаскеле такая работает: http://ideone.com/26pbn
main = let a = (+) in print $ a 5 10
Re[3]: Навороченная лямбда
От: _NN_ www.nemerleweb.com
Дата: 05.09.12 10:13
Оценка:
Здравствуйте, 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 работает.

Можно улучшить эвристику , но тогда есть шанс что в лямбду войдет больше чем требуется.
Тут нужно с этим осторожно.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Навороченная лямбда
От: Meldor  
Дата: 05.09.12 10:33
Оценка:
На хаскеле такие сложные выражения конечно можно написать f(_)+_, но выглядит не лицеприятно в отличии от возможного синтаксиса на Nemerle. Я понял ситуацию, спасибо большое.
Re: Навороченная лямбда
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.09.12 08:42
Оценка:
Здравствуйте, Meldor, Вы писали:

M>
M>def a = _ => { | TSourceLexeme.WhiteSpace(spaceAmount) => spaceAmount};
M>def _ = a(TSourceLexeme.WhiteSpace(4));
M>def b = (a(_))+_;
M>def _ = b(TSourceLexeme.WhiteSpace(4),5);
M>


А что за задача решается?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Навороченная лямбда
От: Meldor  
Дата: 06.09.12 09:49
Оценка:
M>>
M>>def a = _ => { | TSourceLexeme.WhiteSpace(spaceAmount) => spaceAmount};
M>>def _ = a(TSourceLexeme.WhiteSpace(4));
M>>def b = (a(_))+_;
M>>def _ = b(TSourceLexeme.WhiteSpace(4),5);
M>>


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.
Re[2]: Навороченная лямбда
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.09.12 11:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Извиняюсь за оффтоп, но почему то моё сообщение не отображается в теме Навороченная лямбда в линейном режиме. Зато его можно увидеть в древовидном режиме с названием сообщения Ошибки из-за pragma indent.


Скорее всего броузер закешировал страницу. Нажмите Ctrl+F5.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.