Да, такая система, как вы описали, теперь существует на Clojure!Это не что иное, как система компаньонов Джерри Суссмана в его книге SICM (Структура и интерпретация классической механики) Мудрости.Для Clojure он был назван sicmutils и портирован Колином Смитом.
Я кратко описал это в другом месте - https://stackoverflow.com/a/41646455/4070712 - но вкратце да, он определенно делает четыре вещи, о которых упоминает статья F #, а именно:
- Дифференциация:
- Упрощение алгебраических выражений
- Форматирование
- Синтаксический анализвыражения
и многое, многое другое ...
1) Дифференцирование (поддерживается полная частичная дифференциация)
> (defn ff [x y] (* (expt x 3)(expt y 5)))
> ((D ff) 'x 'y) ==> (down (* 3 (expt x 2) (expt y 5)) (* 5 (expt x 3) (expt y 4)))
> ;; i.e. vector of results wrt to both variables
Примечание.Поддерживаются два типа векторов: «вверх» и «вниз» для размещения ковариантных и контравариантных выражений
2) Упрощение выражений: О, да ...
> (def unity (+ (square sin) (square cos)))
> (unity 'x) ==> 1 ;; yes we can deal with symbols
3) Форматирование: Выражения могут быть отображены в TeX для красивого отображения.Я не могу показать это легко здесь, но в настоящее время блокнот / рабочий стол в стиле Maple находится в стадии разработки, используя Clojure "Gorilla"
4) Разбор: Очевидно.Преобразование между выражениями и функциями является основной частью системы.
Посмотрите на https://github.com/littleredcomputer/sicmutils.вам даже не нужен Clojure для его запуска, вы можете использовать прилагаемый файл jar Java.