Аналог ADT на кложуре, разумеется ADT тут нет, как и типов, но эммулируют его просто наличием создавая в хешмапе поле type и свитча по нему, ожидая что в зависимости от одного значения этого поля, какими будут другие.
функция somefunction возвращает либо хешмап со статусом error либо success
(:status r) получает значение status, дальше по нему матчится, если error то выводим message, если success выводим result
#Clojure
функция somefunction возвращает либо хешмап со статусом error либо success
(:status r) получает значение status, дальше по нему матчится, если error то выводим message, если success выводим result
#Clojure
👍1👎1
gavr_sas
Аналог с свифтом
Такс, давно собирался сильнее влица в кложу, думаю самое время. Цель написать такую простую CLI штучку которая читает из json пары англ ру слов, и затем тебя опрашивает. Буду веси репортаж с места событий.
Первое задание, придумать схему json, считать из файла, считывать ввод пользователя в цикле.
#Clojure
Первое задание, придумать схему json, считать из файла, считывать ввод пользователя в цикле.
#Clojure
gavr_sas
Такс, давно собирался сильнее влица в кложу, думаю самое время. Цель написать такую простую CLI штучку которая читает из json пары англ ру слов, и затем тебя опрашивает. Буду веси репортаж с места событий. Первое задание, придумать схему json, считать из…
Поставить json либу и считать файл, десериализовать в json оказалось супер просто, одна команда slurp(почему slurp???) считывает файл в строку, json/read-str превращает в нативный для кложи формат вложенных мап.
Теперь пытаюсь избавиться от этих надоедливых варнингов, def создает глобальную для неймспейса переменную, и нужно использовать let, но у let некрасивый синтаксис, вместо
(def sas 42)
(let [sas 42] используй тут sas, дальше его не будет)
отдает def x in {} из мл окамлов, но это же будет неудобно, благо можно объявлять сразу несколько (let [a 1 b 2] юзаем b и a)
Похожа кложа отучает от привычного подхода объявления переменных на каждую функцию и заставляет быть более функциональным, уже очевидно что тут конеш лучше использовать пайп оператор вместо промежуточных let'ов
Теперь пытаюсь избавиться от этих надоедливых варнингов, def создает глобальную для неймспейса переменную, и нужно использовать let, но у let некрасивый синтаксис, вместо
(def sas 42)
(let [sas 42] используй тут sas, дальше его не будет)
отдает def x in {} из мл окамлов, но это же будет неудобно, благо можно объявлять сразу несколько (let [a 1 b 2] юзаем b и a)
Похожа кложа отучает от привычного подхода объявления переменных на каждую функцию и заставляет быть более функциональным, уже очевидно что тут конеш лучше использовать пайп оператор вместо промежуточных let'ов
gavr_sas
Поставить json либу и считать файл, десериализовать в json оказалось супер просто, одна команда slurp(почему slurp???) считывает файл в строку, json/read-str превращает в нативный для кложи формат вложенных мап. Теперь пытаюсь избавиться от этих надоедливых…
Забавная ситуация, циклы тут этакие рекурсионные, отдает ерленгом эликсиром, делаешь loop, а потом в разных местах делаешь recur, то есть loop создает точку рекурсии, и его можно вызывать с аргументами которые могли бы быть в том массивчике после loop
Вторая забавная фигня это отсутствие синтаксических областей видимости(как и синтаксиса), изза чего для веток if else приходится делать do блоки.
[]Вторая забавная фигня это отсутствие синтаксических областей видимости(как и синтаксиса), изза чего для веток if else приходится делать do блоки.
👍2👎1
gavr_sas
Забавная ситуация, циклы тут этакие рекурсионные, отдает ерленгом эликсиром, делаешь loop, а потом в разных местах делаешь recur, то есть loop создает точку рекурсии, и его можно вызывать с аргументами которые могли бы быть в том массивчике после loop []…
Штош, вот и вся программа, с итерацией по ключам значениям вышла история, значит есть функция seq которая принимает мапу и выдает лист массивов из пар ключ значение.
>(seq {:foo 1 :bar 2})
([:foo 1] [:bar 2])
Есть макрос doseq который проходится циклом по каждому такому массиву keyvalue из списка созданного из мапы
И воот чтобы не распаковывать эти массивы из двух kw значений внутри итерации, можно распаковать их сразу
Вот тут k, v уже первый и второй элементы каждого массива, вот и получается итерация по ключам и значениям.
В ифе остался только второй дублок, потому что на одно действие он не нужен, линтер clj-kondo встроенный в ls очень не плохо работает, жаль исправления сам не предлагает.
>(seq {:foo 1 :bar 2})
([:foo 1] [:bar 2])
Есть макрос doseq который проходится циклом по каждому такому массиву keyvalue из списка созданного из мапы
> (doseq [keyval map] (prn keyval))
[:subprotocol "mysql"]
[:username "usr"]
[:classname "com.mysql.jdbc.Driver"]
[:subname "//100.100.100.100:3306/clo"]
[:password "pwd"]
И воот чтобы не распаковывать эти массивы из двух kw значений внутри итерации, можно распаковать их сразу
(doseq [[k v] db] (println k v))Вот тут k, v уже первый и второй элементы каждого массива, вот и получается итерация по ключам и значениям.
В ифе остался только второй дублок, потому что на одно действие он не нужен, линтер clj-kondo встроенный в ls очень не плохо работает, жаль исправления сам не предлагает.
👍2
gavr_sas
Штош, вот и вся программа, с итерацией по ключам значениям вышла история, значит есть функция seq которая принимает мапу и выдает лист массивов из пар ключ значение. >(seq {:foo 1 :bar 2}) ([:foo 1] [:bar 2]) Есть макрос doseq который проходится циклом по…
Готово, спрашивает те слова, которые наименее часто правильно отгадываются, сохраняет все в жсончик
Объяснять тут уже нечего, заметил 4 особенности,
1) при ошибке стектрейс пишется в /tmp/sas.edn и читать его неоч удобно
2) если хочется сделать какое то действие между объявлениями переменных придется создать новый скоуп, как здесь нужно принтнуть поэтому на 39 новый скоуп ради 1 переменной.
3) редактировать формы офигенно удобно, все действия с текстом как бы работают с учетом скобок, нужно поменять 2 местами в какой нибудь адской вложенности, alt вверх нормально меняет местами, не строку а именно форму, тоже самое с автоотступами итд, вообщем редактировать текст приятно
4) все иммутабельное, сначала даже растерялся, функция update-in возвращает новую версию, но не меняет старую, поэтому вся приложенька на хвостовой рекурсии, храним измененный стейт в аргументах функции, по заветам функциональщиков
github.com/gavr123456789/no-wo-read
Объяснять тут уже нечего, заметил 4 особенности,
1) при ошибке стектрейс пишется в /tmp/sas.edn и читать его неоч удобно
2) если хочется сделать какое то действие между объявлениями переменных придется создать новый скоуп, как здесь нужно принтнуть поэтому на 39 новый скоуп ради 1 переменной.
3) редактировать формы офигенно удобно, все действия с текстом как бы работают с учетом скобок, нужно поменять 2 местами в какой нибудь адской вложенности, alt вверх нормально меняет местами, не строку а именно форму, тоже самое с автоотступами итд, вообщем редактировать текст приятно
4) все иммутабельное, сначала даже растерялся, функция update-in возвращает новую версию, но не меняет старую, поэтому вся приложенька на хвостовой рекурсии, храним измененный стейт в аргументах функции, по заветам функциональщиков
github.com/gavr123456789/no-wo-read
This media is not supported in your browser
VIEW IN TELEGRAM
Еще 5) немного относящееся к пункту 3 офигенный тулинг, что довольно редкто встретишь у функциональных яп(единственный норм тулинг что я знаю это F# с Rider), тут что плагинчик у vscode что у IDEA оба тк сказать mature,
- shift ctrl стрелки всегда выделяет то что нужно, не останавливаясь в бессмысленных местах
- перемещение форм местами работает через alt стрелки
- обычные штуки вроде ренейминга, перехода к определению, подсказка документации вместе с примерами по наведению отлично работают
- ну и самое главное, из-за чего я уважаю Clojure и Smalltalk несмотря на то что они динамически типизированные это конечно REPL, любую форму можно выполнить прямо в редакторе, а не в какой то отдельной косольке, это заставляет писать маленькие чистые функции, чтобы потом сразу на месте их по тестить и компоновать в большие, что очень приятно(мы люди обожаем композицию).
Выглядит это так
- shift ctrl стрелки всегда выделяет то что нужно, не останавливаясь в бессмысленных местах
- перемещение форм местами работает через alt стрелки
- обычные штуки вроде ренейминга, перехода к определению, подсказка документации вместе с примерами по наведению отлично работают
- ну и самое главное, из-за чего я уважаю Clojure и Smalltalk несмотря на то что они динамически типизированные это конечно REPL, любую форму можно выполнить прямо в редакторе, а не в какой то отдельной косольке, это заставляет писать маленькие чистые функции, чтобы потом сразу на месте их по тестить и компоновать в большие, что очень приятно(мы люди обожаем композицию).
Выглядит это так