2017-05-22 26 views
8

Jaki byłby przykładowy scenariusz, w którym io! blok byłby używany w Clojure? Mam problemy ze zrozumieniem jego celu.Jakie jest praktyczne zastosowanie urządzenia io! blok w Clojure?

+0

Nigdy go nie używano, ale wydaje się, że jest to sposób egzekwowania, że ​​funkcja/kod nie jest używana w transakcji. – Carcigenicate

+1

Interesujące pytanie ... Zrobiłem szybkie wyszukiwanie listy mailingowej, znalazłem [jeden wątek] (https://groups.google.com/d/msg/clojure/ZZP93tVmot4/DoDBAlDrHmYJ) i [inny] (https: // grupy .google.com/d/msg/clojure/TAhNp7rb2Go/Kij920UDKbwJ), a zwłaszcza [wątek, w którym został wprowadzony] (https://groups.google.com/d/msg/clojure/JRRegOOwohE/3gWZjmWClpUJ) (i [commit] (https://github.com/clojure/clojure/commit/c5e8c6f06292fab26d29cb951d8400394e0f8258)). – glts

+0

Dzięki @glts bardzo przydatne linki. Myślę, że następujące dwie odpowiedzi podsumowują to dobrze: "Myślę, że to zatrzyma inny kod by owinąć dookoła kodu z wyraźnym wywołaniem io! Jego deklaratywny sposób powiedzenia: robię io! DONT UŻYJ mnie wewnątrz dosync." i "Chodzi o to, aby oznaczyć kod, który ma wpływ na efekt uboczny, abyś nie mógł go wykorzystać w transakcji." – Aspasia

Odpowiedz

5

Jest częścią systemu STM dla ensuring that code related to IO is not used inside STM transactions. Ponieważ clojure będzie ponawiać próbę transakcji, jeśli inny wątek będzie zawierał sprzeczne dane podczas wykonywania transakcji, każde zamówienie IO wytworzone przez tę transakcję byłoby fałszywe, ponieważ reprezentuje stan pamięci, który może być odrzucona.

+1

Jeśli spojrzysz na [źródło] (https://github.com/clojure/clojure/blob/clojure-1.9.0-alpha14/src/clj/clojure/core.clj#L2485), zobaczysz, że po prostu wyrzuca wyjątek, jeśli transakcja jest w toku, w przeciwnym razie wykonuje ciało w normalny sposób. –

+0

Jest to pomocne, ale abstrakcyjne. Przykładowy scenariusz, w którym faktycznie go użyjesz: powiedz, że piszesz pakiet z niektórymi funkcjami, które obsługują IO, niektóre znane użytkownikowi, niektóre nieznane użytkownikowi. używaj '(io! & body)' we wszystkich z nich do rzucania i błędów, jeśli są używane w niebezpieczny sposób (tj. w ramach transakcji) – jaimedash

+1

pracują w clojure od ostatnich siedmiu lat profesjonalnie i nigdy nie widzieli, jak był używany , więc nie przychodzą na myśl żadne popularne przykłady. –

Powiązane problemy