#programowanie #clojure #learnclojurewithmikroblog

Odcinek 6. Makra - pierwsza krew.

Przepraszam za opóźnienie, teraz trochę rzadziej będą kolejne odcinki - tematy są trudniejsze do wyjaśnienia, i mam trochę mniej czasu. Ok, lecimy:

Jak już powiedziałem - makro to po prostu funkcja przyjmująca i zwracająca kod clojure. Kod jest przyjmowany, przetwarzany i zwracany w postaci sparsowanej - czyli jako zagniżdżone struktury danych clojure - listy, wektory, mapy itd. Głównie listy, które sa skłądnią wywoływania
@tell_me_more: łatwiejszy sposób na napisnaie zad 6, dziś się zorientowałem, że przecież można:

(


defn 
```**```
rec-filter-ids [kod]

        (
```**```
filter symbol? 
```**```
(flatten kod)))

W clojure jak funkcja ma więcej, niż kilka linijek, to zwykle znaczy, że robisz coś na około :)
  • Odpowiedz
#learnclojurewithmikroblog

@dzien_dobry : niestety http://wykop-code.appspot.com/ sobie nie radzi z kodem z za dobrze, wkleiłem odcinek ale po przeklejeniu się psuje, jeszcze spróbuje pokombinować. Poniżej będą testy formatowania wykopu:)

Tzn wykop-code sobie radzi, ale wygenerowany kod nie działa na mikroblogu.

Np taki kod:

````(+ ~x ~y (- x y))```

w wykop-code robi się taki

(
```**```

```**```
~x ~y (
```**```

```**```
x y))

Da się jakopś eskejpować
w wykop-code?
#programowanie #learnclojurewithmikroblog #clojure

Odcinek 5 - wstęp do makr

Prawdziwa potęga lispów tkwi w makrach, ale zanim do nich dojdziemy, musimy dokładnie zrozumieć sposób działania języka.

Na wejściu jest string lub strumień wejściowy od użytkownika (w interpreterze) lub z pliku (w kompilatorze).

"(println (reduce + [1 2 3 4]))"
1. Część clojure o nazwie Reader parsuje tego stringa do clojurowej struktury danych, na razie nic nie wykonując. Można zobaczyć, jak to działa
@erwit: tak, jeden praktycznie gotowy, tylko muszę go sformatować jakoś lepiej (syntax quote czyli ` psuje formatowanie kodu na wykopie, a bez tego ciężko makra w clojure robić ;) ), pewnie w weekend dodam, ostatnio miałem mało czasu
  • Odpowiedz
#programowanie #learnclojurewithmikroblog #clojure

Odcinek 3 - więcej o funkcjach wyższego rzędu, uzupełnienie niektórych rzeczy które pominąłem.

Dla odmiany zacznijmy najpierw od zadania z poprzedniego odcinka.

Najpierw napiszę jedną funkcję tak, jakby nie było map reduce ani nic takiego:

; suma wektorow 2wymiarowych v1 i v2
(
```
defn 

**
v2d+ [v1 v2]


      [(

**


**
(v1 0)


          (v2 0))


       (

**


**
(v1 1)


          (v2 1))])

Resztę funkcji można zapisać analogicznie. Jest to jednak sporo kodu,
@Xanatos: clojure przede wszystkim nadaje się do aplikacj, które muszą działać wielowątkowo, i takich, w których większość kodu to skomplikowane algorytmy. Ma tą zaletę, że można używać bibliotek javy bezpośrednio (więc prawie wszystkie API jakie istnieją stoją otworem), i jednocześnie można pisać makra jak w LISPach, więc da się zrefaktorować kod i pozbyć się duplikacji, której w językach imperatywnych nie da się pozbyć.

Z tego co zauważyłem, ludzi stosują clojure do
  • Odpowiedz
#programowanie #learnclojurewithmikroblog #clojure

W dzisiejszym odcinku - wstęp do struktur danych i funkcji wyższego rzędu. Najczęściej używane struktury danych w clojure to:

[1 2 3 4] ; wektor
{


"Jan Nowak"


1984, 


"Anna Kowalska"


1999} ; mapa
#{ 


"a"





"o"





"e"





"i"





"u"


} ; zbiór
Struktury te mogą być niejednorodne (np. w 1 wektorze mogą być elementy różnych typów) i dowolnie zagnieżdżone (np. kluczami mogą być dowolne typy).

[ []
[1]
[1 2 3]
[[[]]] ]
{ [


"Jan"





"Nowak"


] {


"płeć"





"M"


,



"rocznik"


1984},
[
#programowanie #clojure #learnclojurewithmikroblog

Zaczynamy. Kod można przepisywać do intepretera clojure na stronie http://tryclj.com/ albo można sobie zainstalować clojure na komputerze: http://clojure.org/getting_started

Podstawy składni - wywołanie funkcji f(arg1, arg2, arg3) wygląda tak:

(f arg1 arg2 arg3) ; to się wywali bo nie ma funkcji "f"
; oznacza komentarz do końca linii, elementy oddzielamy spacjami.

Na początek - jeśli nie wiemy, co robi jakaś funkcja czy makro w clojure można zawsze wywołać

(doc cokolwiek)
@Neutrin: clojure jest na jvm, .net i javascriptcie, ale najlepiej działa na jvm. O wersj dla C++ nie słyszałem.

Bangla dobrze jak na to co robi - to nie jest typowy lisp. Przede wszystkim ma Software Transactional Memory zaimplementowane i trwałe (persistent) struktury danych. Efekt jest taki, że pisząc idiomatyczny kod w clojure - jest on praktycznie zawsze gotowy do odpalenia na wielu wątkach. Taki zresztą był cel twórcy tego języka.
  • Odpowiedz
#programowanie #learnclojurewithmikroblog

Mam taki pomysł na serię wpisów na mirko z zadankami uczącymi języka clojure. Jest to dość oryginalny język - taki bardziej funkcyjny i unowocześniony LISP, jest stronka http://tryclj.com/ na której można się pobawić interpreterem, i jeśli będzie kilku chętnych będę zamieszczał opis języka i proste zadanka do zrobienia (proste, żeby nie trzeba było nic instalować - można rozwiązywać na tej stronce tryclojure).

Clojure jest fajne, bo można w kilku linijkach