tag:blogger.com,1999:blog-20941681.post7695025473318843719..comments2024-02-13T18:09:44.121+01:00Comments on Jacek Laskowski scala jawnie: Funkcyjne wyjście z REPL z (exit) i ankieta językowaAnonymoushttp://www.blogger.com/profile/09734540973692423017noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-20941681.post-28013540834720663992009-11-19T12:58:51.729+01:002009-11-19T12:58:51.729+01:00Errata: miało być oczywiście:
(defn exit [] (Syst...Errata: miało być oczywiście:<br /><br />(defn exit [] (System/exit 0))Danielhttps://www.blogger.com/profile/18133712104945008367noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-70195644382732299702009-11-19T12:47:06.646+01:002009-11-19T12:47:06.646+01:00Ważne jest żeby zrozumieć, że te dwie wersje są ró...Ważne jest żeby zrozumieć, że te dwie wersje są równoważne (defn jest makrem, które rozwija się do def; spróbuj zrobić na obu macroexpand-1). Druga jest "kanoniczna" w tym sensie, że przekazuje intencję zdefiniowania nazwanej funkcji (tzn. jak czytasz taki kod, to widzisz od razu, że exit jest czymś, co można wołać). A jeszcze bardziej kanonicznie jest korzystać z cukru składniowego do wołania metod statycznych Javy:<br /><br />(defn exit [] (System/exit))<br /><br />Pozwolę sobie też sprecyzować różnicę między funkcją anonimową a domknięciem, bo to nie to samo. W Clojure każda funkcja, nawet nazwana, jest (może być) domknięciem; za to istnieją języki, w których ani funkcje anonimowe ani zwykłe nie są pełnoprawnymi domknięciami - OIDP stare wersje Pythona tak miały.<br /><br />Żeby zrozumieć różnicę, rozważmy następujący kawałek kodu:<br /><br />(let [tmp (atom 0)]<br /> (defn counter []<br /> (swap! tmp inc)))<br /><br />Forma let wprowadza tu wiązanie symbolu tmp do pewnej wartości, widoczne *wyłącznie* w ciele tej formy; nie ma sposobu, aby dobrać się do niego z zewnątrz. (Pełna enkapsulacja!) A w ciele let mamy definicję funkcji i w jej obrębie możemy używać tmp. Mówi się, że ta funkcja "domyka się" nad środowiskiem, w którym tmp dowiązane jest do pewnego atomu. (Zahacza to o Clojurowe mechanizmy współbieżności, ale nie trzeba ich znać, żeby zrozumieć to o czym piszę).<br /><br />W ten sposób zdefiniowaliśmy licznik:<br /><br />(counter)<br />1<br /><br />(counter)<br />2<br /><br />(counter)<br />3Danielhttps://www.blogger.com/profile/18133712104945008367noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-18548856464181884262009-11-18T22:44:22.491+01:002009-11-18T22:44:22.491+01:00@Daniel, super pytanie, które mnie na chwilę wstrz...@Daniel, super pytanie, które mnie na chwilę wstrzymało zanim znalazłem odpowiedź. def definiuje zmienną globalną (powiedzmy stałą w sensie Javy), a defn definiuje funkcję. Ja chciałem zdefiniować funkcję (exit), więc mogłem wybrać oba podejścia. Po prostu wygodniej mi było z <br /><br />(def exit #(. System exit 0))<br /><br />zamiast<br /><br />(defn exit [] (. System exit 0))<br /><br />Jest krócej o znak. Nie wiem, czy są inne zalety jednego względem drugiego. W pierwszym definiuję domknięcie - funkcję anonimową - a w drugim funkcję nieanonimową. Na chwilę obecną powiedziałbym, że to kwestia gustu.Anonymoushttps://www.blogger.com/profile/09734540973692423017noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-87406949157772858752009-11-18T21:53:30.068+01:002009-11-18T21:53:30.068+01:00jest jakiś powód, dla którego używasz def zamiast ...jest jakiś powód, dla którego używasz def zamiast defn?Danielhttps://www.blogger.com/profile/18133712104945008367noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-33251403467916524382009-11-17T21:07:36.162+01:002009-11-17T21:07:36.162+01:00Mam pytanie do Andrzeja. Czy wykorzystywałeś erlan...Mam pytanie do Andrzeja. Czy wykorzystywałeś erlang w komercyjnych rozwiązaniach, czy jest to język, który po prostu chciałeś poznać?Unknownhttps://www.blogger.com/profile/08521970027869735215noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-7086535066993585402009-11-17T16:44:20.145+01:002009-11-17T16:44:20.145+01:00wlaśnie te nawiasy mnie odpychają, z funkcyjnych j...wlaśnie te nawiasy mnie odpychają, z funkcyjnych języków to preferuje Erlanga z kilku powodów:<br /><br />1. bo ma OTP i natywne wsparcie do "clustrów" bez cudów typu gridgain czy teracota<br />2. bo radzi sobie z większymi obciążeniami niż Java<br />3. bo jest prosty jak budowa cepa (pare słów kluczowych) a przy tym o wiele czytelniejszy niż wiekszość czysto funkcyjnych języków<br />4. bo ma wspaniały matching (zarówno na poziomie wyrażeń jaki i funkcji).<br /><br />co do Clojure, to podobny jest problem jak ze Scalą ... mieszanie kodu funkcyjnego i OO, powoduje że i tak nie wykorzystujemy w pełni FP, kod nie jest pozbawiony side effect bo korzysta bibliotek napisanych w javie. Jak najbardziej funkcyjne konstrukcje w Scali uwielbiam (dodatkowo traits, case clasess + aktorów) podobnie jak w Pythonie i w Rubym, ale moim zdaniem JVM nie nadaje się do czysto funkcyjnego programowania ... bo nie został do tego zaprojektowany.Andrzej Śliwahttps://www.blogger.com/profile/07639645042259592902noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-31828427150354769462009-11-17T16:42:25.210+01:002009-11-17T16:42:25.210+01:00Ten komentarz został usunięty przez autora.Andrzej Śliwahttps://www.blogger.com/profile/07639645042259592902noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-65822915950795313132009-11-14T16:14:44.220+01:002009-11-14T16:14:44.220+01:00Oczywiście, że Scala :). Czasem jeszcze Python, gd...Oczywiście, że Scala :). Czasem jeszcze Python, gdyż studia tego wymagają.Michał Jhttps://www.blogger.com/profile/01648422937214699279noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-89870724920000943062009-11-14T00:04:53.462+01:002009-11-14T00:04:53.462+01:00java.lang jest domyślnie zaimportowany więc nie tr...java.lang jest domyślnie zaimportowany więc nie trzeba pisać pełnej nazwy Runtime.<br /><br />Stąd też wynika, że wygodnie można tworzyć typy obudowane np. (Integer. "123")Unknownhttps://www.blogger.com/profile/08521970027869735215noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-78589230420898460212009-11-13T22:56:00.796+01:002009-11-13T22:56:00.796+01:00Dokładnie tak! Właśnie sobie uzmysłowiłem, więc za...Dokładnie tak! Właśnie sobie uzmysłowiłem, więc zadanie uzupełniające: Proszę o wersję krótszą (aż o 10 znaków!) :)Anonymoushttps://www.blogger.com/profile/09734540973692423017noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-51956046068106822772009-11-13T20:59:06.357+01:002009-11-13T20:59:06.357+01:00Odp.:
(def available-procs #(.. java.lang.Runtime...Odp.:<br /><br />(def available-procs #(.. java.lang.Runtime getRuntime availableProcessors))Unknownhttps://www.blogger.com/profile/08521970027869735215noreply@blogger.com