2014-08-30 5 views
1

를 설정 내가 가진 무엇인가? 나는 테스트를 위해 술어를 사용할 수 있기를 원한다. 커먼 리스프에서 예를 들어 pushnew가 : Clojure의 비슷한 일이벡터에 값을 추가하고 여기에

pushnew item place &key key test test-not 

있습니까? 아마도 벡터 대신 집합을 사용해야합니다. 벌금. 세트가 값을 비교하는 데 사용할 술어를 어떻게 정의합니까? 예를 들어, set은 문자열을 포함 할 수 있으며, 대소 문자의 차이가 집합에 대한 연산에 영향을주지 않아야한다고 가정 할 때 Clojure가이를 어떻게 다루는가?

(defn push-new [v value] 
    (if (some #{value} v) 
     v 
     (conj v value))) 

지금 당신은 쉽게 원자의 하나 개의 값까지 이동이 FN을 사용할 수 있습니다 : 당신이 원자 작동하지 않은 경우가있을 것입니다 수없는 경우

답변

2

당신이 사용하는 경우가 등호 및 해시 코드에 의존 할 필요가 없습니다

user> (def my-atom (atom (sorted-set-by (fn [a b] (compare (.toLowerCase a) (.toLowerCase b)))))) 
#'user/my-atom 
user> (swap! my-atom conj "Hello") 
#{"Hello"} 
user> (swap! my-atom conj "hello") 
#{"Hello"} 
user> (swap! my-atom conj "abc") 
#{"abc" "Hello"} 
user> (swap! my-atom conj "Abc") 
#{"abc" "Hello"} 
+0

글쎄, 고마워, 나는 실제로 이것도 쓸 수있다, 나는 표준을 찾고 있었고, 이미 구현 된 솔루션을 사용하여 바퀴의 재발 명을 피했다. 어쨌든 감사합니다. – Mark

+0

편집을 주목하십시오 - 실제로 이것은'sorted-set-by'가 (적어도 주문이 중요하지 않다면) 설계된 것입니다. – noisesmith

+0

아니요, 순서는 중요하지 않습니다. 예제는 여기에서 단순화되었지만 실제로는 단어 사전과 같습니다. – Mark

2

은 fn는 벡터에 추가 다음 :

(defn add-to-my-atom [the-atom x] 
    (swap! the-atom push-new x)) 

사용 사례에 따라 더 적절할 수 있습니다. Clojure는 정렬 된 집합을 사용하지 않는 한 집합에 넣은 개체의 equals 및 hashcode 구현에 의존하거나 집합에 넣기 전에 단순히 대문자로만 사용할 수 있습니다. 사용자 정의가 콤퍼레이터 분류와 세트 사용

user> (def my-atom (atom [])) 

(defn push-new 
    [place item pred] 
    (if (pred place item) 
    (conj place item) 
    place)) 

(defn add-to-my-atom! 
    [x] 
    (swap! my-atom push-new x 
     (fn [place item] 
      (not (some #(= (.toLowerCase %) 
          (.toLowerCase item)) 
         place))))) 


#'user/add-to-my-atom! 
user> (add-to-my-atom! "Hello World!") 
["Hello World!"] 
user> (add-to-my-atom! "hello world!") 
["Hello World!"] 
user> (add-to-my-atom! "ABCDE") 
["Hello World!" "ABCDE"] 
user> (add-to-my-atom! "abcde") 
["Hello World!" "ABCDE"] 

: 벡터를 사용

+1

을 정렬 된-설정하여 – noisesmith

+0

을 잊었습니다. 감사! – DanLebrero

관련 문제