2014-09-04 4 views
0

나는 clojure에 다소 익숙하며 술어 사용법이 확실치 않습니다. 예를 들어, 술어를 만족하는 목록의 요소를 리턴하는 함수를 작성하려면 어떻게해야합니까? 클로저에 술어를 사용하려면 어떻게해야합니까?

>(filter-in number? '(a 2 (1 3) b 7)) 
(2 7) 

>filter in symbol? '(a (b c) 17 foo)) 
(a foo) 

나는이 시도했지만 작동하지 않습니다

(defn filter-in [pred lst] 
    (fn [x] 
    (if (empty? lst) 
     () 
     (if (pred (first lst)) 
     (cons (first lst) (filter-in pred (rest lst))) 
     (filter-in pred (rest lst)))))) 

사전에 감사합니다.

+0

'(필터 번호? '(a 2 (1 3) b 7))'을 (를) 사용하셨습니까? –

+0

아니요, 함수의 이름은 필터 인입니다. –

+0

@ChrisPhillips는 열린 괄호가없는 두 번째 사용 예이며 함수 이름에'-'가 있습니까? – noisesmith

답변

1

@Deigo_Basch가 주석에서 지적했듯이 Clojure에는 이미 원하는 기능을 수행하는 기본 제공 함수 'filter'가 있습니다. 당신이 당신의 학습 과정에 도움을 당신의 자신의 만들려고하는 경우

그러나, 솔루션은 거의가 :

(defn filter-in [pred lst] 
    (if (empty? lst) 
     '() 
     (if (pred (first lst)) 
     (cons (first lst) (filter-in pred (rest lst))) 
     (filter-in pred (rest lst))))) 

원래 솔루션은 실제로 (다른 함수를 반환 함수를 정의했다 ' fn [x] '부분). 다른 함수를 반환하는 것과 같은 상위 수준 함수는 종종 유용하지만이 경우 인수에 직접 실행되는 무언가를 찾고 있습니다.

Clojure의 기본 제공 필터와 달리 정의가 지연되지 않는다는 점에 유의하십시오. 또한 Clojure의 루프 반복 메커니즘을 사용하지 않으므로 큰 목록에 스택을 날려 버릴 수도 있습니다. 이것들은 Clojure의 기능으로, 더 많이 배울 때 곧 만날 것입니다.

관련 문제