2012-07-05 5 views
5

는 다음과 같은 코드를 생각해연속성이 유용한 이유가없는 이유는 무엇입니까?

(call-with-values 
    (lambda() 
     (call/cc (lambda (k) 
     (k k k)))) 
    (lambda (x y) 
    (procedure-arity y))) 

을 그것은, 반환 값 call/cc 호출의 시점에서 계속이 오른쪽에있는 람다, 그래서 그 인수에 대응 그러나 2를해야한다고 여기 꽤 명백하다 대신 위의 (라켓에서) (arity-at-least 0)입니다.

실제로 Guile (을 procedure-arity으로 대체)에서 비슷한 코드를 실행하면이 연속이 꽤 많은 논증을 허용한다는 것을 알 수 있습니다.

그래서, 왜 그런가요? 내가 이해하는 한 (내 이해가 틀렸다면 수정하십시오), 연속성은 매우 간단합니다 : call-with-values의 컨텍스트를 제외하고는 1입니다.이 경우 오른쪽 람다의 속성이 무엇이든 상관 없습니다. (이 있다면 어떤이, 부여, 복잡 할 수있는 case-lambda 등,하지만 당신이 직접 (procedure-arity (case-lambda ...))를 호출 할 때보 다 더 복잡합니다.)

+0

IMO, 그것은 인수의 수는 있어야한다. 나는 spec (R5/6)에서'values'의 정의가 이것을 잘 정리했다고 생각합니다. – leppie

+0

나는'values'가 연속체가 임의의 속성을 가지고 있음을 암시하는 방법을 잘 모르겠습니다. 연속성이 지원하는 값과 다른 수의 값을 반환 할 수 없습니다. :-) 따라서'(+ (values ​​1 2 3) 42)'는 유효하지 않다.이 문맥에서 (R5RS에서 정의 된 'values'로 가정하면) 이렇게 생성 된 연속체는 1, 다른 것은 없다. –

+1

또한'call-with-values'와 함께, * consumer *는 * producer *가 아닌 arity를 ​​결정합니다. – leppie

답변

2

같은를 볼 수있는 간단한 방법은 다음과 같습니다

(call-with-values 
    (lambda() (error 'arity "~v" (procedure-arity (call/cc (λ (k) k))))) 
    (lambda (x y) (procedure-arity y))) 

및 더 간단 :

(procedure-arity (call/cc (λ (x) x))) 

그리고 당신의 질문에 대한

- 그것은 계속 두 개의 입력을 기대하는 첫 번째 경우에 분명하지만, 그런 경우가 너무 일반적인하지 않습니다. 예를 들어, 실제 코드는 define-values을 사용하거나 알려지지 않은 연속성을 가지며, call/cc이 만드는 연속체는 생성 된 컨텍스트에 따라 다른 요소를 가질 수 있습니다. 이것은 연속성의 진실성이 알려진 이러한 드문 경우를 파악하는 데 많은 노력을 기울이지 않는다는 것을 의미합니다.

각주 : 명시 적 지속은 전화/CC로 만들 때 계속 실제로 호출 될 때까지, 상황을 알 수로

;; nonsensical, but shows the point 
(define (foo) (call/cc (λ (x) x))) 
(define x (foo)) 
(define-values [y z] (foo)) 
+0

잠깐, 그 말의 포로가 된 시점에서 그 연속체의 정체성이 알려지지 않았다고 말하는 것입니까? 어쩌면 나는 이것에 대해 충분히 열심히 생각하지 않을 것입니다. –

+0

예, 각주 참조. 이 연속체들 각각이 동적으로 다른 상태를 갖기를 원하지 않는 한 ... (하지만 지금 실행해야하므로 지금은 이것에 더 많은 시간을 할애 할 수 없습니다.) –

+0

동적 인 접근법은 실제로 내가 질문했을 때 마음 속에 가지고 있었던 것이 었습니다 , 그러나 그것은 아마도 실행 가능하지 않습니다. 이 방법이 효과가 있는지 확인하기 위해 개념 증명 (proof-of-concept)을 만들어야합니다. 한편, 큰 녹색 진드기가. 내말은, 당신은 2 달을 기다렸습니다. :-) –