Здравствуйте, dsorokin, Вы писали:
D>Зато можно построить монаду Cont. Этого достаточно для многих практических задач. Тогда с помощью вычислительных выражений становится очень легко и просто создавать эти самые продолжения. Async из F# в своей основе есть продолжение, но которое еще умеет распространять исключения между потоками исполнения.
Как я понимаю, монады по своей сути — это CPS-продолжения. В бинд ведь как раз и передается функция которую нужно вызвать вслед за вычислением. Вот только это никак не способствует серилизации состояния вычисления.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, dsorokin, Вы писали:
D>Здравствуйте, VladD2, Вы писали:
VD>>Я говорю о том как будет сериализоваться информация о глубине рекурсии и значених параметров?
D>Наверное как граф объектов. Но для этого надо уметь сериализовывать функции и замыкания.
А как это вообще можно сделать? Да и вообще, что под этим понимаетя?
D>Меньше Но время от времени еще увлекаюсь Common Lisp. Так что, к макросам привыкший.
А, да! Лисповская практика очень полезна. За исключением манипуляций с типами выражений идеология очень похожа.
В прочем она похоже полезна всегда .
D>Нет, здесь свое. На мой взгляд основная фишка в том, что код, написанный в вычислительных выражениях, почти ничем не отличается от обычного кода на F# или Немерле.
Мне кажется в хаскеле это не так потому, что его авторы были очень большими пуристами и "нормальное программирование" у них все ушло в монады.
D>Это просто гениальная вещь! В одном ряду с linq, где по забавному совпадению тоже монады
Я в linq монады ну ни как не могу узреть. С натяжкой SelectMeny, но ведь он а) редко используется, и б) имеет (по крайней мере для меня) не монадический смысл.
Я скорее рассматриваю linq как качественно портированый предюд из Хаскеля.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
D>>Наверное как граф объектов. Но для этого надо уметь сериализовывать функции и замыкания.
VD>А как это вообще можно сделать? Да и вообще, что под этим понимаетя?
Я понимаю так, что функции и замыкания представлены как ООП-объекты в IL. Вот их и надо бы сериализовать вместе со всеми связями и состояниями. Только реально ли? Думаю, тупиковая идея.
VD>Я в linq монады ну ни как не могу узреть. С натяжкой SelectMeny, но ведь он а) редко используется, и б) имеет (по крайней мере для меня) не монадический смысл.
VD>Я скорее рассматриваю linq как качественно портированый предюд из Хаскеля.
С linq не работал и почти ничего не знаю о нем, не читал. Но мне кажется, что под from может скрываться defcomp (bind), под select — return, а под selectMany — returncomp. Where — альтернатива if при условии существования zero (пустая коллекция). Если бы были if и zero, то тогда можно было where определить через все другое:
def where (coll, pred)
{
comp builder
{
defcomp x = coll;
if pred (x)
return x
else
returncomp zero
}
}
У меня есть вопрос ко всем. Правильно ли я понимаю следующую вещь? Есть тип TryCase, который задает один обработчик из блока try-catch. Вот его конструкторы:
Меня интересуют переменные handler. Действительно ли это та часть конструкций, которая следует после символа => в части catch? Особенно смущает filter. Что он значит?
Если я правильно понимаю, что за => отвечают только переменные handler, то могу сказать, что реализован try-catch для вычислительных выражений. Я там сделал немного не так как в F#. Пошел на хитрость. Исключение перевозбуждается. Так стало намного проще. В F# же заменяют блок catch на паттерн матчинг, что напряжно делать, да и смысла большого не вижу.
Итог такой. Уже есть try-finally и try-catch (если я прав на счет handler). Для полноценной поддержки осталось добавить using/usingcomp.
Здравствуйте, dsorokin, Вы писали:
D>У меня есть вопрос ко всем. Правильно ли я понимаю следующую вещь? Есть тип TryCase, который задает один обработчик из блока try-catch. Вот его конструкторы:
D>
D>Меня интересуют переменные handler. Действительно ли это та часть конструкций, которая следует после символа => в части catch? Особенно смущает filter. Что он значит?
Если не ошибаюсь то вот интерпретация:
Catch:
try {
} catch {
| e is ArgumentNullException =>
}
Filter:
try {
} catch {
| e is ArgumentNullException when e.Message.Contains("x") =>
}
Здравствуйте, dsorokin, Вы писали:
D>Интересная идея. Наверное, можно как-то связать с написанием своих собственных DSL. Следующий уровень после вычислительных выражений.
Упрощение создания собственных DSL это вообще отдельная история.
Причем для следующей версии языка.
Ибо для этого придется переделать все. От парсера до вывода типов.
D>Сейчас предлагаю завершить текущую схему. Я добавил более полную реализацию foreach (с матчингом и приведением :>) и блок try-finally. Из основных остались try-catch и using/usingcomp.
Делай как знаешь.
Я просто опытом делюсь.
Мне при работе над ПЕГом модель очень сильно помогла.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, dsorokin, Вы писали:
D>>Меня интересуют переменные handler. Действительно ли это та часть конструкций, которая следует после символа => в части catch? Особенно смущает filter. Что он значит?
Здравствуйте, dsorokin, Вы писали:
D>Я понимаю так, что функции и замыкания представлены как ООП-объекты в IL. Вот их и надо бы сериализовать вместе со всеми связями и состояниями. Только реально ли? Думаю, тупиковая идея.
Объекты-замыкания сериализовать по любому придется.
D>С linq не работал и почти ничего не знаю о нем, не читал. Но мне кажется, что под from может скрываться defcomp (bind), под select — return, а под selectMany — returncomp. Where — альтернатива if при условии существования zero (пустая коллекция).
Ага. Астрономы тоже в звездах видят тельцов и дев .
Реальности жизни несколько банальнее. select — это map, where — filter и т.д.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, dsorokin, Вы писали:
D>Меня интересуют переменные handler. Действительно ли это та часть конструкций, которая следует после символа => в части catch?
Да.
В немерле обработчики искючений аналогичны вхождениям оператора match (описывающиеся конструкцией MatchCase).
D>Особенно смущает filter. Что он значит?
Скажем если мы имеем следующий код:
try
{
...
}
catch
{
| e is SomeException when e.SomeProperty == 123
}
то такое вхождение catch-а записывается как TryCase.Filter.
Собственно это легко понять если сделать поиск по TryCase.Filter в файле ncc\parsing\MainParser.n.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, VladD2, Вы писали:
VD>>Ага. Астрономы тоже в звездах видят тельцов и дев .
А>Астрономы или астрологи?
Астрономы. Астрологи идут дальше и видят связь между тем чего нет и тем чего не может быть.
А>IEnumerable + Linq, в особенности с методом SelectMany являются реализацией монады списка.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, hardcase, Вы писали:
H>>Ellipsis:
H>>
H>>try {
H>>} catch {
H>> | _ =>
H>>}
H>>
VD>Здесь ошибаешься. Ellipsis — это $-выражение в квази-цитате.
А можно подробнее? Ellipsis имеет один параметр body. Сейчас этот body у меня преобразовывается в поисках монады. Мне интересно знать, насколько это корректно. Можно этот Ellipsis создать в коде?
Тут ко мне пришла гениальная идея! (как-то запоздало...) Можно не изобретать свой аналог async аля F#. Можно его просто использовать в Немерле, но со своим синтаксисом вычислительных выражений! Со своими foreach, паттерн-матчингом, repeat и do-while. Для этого нужны две вещи:
1) либо написать прослойку, которая давала бы немерлевский билдер (методы практически также называются), либо генерировать нужный код напрямую через ComputationBuilder (предпочтительнее);
2) установленный run-time для F# (идет вместе с .NET v4).
Здравствуйте, dsorokin, Вы писали:
D>А можно подробнее? Ellipsis имеет один параметр body. Сейчас этот body у меня преобразовывается в поисках монады. Мне интересно знать, насколько это корректно. Можно этот Ellipsis создать в коде?
Куда же подробнее? Это заглушка для квази-цитирования. Может появляться только внутри цитат. Нужно для генерации кода вхождения путем подстановки спласа.
Самому еще не разу не приходилось генерировать обработчики catch-ей, но это должно выгдядеть как-то так:
Здравствуйте, VladD2, Вы писали:
VD>Какие монды? Вот определение Select-а:
В основе лежит монада списка (сюрприз!). Но как я понял, можно определять в linq и свои монады. Только непонятно, насколько эквивалентно получается тем же вычислительным выражениям.
Здравствуйте, VladD2, Вы писали:
VD>Куда же подробнее? Это заглушка для квази-цитирования. Может появляться только внутри цитат. Нужно для генерации кода вхождения путем подстановки спласа.
VD>Самому еще не разу не приходилось генерировать обработчики catch-ей, но это должно выгдядеть как-то так: VD>
Я не понял, что с этим делать. Поэтому добавил вывод ошибки компиляции для этого TryCase.Ellipsis. Мне нужно больше информации, чтобы понять.
Сегодня добавил using. Он такой же. Только в нем нельзя использовать mutable. Зато можно использовать defcomp:
comp builder
{
using (defcomp x = resource_in_monad)
{
...
}
}
В общем, я сделал все, что хотел. Можно назвать готовой бетой. Теперь исправления ошибок, если таковые будут. Остается только неясность с FakeVoid (в F# для инстанцирования генериков по как бы void используется класс Unit, поддерживаемый на уровне компилятора). Плюс нужно написать документацию. Но теперь темп будет уже не таким.