2016-07-10 5 views
1

최근에 ChickenScheme을 사용하기 시작했는데 이제는 기본 인수 (지정되지 않은 경우)가있는 함수를 선언하고 싶습니다. 나는 Racket 사이트에서이 예제를 발견했습니다. Racket과 ChickenScheme이 다르다는 것을 알고 있습니다 만, 나는이 기본적인 것들이 같다고 생각했습니다.구성표 람다 함수의 기본 인수는 무엇입니까?

Error: during expansion of (lambda ...) - in `lambda' - lambda-list expected: (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)) 

Call history: 

<syntax>  (define greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))) 
<syntax>  (##core#set! greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))) 
<syntax>  (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)) <-- 

답변

5

일반 제도에서 추가 인수 목록을 얻기 위해 dotted tail notation를 사용하고이 목록을 검사 할 수 있습니다 여분의 인수가 제공되었는지 여부를 확인합니다 :

(define greet 
    (lambda (given . rest) 
    (let ((surname (if (pair? rest) (car rest) "Smith"))) 
     (string-append "Hello, " given " " surname)))) 

매우 편리하지 않으므로 다른 체계 체계가 이에 대한 다른 대안을 제시합니다. 이 작업을 수행 할 수 있습니다 CHICKEN, 우리는 DSSSL annotations을 지원

(define greet 
    (lambda (given #!optional (surname "Smith")) 
    (string-append "Hello, " given " " surname))) 
3

라켓에 optional arguments의 구문은 표준이 아닌 사실, 그래서 다른 통역을 구현하는 기대하지 않는다 :

(define greet 
    (lambda (given [surname "Smith"]) 
    (string-append "Hello, " given " " surname))) 

이것은 ChickenScheme 인터프리터에서 오류가 발생합니다. Scheme에서 표준 기능은 RxRS Scheme 보고서에 정의 된 기능이며 R7RS은 최신 버전입니다. 그러나 두려워 말라 - 치킨 계획에, 당신은 optional를 사용할 수 있습니다

[syntax] (optional ARGS DEFAULT)

를 사용하여 하나의 선택적 인수를 취할 절차는이 양식을. ARGS가 빈 목록 인 경우 DEFAULT가 계산되어 반환되고 그렇지 않으면 목록 ARGS의 첫 번째 요소가 반환됩니다. ARGS에 둘 이상의 값이 포함되어 있으면 오류입니다. 이 같은

사용을 :

(define (greet given . surname) 
    (string-append "Hello, " given " " (optional surname "Smith"))) 
+0

그것의 RnRS에 지정되지 않는 의미에서 "표준"하지만 [SRFI 89] (HTTP와 실제로 호환되지 : // srfi. schemers.org/srfi-89/srfi-89.html), 내 취향에 맞는 표준이며, 선택적 인수에 대한 Guile의 스타일 (선택적 인수에 대한 DSSSL의 구문을 부분적으로 기반으로하며, sjamaan의 답변에서 언급했듯이). –