SQL cung cấp một hàm có tên là coalesce(a, b, c, ...)
trả về giá trị rỗng nếu tất cả các đối số của nó là null, nếu không nó sẽ trả về đối số không null đầu tiên.Chức năng phối hợp Clojure
Bạn sẽ viết một cái gì đó như thế này ở Clojure như thế nào?
Nó sẽ được gọi như sau: (coalesce f1 f2 f3 ...)
trong đó fi
là các hình thức chỉ nên được đánh giá nếu được yêu cầu. Nếu f1
không phải là không, thì không nên đánh giá f2
- nó có thể có tác dụng phụ.
Có thể Clojure đã cung cấp chức năng (hoặc macro) như vậy.
EDIT: Dưới đây là một giải pháp mà tôi đã đưa ra (sửa đổi từ trình của Stuart Halloway Clojure, (and ...)
vĩ mô trên trang 206):
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if c# c# (coalesce [email protected])))))
vẻ để làm việc.
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if (not (nil? c#)) c# (coalesce [email protected])))))
Đã sửa lỗi.
@ user128186: Không chắc bạn cần '(not (nil? V #))' trong câu lệnh '(if ...)', vì bất kỳ thứ gì không phải là 'false' hoặc' nil' đều đánh giá 'true'. Nếu không, các giải pháp của chúng tôi là như nhau. – Ralph
tại sao bạn sẽ ghi lại 1: 1 của "hoặc" -macro? – nickik
@Ralph: Vì vậy, bạn muốn đầu tiên không phải là nil hoặc đầu tiên không phải là giá trị sai? – Arjan