Mam grupę funkcji numerycznych w Clojure, które chcę zweryfikować argumenty dla. Istnieje wiele typów argumentów oczekiwanych przez funkcje, takie jak dodatnie liczby całkowite, procenty, sekwencje liczb, sekwencje liczb niezerowych itd. Potrafię zweryfikować argumenty każdej pojedynczej funkcji przez:Czy powinienem używać funkcji lub makra do sprawdzania poprawności argumentów w Clojure?
- Zapisywanie kodu walidacyjnego bezpośrednio w funkcji .
- Zapisywanie ogólnej funkcji celu , przekazywanie jej argumentów i spodziewanych typów .
- Tworzenie makra ogólnego przeznaczenia, przekazywanie argumentów i oczekiwanych typów .
- Inni, o których nie pomyślałem.
Niektóre Lisp code przez Larry Hunter jest dobrym przykładem # 3. (Poszukaj makro test-variables
.)
Mam intuicję, że makro jest bardziej odpowiednie ze względu na kontrolę nad oceną i możliwość wykonywania obliczeń w czasie kompilacji, zamiast wykonywać to wszystko w czasie wykonywania. Ale nie natknąłem się na przypadek użycia kodu, który piszę, który zdaje się go wymagać. Zastanawiam się, czy warto napisać takie makro.
Wszelkie sugestie?
Nice; nie wiedziałem, że – pmf
Dzięki za kolejną wspaniałą odpowiedź. Dokładnie to właśnie chciałem zrobić. To również ilustruje jeden z powodów, dla których makro jest lepszym rozwiązaniem. Zastanawiając się nad ujednoznacznieniem argumentu problemu, jeśli funkcja wymaga dwóch lub więcej z tymi samymi cechami, powiedzmy dwie liczby całkowite dodatnie, trasa makra pozwala umieścić nazwę argumentu problemu w komunikacie o błędzie, a nie tylko wartość. Nie sądzę, żebyś mógł to zrobić za pomocą funkcji. – clartaq
Warunki wstępne i warunki postojowe są udokumentowane tutaj http://clojure.org/special_forms Wyszukaj mapę warunków. – Chouser