EDSL, Deep Embedding¹ и решил попробовать как оно в Скале работает.
Оказалось что работает. По крайней мере в 3ей.
https://scastie.scala-lang.org/9Z2JbpmSSvCYFnb0zw7M6g
Теперь интересно, пытался ли кто-нть делать/использовать что-нть подобное на практике?
Кажется, что прикольно будет тестировать такое.
Например чтобы убедиться, что у нас дёргаются методы можно "просто" проверить что они вставлены в результирующий Expr. И ни какие моки со стабами не нужны. Взял дерево, оббежал и проверил что нужные узлы есть.
¹) Deep embedding: operations only build an interim data structure that reflects the expression tree. E.g. the expression a+b is translated to the data structure Add (Var "a") (Var "b").
Весь современный фп-подход про это. Фри монады более явно, таглесс файнал - менее. Попоболь с тестированием снимает не сильно, интерпетаторы всё равно нужно тестить.
Фри-монады не позволяют представить результат полностью как структуру. Там появляются кейсы с функциями. Как в котячей версии тут final private[free] case class FlatMapped[S[_], B, C](c: Free[S, C], f: C => Free[S, B]) extends Free[S, B]
В таком случае, самый близкий реальный аналог описаной вами техники - edsl библиотеки quill. Только он построен на макросах, там в качестве части данных ast обычного scala кода.
Обсуждают сегодня