2012-01-11 4 views
8

나는 순간에 간계 계획을 배우고, 그리고 문서에 갑자기 다음과 같은 구성으로 실행 :"베어"형식 매개 변수로 람다 정의를 사용하는 경우?

((lambda args (display args)) 42) 
=> (42) 

이 루프 나를 던졌다; 이 시점까지 나는 가정 형식 매개 변수가 항상 목록에 동봉 된 한까지 :

((lambda (args) (display args)) 42) 
=> 42 

나는이 변형을 사용할 때 궁금하고,이 인자의 변수 수에 대한 점 표기법 어떻게 다른지. - 아마도 더 복잡한 예제 -

((lambda args (display args)) 1 2 3)  => (1 2 3) 
((lambda (. args) (display args)) 1 2 3) => (1 2 3) 

차이가있다 내가 알고 있어야 다른 이상을 선호 할 이유가 있음 : 특히, 다음 두 가지 변종의 차이는 무엇인가?

+3

보너스로 'list'의 정의는 다음과 같습니다. '(list (lambda xx) 정의)'입니다. – erjiang

답변

6

다른 점은 lambda 양식 예상 실제 인수의 수를 정확히 알고있는 경우이 버전은 경우에 유용 args라는 하나의 매개 변수를 수신 할 수 있습니다 :

(lambda (args) (display args)) 

을 그리고이 버전은 아마도 (A 받는다 목록) 빈 당신이 lambda 양식 가변 인자를 예상 할 때, args 유용한라는 매개 변수의 :

(lambda args (display args)) 

는 다음의 두 가지 버전 사이에 차이점이 없습니다, 그러나이 점 이전 부분을 실종 이후 모든 통역, 두 번째를 받아 들일 것이다 (따라서는 피해야한다) :

(lambda args (display args)) 
(lambda (. args) (display args)) 

다음 버전이 lambda 양식에 하나 이상의 필수 매개 변수 (점의 왼쪽에있는 기호) 및 0 개 이상의 선택적 매개 변수 (점의 오른쪽에 단일 기호)가있는 목록을 지정하려는 경우에 유용합니다.

(lambda (mandadory1 mandatory2 . optional) (display mandatory1)) 
+3

'(. args)'는 유효한 스키마 읽기 구문이 아닙니다. 그러나 Guile은 독자들에게 그것을'args'라고 읽도록 확장시키는 것처럼 보인다. 확실히 휴대 할 수 없으며, 말한 것처럼 최선의 피할 수 있습니다. –

+1

우수합니다. 감사합니다. 나는 그것이 다른 방향이라고 생각했다; dot-only 형태가 완전히 표준이고 "벌거 벗은"형태가 조금 이상하다고 가정했다. 나는 점 형식이 초보자의 눈을 위해 다른 형태의 자연스럽게 다음과 같다고 생각합니다. – Janne

1

이것은 나를 위해 나를 던졌다. oop; 이 시점까지 나는 가정 형식 매개 변수는 항상 목록에 동봉 된했다 : (a . args)(a b . args) 같은 일이 아니라는 것을

주 정말 하나 나열합니다. (a . args)car이 기호 a이고 cdr이 기호 args 인 쌍입니다. (a b . args)car이 기호 a이고 cdr이 (이 기호 b이고 cdr이 기호 args 인 쌍인 쌍입니다. 다소 잠깐 동안 목록과 비슷하지만, ab으로 끝나지 만, null로 끝나지 않으므로 빈 목록은 실제로 적절한 목록이 아닙니다. 그런 구조는 부적절한 목록이라고도합니다. 당신이 싶은 경우에, 당신은 점선 쌍 표기 here에 대해 조금 읽을 수있다, 또는 다른 곳에서 ... (. args)

어쩌면 "는 cdr가 기호 args 인 한 쌍은"같은 것을 말할 것입니다.아니면 car이고 cdrargs 인 쌍과 같이 나올지도 모릅니다. 어쨌든 그것은 많은 의미를 갖지 않을 것입니다. Chris Jester-Young이 말했듯이, 그것은 실제로 유효한 계획이 아닙니다.

So. (a b . args)과 같은 것은 마지막으로 cdr에 null이 아닌 것을 넣기위한 점 표기 쌍입니다. Scheme의 형식 매개 변수가 부적합한 목록 또는 적절한 목록 또는 심볼 일 수있는 경우 형식 매개 변수의 정의는 다음과 같은 형식이어야합니다. 형식 매개 변수 - 반드시 null, 기호, 또는 car이 기호이고 cdr이 형식 매개 변수 일 경우의 쌍입니다.

(나는 매개 변수에 인수를 바인딩하는 다소 우아한 방법을 생각하면 멋지다고 생각합니다. 형식 매개 변수를 보면, 인수의 목록을 그 쌍의 경우에는 car 인수를 공식 매개 변수의 cdr에 바인딩하고 공식 매개 변수/인수의 cdr을 반복합니다 (예 : null 일 경우 완료 또는 무언가).의 기호가 &rest이면 나머지 인수를 기호에 바인딩합니다. "

+0

점이 찍힌 쌍 - 나는 결코 연결을 만들지 않았습니다. 이것이 공식 매개 변수 명세에 대한 특정 표기법이라고 생각했습니다. 감사; 나는 기회가있을 때 나의 질문을 편집 할 것이다. – Janne

관련 문제