2010-07-13 34 views
10

Trong Lisp thường bạn sử dụng hàm (null x) để kiểm tra danh sách trống và giá trị nil.cách thành ngữ để thay thế (null x) chức năng từ lisp phổ biến trong clojure

logic Hầu hết các bản đồ này để

(or (nil? x) (= '() x)) 

Trong clojure. Ai đó có thể đề xuất một cách thành ngữ hơn để làm điều đó trong Clojure?

+1

Trong Lisp, 'NIL' và'() '(danh sách trống) là một và giống nhau. Đoạn mã của bạn là một pleonasm. – Svante

+4

Không có trong Clojure: '(= '() nil) => false'. Trong Lisps khác, điều này là đúng. – Isaac

+6

Svante: Tuyên bố của bạn có thể không đúng trong Clojure nhưng tôi có một từ mới yêu thích. – Ken

Trả lời

16

Để nhận được kết quả tương tự cho danh sách trống trong Clojure như bạn thực hiện trong Common Lisp, hãy sử dụng chức năng empty?. Hàm này nằm trong thư viện lõi: không cần nhập.

Nó cũng là một vị ngữ, và hậu tố với một ?, làm cho nó rõ ràng hơn một chút chính xác những gì bạn đang làm trong các mã.

=> (empty? '()) 
true 
=> (empty? '(1 2)) 
false 
=> (empty? nil) 
true 

Vì đã lưu ý j-g faustus, seq để có hiệu ứng tương tự.

+0

Câu trả lời của bạn tốt hơn, vì nó cũng hoạt động với vectơ, bản đồ, dây, vv mà không chuyển đổi chúng thành các seq. Tôi cho rằng phương pháp tiếp cận seq là phù hợp nếu bạn có một đối số của loại không xác định và muốn hoạt động trên một seq. –

+3

j-g-faustus: Tôi ước Các defn là '(defn trống? [Coll] (không (seq coll)))'. – naiad

+0

Hah, wow, không thể tin rằng chúng tôi đã bỏ lỡ điều đó. Hai năm sau, nhưng chắc chắn tốt để biết và có ở đây. – Isaac

10

seq cũng phục vụ như kiểm tra cho kết thúc, đã thành ngữ

(when (seq coll) 
    ...) 

Từ clojure.org lazy

Nó hoạt động vì (seq nil)(seq()) cả trở lại con số không.

Và kể từ nil có nghĩa là false, bạn không cần thử nghiệm nil rõ ràng.

Các vấn đề liên quan