Kiedy używać if-niech jakClojure: Dlaczego pozwala się tylko na 2 formularze w wektorze wiążącym?
(if-let [a 2 b nil] (+ a b))
dostaję IllegalArgumentException:
clojure.core/if-let requires exactly 2 forms in binding vector...
Podobny do kiedy-let ...
To jest nie to, co by się spodziewać. If-let może wypróbować wszystkie wiązania i zepsuć się, gdy się nie powiedzie i ocenić wyrażenie else.
Ten sam zarzut można znaleźć w komentarzach pod numerem clojuredocs. Znalazłem odpowiedź: here, która tak naprawdę nie zadowoliła, ponieważ plakat wydaje się mieć na myśli ekwiwalent zagnieżdżonej konstrukcji typu "if-let".
Jakie są powody ograniczania powiązań makr * -let?
UPDATE: Jak wydaje się być jasne, jakie są moje oczekiwania IF-let są:
- Należy ocenić wszystkie powiązania sekwencyjnie.
- Gdy wszystko się powiedzie, powinno to ocenić "przypadek".
- Jeśli jedno połączenie nie powiedzie się, powinno natychmiast przerwać i ocenić przypadek "else".
- W przypadku braku powiązania, a nawet udało ci, nie powinny być dostępne w „else' ekspresji
Nie jest od razu oczywiste, co należy zrobić. Czy powinien się nie powieść przy pierwszym fałszywym wpisie w klauzuli let? A może po prostu przetestować pierwszy wpis, a jeśli to prawda, oceń pozostałe klauzule let do wykorzystania w poniższym kodzie? tj. traktując go jak funkcję zagnieżdżoną: (if-let [a 2] (let [bnil] (+ ab))) - Z pewnością chciałem ten konstrukt również w przeszłości ... – Korny
@Korny: o mnie oczekiwania, zobacz moje zaktualizowane pytanie. – nansen