2010-07-13 6 views
10

Common Lisp에서는 (null x) 함수를 사용하여 빈리스트와 nil 값을 확인한다.클로저의 공통 리스프에서 (null x) 함수를 대체하는 관용적 인 방법

대부분의 논리적이 Clojure의에서

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

에 매핑됩니다. 누군가 Clojure에서보다 관용적 인 방법을 제안 할 수 있습니까?

+1

Lisp에서'NIL'과'()'(빈리스트)는 하나이며 같은 것입니다. 귀하의 코드 스 니펫은 일종의 pleonasm입니다. – Svante

+4

Clojure에는 없습니다 :'(= '() nil) => false'. 다른 Lisps에서는 이것이 사실입니다. – Isaac

+6

Svante : 귀하의 진술은 Clojure에서 진실이 아니지만 새로운 좋아하는 단어가 있습니다. – Ken

답변

16

Common Lisp에서와 마찬가지로 Clojure에서 빈 목록에 대해 과 동일한 결과를 얻으려면 empty? 함수를 사용하십시오. 이 기능은 핵심 라이브러리에 있습니다. 가져 오기가 필요 없습니다.

은 또한 술어이며, 정확하게 코드에서 무슨 일을하는지 조금 더 명확하게하는 ? 접미사. J-g의 faustus 이미 언급 한 바와 같이

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

, seq도 유사한 효과를 사용할 수있다.

+0

대답은 벡터,지도, 문자열 등에서 seq로 변환하지 않고도 작동하므로 더 낫습니다. 알 수없는 유형의 인수가 있고 seq에서 작동하려는 경우 seq 방식이 적합하다고 가정합니다. –

+3

j-g-faustus : 그러길 바래요. defn은'(defn empty? [coll] (not (seq coll)))'입니다. – naiad

+0

하하, 와우, 우리가 그걸 놓친 걸 믿을 수 없어. 2 년 후, 그러나 확실히 알고 있고 여기 있습니다. – Isaac

10

서열도 의미가 있습니다 clojure.org lazy

에서

(when (seq coll) 
    ...) 

이미 관용적, 엔드 테스트의 역할을 (seq nil)(seq()) 모두 반환 전무하기 때문이다.

nilfalse을 의미하므로 명시 적 nil 테스트가 필요하지 않습니다.

관련 문제