2013-03-07 2 views
1

clojure에서 완전히 익숙하지 않고 대학 이후에 프로그래밍 기능이 전혀 없기 때문에 clojure 구문을 이해하기 위해 몇 가지 예제 코드를 해석하려고합니다.함수 매개 변수로 Clojure 벡터

필자는 피보나치 (Fibonacci, https://gist.github.com/pcalcao/ea4176719d778ea3ab9e)의 여러 버전을 코딩하여 시작했지만, 더 복잡한 형태를 완전히 이해한다고 말할 수는 없습니다. 예를 들어

이 : 난 정말이 코드의 가장 안쪽 부분을 이해하는 데 어려움을 겪고있어

(defn fib_map [n] 
    (last (take (+ n 1) 
    (map first (iterate (fn [[a b]] [b (+ a b)]) [0 1]))))) 

: 나의 이해에서, 이제

fn [[a b]] [b (+ a b)] 

, 우리는 익명 함수를 만드는 하나의 매개 변수 인 두 개의 값을 가진 벡터 (이것은 파기입니다, 맞습니까?)를 반환하고 다른 벡터를 반환합니다.

fn [a b] [b (+ a b)] 

이 동일합니다

자, 대신, 우리는이 작업을 수행 할 이유는 무엇인가? 아니면 단순히 우리의 익명의 함수를 iterate에서 사용할 "특수 효과"라는 단일 매개 변수로 받습니까?

미안 내가 완전히 말한 것처럼,하지만 내가 말했듯이, Lisp과 같은 언어는 아직 내 장점이 아니다.

답변

10

당신은 이미 정확하게 알아 냈습니다.

(fn [[a b]] ...) 형식의 기능은 구조 조정을 사용하고 있습니다. clojure의 nth 기능을 지원하는 벡터 또는 다른 유형의 객체 여야하는 단일 매개 변수를 사용합니다. 구조 해제를 사용하면 벡터에서 처음 두 값을 "끌어 와서"로컬 변수 ab에 할당합니다.

(fn [a b] ...) 형식의 기능은 두 개의 매개 변수의 함수입니다. 둘은 동등하지 않습니다.

iterate과 함께 (fn [[a b]] ...) 양식을 사용해야하는 이유는 iterate이 단일 매개 변수 기능에서만 작동한다는 것입니다.

+1

자세한 설명을 위해 받아 들여졌습니다. 또한 * 벡터의 * 처음 두 값은 내가 더 많은 요소를 가진 콜을 통과하면 나머지는 무시된다는 것을 알게되었습니다. 나는 그것을 알지 못했습니다! 좋은. – pcalcao

1

iterate는 하나의 함수와 하나의 매개 변수라는 두 개의 매개 변수 만 사용하기 때문에 발생합니다. cf. the docs

관련 문제