2009-03-19 3 views
9

나는 구성표 통역을 작성하고있어의 경우의 경우 같은 문 : 내가 해봤 모든 통역사는 단지 새로운 프롬프트를 반환Scheme의 함수에서 아무것도 반환 할 수 없습니까?

(if (< 1 0) 'true) 

. 그러나 이것을 코딩 할 때 대체 표현이 있는지에 대한 if가있었습니다. if에서 아무것도 반환하지 않아도되는 것은 무엇입니까?

(if (has-alternative if-expr) 
    (eval (alternative if-expr)) 
    #f) ;; what do I return here? 

답변

10

R6RS specification에 따르면

하면 < 대체> 는 다음 지정없이 #F 및 < 테스트> 수율 표현식의 결과는 지정되지 않았습니다.

그래서 야생 가서 당신이 원하는 무엇이든을 반환! #f 또는 '()는 내가 개인적으로 기대하는 것이기는하지만.

+1

R5RS에서도 마찬가지입니다. –

+1

나는 (만약 '() ...)이 #t 브랜치를 줄 것이므로 (null로 테스트해야만 하는가?) #f를 선호한다. – Jyaan

1

첫 번째로, else 절이 있으면 쉽게 작성하도록 요구할 수 있습니다. 둘째, Scheme은 함수에서 여러 값을 반환하는 것을 지원하므로 반환 값을 목록으로 구현하려는 경우 반환 값이 제공되지 않은 빈 목록을 가질 수 있습니다.

중요한 차이점은 다음과 같습니다. else 절이 없으면 빈 목록을 반환하지 않습니다. 빈 목록은 반환 값이 없음을 나타냅니다. 표현식에서 하나의 반환 값 (3이라고 가정)이 있으면 장면 뒤에있는 평가에서 반환 값으로 사용할 수 있습니다 (3). 마찬가지로 표현식에서 여러 값을 반환하면 eval 반환 목록에 여러 요소가 생깁니다. 조건이 실패하고 아무것도 반환하지 않는 함수의 값을 포착하려고 시도하는 프로그램에 오류가있을 것이기 때문에, 어떤 다른 존재하지 않는 경우는

마지막으로, 모든 실용성에, 당신은 정말 아무것도를 반환 할 수 . 따라서이 오류를 포착하는 것은 언어가 아닌 프로그래머의 임무입니다.

0

은 어떤 문제가 :

(if (has-alternative if-expr) (eval (alternative if-expr))) 

?

+0

그래서 이것은 스킴 인터프리터의 언어가 무엇이든 기본값으로 설정됩니까? R6RS와 호환되지 않는 Scheme 위에 R6RS 호환 체계를 구현하려고하지 않는 한 아무 잘못은 없습니다. - P –

2

구성표의 번호 (PLT는, 이카루스, 닭)를 사용하면 (무효)로 생성 할 수있는 공공 형을 가지고있다. PLT에서

적어도 무효 당신이 (때 (< 1 0) #T를) 할 때 당신이 얻을 것입니다.

(PLT의 V4는 경우 다른 절없이 허용하지 않습니다.)

8

방식은 실제로 어떤 값을 반환 할 수

> (values) 

R5RS 지정된 경우의 외팔 형태 불특정 값을 반환. 즉, 반환 할 값을 결정하는 것은 귀하에게 달려 있음을 의미합니다. 꽤 많은 구성표라는 특정 값 "지정되지 않은 값"을 소개하기 위해 선택하고 값을 반환했다. 다른 사람은 "눈에 보이지 않는 가치"# < 무효를 리턴>과 REPL은 은 그것을 인쇄되지 않는 기록됩니다.

> (length (list (void))) 
    1 

    > (length (list (values))) 
    error> context expected 1 value, received 0 values 
    (Here (list ...) expected 1 value, but received nothing) 

이 # < 경우 무효가> 목록의 일부는,이 인쇄되어 있습니다 : 첫 번째는 생각에서

> (void) 

,이 (값), 하지만 차이를 유의과 동일합니다 :

> (list (void)) 
    (#<void>) 
2

반환 값이 지정되지 않은 경우 원하는 것을 반환 할 수 있습니다. 사용자는 그 가치가 그곳에, 언제 어디서나, 또는 구현에 의존 할 수는 없습니다.

1

이상한 사람들은 'nil 또는 '|| (빈 기호)을 반환합니다. 문제는 혼동을 피하기 위해 (eval (alternative if-expr))으로 반환 할 수없는 기호를 반환하는 것입니다.

아무것도 (eval (alternative if-expr))에 의해 반환 될 수 있으며, 당신은 여전히 ​​당신이 다른 여부에 와서 여부를 알고 싶은 경우에, 당신이 더 많은 정보와 결과 포장해야 : 따라서

(if (has-alternative if-expr) 
    (cons #t (eval (alternative if-expr))) 
    (cons #f #f)) 

을, 결과는 단점입니다 세포. 차가 #t라면, 당신은 뭔가를 평가했다. #f 인 경우 그렇지 않습니다.