2012-02-27 2 views
5

Clojure에서 일부 기능이 있는지 확인할 수 있습니까?함수가 부분 함수인지 어떻게 확인할 수 있습니까?

(partial? (partial + 10))과 같은 것이 가장 좋을까요? 사전

+2

궁금한 점 : 왜 그렇게해야합니까? – viebel

+1

@Yehonathan Clojure에서 Shen을 구현 중이며 정상적인 기능과 부분적인 기능이 다를 필요가 있습니다. (설계 결정으로 인해). –

+0

셴이 무엇입니까? 또한'#()'을 통해 생성 된 익명 함수는 무엇입니까? – viebel

답변

16

없음에

감사 부분에 의해 생성 기능은 그냥 "정상적인"기능 때문이다. 당신은 그러나이 같은 그것을 위해 일부 메타 데이터를 사용할 수 있습니다

정말하지만이 방법의 결과를 생각하지 않은

(defn partial2 [f & more] 
    (with-meta (apply partial f more) {:partial true})) 

(def partial-plus (partial2 + 1 2)) 

(meta partial-plus) ;;=> {:partial true} 
...

Kotarak 작동 더 좋은 솔루션을 내놓았다

하지만, 항상 그런 것은 아닙니다. 예를 들어이 걸릴 :

(partial? (partial + 1)) ;;=> true 
(partial? (partial + 1 2)) ;;=> false 

이 작동 :

(defn partial? [f] 
    (let [[fst snd] (-> (class f) (.getName) (string/split #"\$"))] 
    (= ["clojure.core" "partial"] [fst snd]))) 

을 문자열/분할은 분할 기능이있는과 (1.3) 또는 clojure.contrib.str-utils2 (1.2) clojure.string에서.

+0

clojure.string도 1.2입니다. –

+0

'partial'뿐만 아니라'clojure.core'도 테스트해야합니다. – kotarak

+0

좋은 지적입니다. –

2

partial에서 생성 된 함수는 정상적인 함수이지만,이 함수를 사용하면 어쩌면 도움이 될만한 함수일까요? :

(defn partial? 
    [f] 
    (clojure.contrib.string/substring? "partial" (str (class f)))) 

면책 조항 : 이와 같은 내용이 속임수인지는 확실하지 않습니다.

5

해킹 할 수 있습니다.

user=> (let [partial-classes (map class [(partial + 1) 
             (partial + 1 2) 
             (partial + 1 2 3) 
             (partial + 1 2 3 4)])] 
     (defn partial? 
      [x] 
      (some #(instance? % x) partial-classes))) 
#'user/partial? 
user=> (partial? (partial - 1)) 
true 
user=> (partial? (partial - 1 2)) 
true 
user=> (partial? (partial - 1 2 3)) 
true 
user=> (partial? (apply partial - 1 2 [3 4 5])) 
true 

편집 : 미키 엘의 의견에 따라 수정. 너는 partial의 내부가 해키 한 성질을 확인해야한다는 것을 알아야한다.

관련 문제