2012-05-12 3 views
9

현재 Clojure를 배우려고 노력 중이며 매개 변수가 가변적 인 함수를 작성하려고합니다. 이 함수는 모든 입력을 필터링하여 문자열인지 여부를 확인해야합니다. 그렇다면 타입 문자열의 모든 입력이 반환되어야합니다 ..필터 유형 문자열 in Clojure

Clojure는 생각이 다른 방식으로는 어렵지만 올바른 방향으로 여기에 있습니다. 나는 그것을 해결할 수 없습니다.

(defn returnString [& y] 
(if (next y) 
(filter (fn [x] (= (type x) "java.lang.String"))y) 
(recur (next x)))) 

감사!

답변

11

인수가 문자열이면 true를 반환하고 그렇지 않으면 false를 반환하는 함수가 string?입니다.

=> (string? "hi") 
true 
=> (string? 100) 
false 
=> (string? ["a" "b" "c"]) 
false 

그래서 염두에두고, 당신의 기능과 같습니다

(defn return-strings [& vals] 
    (filter string? vals)) 

재귀에 대한 필요 걱정이 (없다, 그래서 값의 시퀀스 (기본적으로 컬렉션을) 반환 필터 기능 즉, recur 사용)이이 경우에 대한 사용자 지정 함수에서.


문자열이란 무엇인지 결정하는 데 사용되는 익명 함수는 정확함에 매우 가깝습니다. 당신이 당신의 REPL에 (source string?)를 입력하여 string?의 소스를 보는 경우에, 당신은 볼 수 있습니다 : 당신이 복용하는 방법은 잘 작동

(fn [x] (instance? String x)) 

있지만. 당신이 제공 한 문자열 값 대신 String 클래스를 지정하면됩니다. (참고로, 패키지가 Java와 같이 자동으로 포함되므로 java.lang을 그대로 둘 수 있습니다.)

(fn [x] (= (type x) String))