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#:
ToEntity()
, который парсит выражение2. Во втором блоке мы создаем систему уравнений и сразу ее выводим
3. В третьем создается матрица и сразу выводится
Так как юпитер предзназначен для небольших участков кода, которые не обязаны следовать каким-то проектным требованиям, F# подходит лучше для этого. Поэтому, как это понятно из скриншота в начале статьи, он тоже поддерживается. Для примера, так выглядит решение школьного уравнения:
Дальнейшие планы
Я — очень большой любитель .NET-а, но я также очень люблю Jupyter. Поэтому Interactive меня очень порадовал, и я поспешил сделать поддержку Interactive для AngouriMath для вывода выражений в LaTeX. Но дальше — интереснее. Я думаю сделать что-то типа
Entity.Plot()
, который выводил бы сразу график функции. Для простых use-кейсов очень нужна штука, мне кажется.Если хочется попробовать не устанавливая ничего из необходимого, вы можете потыкаться тут: (аларм: почему-то долго грузится, придется подождать)
Спасибо за внимание! Такая вот короткая заметка.
Ссылки
1. Jupyter — удобная браузерная среда для интерактивного программирования
2. .NET Interactive — та самая гениальная вещь, благодаря которой можно использовать дотнет в юпитере
3. AngouriMath — математическая библиотека, для которой я написал оболочку для латеха
4. MyBinder — демка для ленивых
questor
Пользуюсь для этих целей linqpad, весьма доволен, особенно его
.Dump()
. Посмотрите, было бы интересно послушать сравнение человека, который пользуется иными инструментами. Себе тоже положил в закладки, попробую при случае.kefirr
Только windows :(
navferty
В линкпаде не получится сохранять результаты, они выводятся в окно типа консоли. Здесь же в результате получится чередование кода и его результатов, которую также можно разбавить текстом с пояснениями — и вот уже готовая презентация, например.
zartarn
Это всё здоровому, но мне не хватает что сессия не сохраняется. В универе приходилось работать с GAP(и ныне неподдерживаемой для нее оболочкой GGAP), удобно было что всякие недельные расчеты сохранялись, просчитать на одном пк тяжелые данные, и потом уже быстро можно спокойно пользовать. Без прекручивания баз данных и прочего, здесь и сейчас сразу же из wysiwyg редактора. Или вернуться и поправить и пересчитатается весь набор данных который дальше потом используются.
Ну может когда нибудь и в Jupyter это завезут.