Wpis z mikrobloga

Cześć! Kilka dni temu wydałem pierwszą wersję biblioteki programistycznej Bankster dla języka #clojure. Jak wskazuje nazwa, służy ona do obsługi jednostek monetarnych i wartości pieniężnych. Można dodawać własne waluty i rejestry walut, a także wprowadzać tłumaczenia nazw i symboli zależne od ustawień językowych.

Początkowo miało mi to zająć 3 dni, a pochłonęło miesiąc. Pierwotnie chciałem korzystać z biblioteki Money od Clojurewerkz, która bazuje na javowej Joda Money. Niestety klasy w tej ostatniej są pozamykane, a twórca dopuszcza jedynie waluty zaaprobowane przez komitet ISO (a inne niż trzyliterowe kody walut są pewnie niezłą herezją). Po paru próbach przerabiania Joda Money, zmieniłem taktykę i zacząłem robić odrębnego liba, który zależy od BigDecimal, a nie jakiejś monetarnej biblioteki Javy.

Enjoy!

https://github.com/randomseed-io/bankster

Ciekawostka:

Przy okazji na przeróżnych forach i na Stack Overflow trafiłem na porady odnośnie zaokrąglania liczb dziesiętnych, które mnie trochę przestraszyły, że ktoś je wprowadził, a ja nieświadomie i pośrednio korzystam z tego softu. Chodzi o radzenie sobie z dzieleniem, gdy rezultatem będzie nieskończone rozwinięcie dziesiętne (np. 1 / 3). Szablonową podpowiedzią jest dodanie do wywołania metody parametru zaokrąglania i sztywnej skali. I tu pojawia się ukryty problem, bo to zaokrąglanie będzie działało również dla wartości, które miałyby skończone rozwinięcie (np. 1 / 8), chociaż wychodzące trochę poza skalę. Będzie to się sprawdzało w jednych dziedzinach (podatki?), a w innych (wielokrotne przeliczanie, np. 1 / 8 / 0.5) spowoduje, że zaczną nam znikać lub pojawiać się wartości, których nie chcemy i wtedy sens korzystania z powolnych lecz bezpiecznych obiektów BigDecimal (zamiast np. z double) do liczenia pieniędzy może być zaprzepaszczony.

#programowanie #programowaniefunkcyjne #fp #biblioteka #pieniadze #waluty #kryptowaluty #freesoftware #wolneoprogramowanie #floss #btc #eth
  • 2
Do składni idzie się szybko przyzwyczaić, to po prostu przeniesienie nawiasu, zamiast funkcja(a b) jest (funkcja a b).
Myślę, że ciężej przywyknąć do idiomów, że np. (seq x) sprawdza pustość, ale dla indeksowanych kolekcji lub z licznikiem elementów szybciej będzie (zero? (count x)). Jest też parę polimorficznych funkcji, jak conj, które zależnie od argumentu dają różne wyjścia, ale np. dla nil dają listę. Mi się Clojure podoba, bo ma clojure.spec i podobne.