Entity
из библиотеки символьной алгебры:Выглядит круче, чем в питоне. Делается просто, доставляет массу удовольствия. Приглашаю под кат!
О Jupyter
Это что-то вроде IDE для создания интерактивных блокнотиков. Вместо того, что бы в привычных средах запускать весь код сразу, здесь вы запускаете его по кускам, сохраняя состояния переменных. Очень удобно для исследований и простых скриптов чего-нибудь подсчитать.
О dotnet/interactive
Этот проект как раз позволяет встроить дотнет в юпитер. То есть вы буквально можете написать
И получать результаты работы кода прямо вот сразу.
Причем некоторые фишки работают из коробки
Об AngouriMath
Это относительно небольшая библиотека символьной алгебры для .NET для работы с математическими выражениями. Разумеется, с математическими выражениями можно работать в одну строку, но это не всегда удобно/красиво.
Все математические выражения так или иначе наследуются от класса
Entity
, который имеет метод Latexise
,
возвращающий строку. Поэтому остается всего лишь его
отрендерить.Встраиваем латех
У нас есть возможность зарегистрировать собственный вывод для наших типов, что я и делаю:
let magic() = let register (value : ILatexiseable) = $@" <script src='https://polyfill.io/v3/polyfill.min.js?features=es6'></script> <script id='MathJax-script' async src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'></script> \[{value.Latexise()}\] " Formatter.Register<ILatexiseable>(register, "text/html")
(хабр почему-то не поддерживает F#)
То есть мы просто регистрируем, что тип
ILatexiseable
должен выводиться в html-формате, а сам код будет генерироваться
нашей функцией. Для рендеринга я взял MathJax, хотя наверное имеет
смысл кешировать js-скрипт, но это для будущих обновлений.Ну и собственно все, теперь все выражения, унаследованные от этого интерфейса, будут красиво рендериться. Вот как это выглядит в C#:
Что именно тут происходит?
1. В первом блоке мы вызываем
extension-метод
2. Во втором блоке мы создаем систему уравнений и сразу ее выводим
3. В третьем создается матрица и сразу выводится
ToEntity()
, который парсит
выражение2. Во втором блоке мы создаем систему уравнений и сразу ее выводим
3. В третьем создается матрица и сразу выводится
Так как юпитер предзназначен для небольших участков кода, которые не обязаны следовать каким-то проектным требованиям, F# подходит лучше для этого. Поэтому, как это понятно из скриншота в начале статьи, он тоже поддерживается. Для примера, так выглядит решение школьного уравнения:
Дальнейшие планы
Я очень большой любитель .NET-а, но я также очень люблю Jupyter. Поэтому Interactive меня очень порадовал, и я поспешил сделать поддержку Interactive для AngouriMath для вывода выражений в LaTeX. Но дальше интереснее. Я думаю сделать что-то типа
Entity.Plot()
, который выводил бы сразу график
функции. Для простых use-кейсов очень нужна штука, мне кажется.Если хочется попробовать не устанавливая ничего из необходимого, вы можете потыкаться тут: (аларм: почему-то долго грузится, придется подождать)
Спасибо за внимание! Такая вот короткая заметка.
Ссылки
1. Jupyter удобная браузерная среда для интерактивного программирования
2. .NET Interactive та самая гениальная вещь, благодаря которой можно использовать дотнет в юпитере
3. AngouriMath математическая библиотека, для которой я написал оболочку для латеха
4. MyBinder демка для ленивых