Почему LISP (Clojure)?
Возможно, после некоторого времени изучения объектной ориентации я увидел некоторые ограничения этой парадигмы, и чтобы сменить обстановку, я искал что-то, что решало бы некоторые проблемы по-другому.
Этот комикс xkcd всегда вне времени, даже после многих лет существования lisp, мы все равно в итоге используем его снова, в данном случае с более современной выделкой и мощной машиной, которой пользуется почти каждый. JVM, мы все знаем о мощности JVM с параллелизмом и параллельностью, которая уже некоторое время является стандартом рынка. Clojure с виртуальной машиной java приносит эту мощь с простотой кода, как указано.
Код — это данные
В lisp все является списком, а список понимается как Array. Еще один существенный момент: поскольку это функциональный язык, диалект лиспа, он использует функции в качестве своего ядра. Конечно, вы, как разработчик JS, уже знаете, что это значит: использовать функции и обратные вызовы, иметь функции в качестве возврата и использовать функции в качестве аргумента.
Что это за создание функций?
В JS мы объявляем функции несколькими способами, в наглядном виде это можно сделать так:
пример, который я приведу, — это функция, которая суммирует два аргумента и возвращает результат
function somar( a, b){
return a + b
}
теперь в clojure:
(defn somar
"Recebe dois valores como parametro e retorna o resultado da soma"
[a b]
(+ a b))
Супер крутые моменты, которые я люблю в clojure, эта строка, которую я поместил в качестве второго параметра, является документацией функции. Автодокументируемый код.
Сумма и все математические функции следуют польской нотации
А переменные?
Пытаясь уменьшить побочные эффекты, мы создаем переменные внутри функций, чтобы показать, что означает каждый символ.
В следующем примере я создал несколько переменных.
(defn delivery-tax
"Calculate the price of the delivery tax based on input based on this table:
80 => $ -> 15
80 < $ > 250 -> 5
$ >= 250 -> 0"
[final-items-value]
(let [free-tax 0 ;;Variaveis
mid-tax 5
max-tax 15
min-price-limit 80
max-price-limit 250
]
(cond
(<= final-items-value 0) "err"
(<= final-items-value min-price-limit) max-tax
(and (> final-items-value min-price-limit) (< final-items-value max-price-limit)) mid-tax
(>= final-items-value max-price-limit) free-tax)))
Все равно все это в скобках?
Вы кодите на JS, то, что вы видите в день скобок и скобочек, мало чем отличается от кода на clojure.
Но поскольку это просто скобки, мы получаем некоторые суперспособности, например, макросы, и я хотел бы закончить этот блог-пост двумя забавными макросами, которые показывают силу языка.
Функция some в clojure и многих других языках, принимает массив и проверяет, присутствует ли в нем какое-либо значение, как в данном случае здесь
(some #(= 5 %) [1 2 3 4 5])
=> true
мы можем изменить его с помощью макроса так, чтобы эта же функция могла (lol) исчезнуть все результаты массива
(some [1 2 3 4 5])
=> 15
Наконец, я могу сделать так, чтобы некоторые буквально исчезли вместе с моим массивом, если я хочу изменить макрос
(some [1 2 3 4 5])
=> []
Это простое введение в Clojure было тем, что я хотел бы увидеть раньше, и заставило бы меня еще больше загореться желанием писать на этой вещи, которая так проста и так увлекательна одновременно.
Я рекомендую его всем, кто, как и я, устал от одного и того же.