Шось про айтішку – Telegram
Шось про айтішку
1.47K subscribers
447 photos
163 videos
2 files
599 links
Фронтенд, ШІ, 3D друк, FPV, історії з життя та роботи
Download Telegram
Сделал компилятор из JS в ClojureScript. Должно быть полезно для новичков, чтобы посмотреть как разные конструкции в JS могут выглядеть в кложуре. Прям весь синтаксис может не скомпилит, но в целом достаточно хорошо получилось https://roman01la.github.io/javanoscript-to-clojurenoscript/
Транспайлить в Lisp на удивление несложно, синтаксиса в языке практически нету 🤷‍♀️ Базовые синтаксические конструкции и все остальное списки символов.
Если хочется узнать больше о структурах данных в функциональном программировании, но не хочется вникать в книгу Окасаки (книга стоящая кстати) https://cs.uwaterloo.ca/~plragde/flaneries/FDS/
Набираю группу на изучение кложескрипта с реактом. Бесплатно, коротко, в скайпе. Пишите в личку здесь @roman01la
Пока что набор приостанавливаем, уже много желающих 😛
React — это язык программирования. Как тебе такое, Илон Маск?

- В реакте программируют в DSL похожем на XML, который компилируется в JS
- В реакте есть свой try..catch через componentDidCatch
- В реакте есть глобальные переменные через Context API
- В реакте можно биндить глобальные переменные (Context) как в Clojure через binding
This media is not supported in your browser
VIEW IN TELEGRAM
Я не шутил по поводу языка :D
Под Rust сделали персистентные структуры из Clojure https://docs.rs/im/11.0.0/im/ 👏
Есть предположение, что полноценный AOT к JS можно применить используя более строгие суперсеты языка или даже языки компилирующиеся в JS. Например Elm, PureScript и т.д., где побочные эффекты вынесены за пределы программы. По крайней мере на небольших примерах с Elm Prepack выдает работающую программу, в отличии от того, что обычно получается на выходе после применения AOT к обычной приложеньке на чистом JS, где побочные эффекты никак не контролируються.

Если подумать то AOT как раз больше имеет смысла применять к таким языкам, чтобы упрощать/развертывать их абстракции (например структуры данных) в максимально простой js код на этапе сборки проекта, вместо того, чтобы все это выполнять в рантайме.
Все же очень круто, что кложура дает возможность лаконично выражать абстракции в виде данных.

Делаю прототип визуального редактора с набором простых блоков. Блоки довольно просто описать в стиле Hiccup, по структуре максимально приблежены к доменной области (свойства блоков в визуальном редакторе). Спекой неплохо выходит описать блоки и структуру, потом валидировать и разобрать все это на AST.

Дальше описываем несколько мультиметодов для транслирования в Reagent Hiccup и получаем UI.

(s/def :element/x int?)
(s/def :element/y int?)
(s/def :element/color string?)

(s/def :element/text
(s/cat
:tag #{:text}
:attrs (s/keys :req-un [:element/color])
:text string?))

(s/def :element/rect
(s/cat
:tag #{:rect}
:attrs (s/keys :req-un [:element/x :element/y])
:children (s/* :visual/element)))

(s/def :visual/element
(s/or
:rect :element/rect
:text :element/text))

(defmulti -compile-visual first)

(defmethod -compile-visual :rect [[_ {:keys [attrs children]}]]
(let [{:keys [x y]} attrs]
`[:div {:style {:left ~x
:top ~y
:position "absolute"}}
~@(map -compile-visual children)]))

(defmethod -compile-visual :text [[_ {:keys [attrs text]}]]
(let [{:keys [color]} attrs]
[:span {:style {:color color}}
text]))

(defn visual->hiccup [element]
(when (s/valid? :visual/element element)
(-> (s/conform :visual/element element)
-compile-visual)))

(visual->hiccup
[:rect {:x 10 :y 100}
[:text {:color "#000"} "text"]])

(comment
[:div
{:style {:top 100, :position "absolute", :left 10}}
[:span {:style {:color "#000"}} "text"]])