2017-05-02 1 views
1

나는 4clojure's Prime Numbers kata에서 작업 중입니다. 내 로컬 컴퓨터에서 완벽하게 작동하는 솔루션을 (비효율적 인 경우) 가지고 있지만 defn에 의존합니다. 은 4clojure에서 금지되어 있습니다.`fn`에서`defn`을 리팩토링하면 ClassCastException이 발생합니다.

(defn factors [n] 
    (->> n 
     range 
     (map inc) 
     (filter #(zero? (mod n %))))) 

(defn prime? [n] 
    (->> (factors n) 
     (count) 
     (= 2))) 

(defn n-primes [n] 
    (->> (range) 
     (filter prime?) 
     (take n))) 

익명의 기능 만 사용하도록 리팩터링하려했지만 폭발합니다. 다음과 같은 오류를 던지는

(fn x-primes [count] 
    (let [x-factors (fn factors [n] (->> n range (map inc) (filter #(zero? (mod n %))))) 
     x-prime? (fn [n] (->> (x-factors n) (count) (= 2)))] 
     (->> (range) 
      (filter x-prime?) 
      (take count)))) 

(로컬 및 4clojure의 편집기를 실행할 때)

ClassCastException이 java.lang.Long의는 무엇을 가지고

clojure.lang.IFn

캐스트 할 수없는 코드를 리팩토링 할 때 잘못 했습니까?

왜 4cljure 금지 defdefn을 사용한다고 생각하십니까?

+0

구체적으로? – Carcigenicate

+0

그리고 어떻게 운영하고 있습니까? – Carcigenicate

+0

로컬에서 실행될 때의 사이다. 필자는 필자의 편집자 (fn이 defn으로 바뀌 었음에도 불구하고)에서 s-exp를 평가 한 다음 사이다에서'(x-primes 5) '를 호출했습니다. –

답변

6

count 함수를 매개 변수 이름으로 섀도 ​​잉하고 있습니다. (count some-num)은이 범위에서 count이 숫자가 아닌 함수이기 때문에 오류가 발생합니다.

매개 변수 이름을 count에서 다른 것으로 변경하십시오. 일부 작업은 보안상의 이유로 금지되어 있습니다

: 또한


는 4Clojure의 도움말 페이지에서, 다음 줄이있다. 예를 들어, "def"를 사용하거나 네임 스페이스를 바꿀 수 없습니다. defn 이후

는 그것은 또한 금지 있다는 의미가 단지 def 포장 매크로입니다. 어떻게 저를 넘어서지만 그것이 보안 문제로 이어질 것입니다.

관련 문제