2012-04-17 7 views
2

나는 방식이 코드 조각이 :이 정의는 어떻게 작동합니까?

(define (x . y) y) 
(x 1 2 3) 

을하고 나는 그것이 동등에 알고

'(1 2 3) 

하지만 난 이유를 이해할 수 없다.

첫 번째 코드 줄은 무엇을합니까?

감사합니다.

+0

이들은 서로 일치하지 않습니다. (x 1 2 3)은 (목록 1 2 3)과 같습니다. 그리고 너가 원하는게 뭐야? R6RS는 매우 읽기 쉬운 문서이며 함수 정의와 매개 변수에 대한 모든 것이 있습니다. – yazu

답변

3

첫 번째 줄 (define (x . y) y)5.2 Definitions (마지막 절)에 따라 (define x (lambda y y))과 동일합니다.

(lambda y y)은 절차입니다. 모든 인수가 호출되면 새로 할당 된 목록에 저장됩니다. 예 : list(define list (lambda xs xs))으로 정의 될 수 있습니다. (4.1.4 Procedures 형식 매개 변수의 두 번째 형식을 참조하십시오.)

그래서 (x 1 2 3)(list 1 2 3)과 같습니다.

+0

답변 해 주셔서 감사합니다. 의심의 여지가 있습니다. 왜'(lambda y) '가 무제한의 인수를 허용합니까? '(람다 (y) y)'와의 차이점은 무엇입니까? (단 하나의 인수 만 허용). 나는 r6rs 표준을 읽고있다. 그러나 나는 무엇인가 놓치고있다. 다시 감사합니다. – Aslan986

+1

'x라고 말할 때 무제한의 인수를 허용합니다. y' 또는'(lambda y y)'라고 지정하면 잘못된 목록이 정의됩니다. 따라서 그 맥락에서'y'는 하나의 요소 또는 전체 요소 목록을 참조 할 수 있습니다. 이 문맥에서 y는리스트 내의 단일 요소이기 때문에 이것은 (lambda (y) y)를 정의하는 것과는 다를 것이다. –

+1

'(lambda y y)'의 형식 매개 변수 부분은'y'이고'(lambda (y) y)'는'(y)'입니다. 무제한의 인수를 허용하는 프로 시저는 때로 유용하기 때문에 많은 프로그래밍 언어가이를 지원합니다. 리스프에는 가변 인수를 나타내는 많은 방법이있다. CL은 예를 들어 특수 기호 & 나머지를 사용합니다. 그리고 Scheme은 단점만을 사용합니다. 형식 매개 변수 부분은 쌍 (고정 부분, 빈 상태 일 가능성이 있음)의 체인이며 빈 목록으로 끝나거나 (더 이상 인수를 수락 할 수 없음) 기호로 끝납니다 (인수의 수를 제한하지 않음). – OwnWaterloo

관련 문제