문제

이것은 관련이 있습니다 Call/CC 란 무엇입니까?, 그러나 나는 내 자신의 목적을 위해이 질문을 납치하고 싶지 않았으며, setjmp/longjmp에 대한 비유와 같은 주장 중 일부가 나를 피합니다.

나는 연속이 무엇인지에 대한 충분한 아이디어를 가지고 있다고 생각합니다. 나는 그것을 현재 콜 스택의 스냅 샷으로 생각합니다. 나는 이것이 흥미로운 이유 나 당신이 연속으로 할 수있는 일을 토론하고 싶지 않습니다. 내 질문은보다 구체적으로, 왜/CC를 호출하기 위해 함수 인수를 제공해야합니까? Call/CC가 현재 연속을 반환하지 않는 이유는 무엇입니까? 이 다른 질문의 링크에서 (http://community.schemewiki.org/?call-with-current-continuation-for-c-programmers)), 그것은 "본질적으로 당신에게 연속을 얻고 이후에 저장된 지점으로 돌아가는 길을 막을 수있는 깨끗한 방법 일뿐"에 대해 이야기하지만, 나는 그것을 얻지 못합니다. 불필요하게 복잡해 보입니다.

도움이 되었습니까?

해결책 4

Common So Netiquette에 대항하여 나는 내 자신의 질문에 대답하고 있지만 답변 제공 업체보다 편집자로서 더 많은 것입니다.

잠시 후 나는 비슷한 질문을 시작했다 LTU. 결국, 이들은 하루 종일 언어 디자인을 숙고하는 사람들입니다. 답변 마침내 나와 함께 쫓겨났다. 이제 여기에 언급 된 것, 예를 들어 Eli 또는 원래의 질문에서 나에게 훨씬 더 의미가 있습니다. 그것은 연속에 포함되는 것과 적용된 연속이 설정되는 곳에 관한 것입니다.

중 하나 포스터 LTU는 다음과 같이 썼습니다.

"Call/CC가"길을 벗어나게 할 수있는 방법을 정확히 알 수 있습니다. " , Call/CC는 계속해서 연속을 계속 사용하는 반면 Get/CC 또는 EM에는 계속 사용이 포함되어 있으므로 계속해서 (일반적으로) 연속 시작에 테스트를 추가해야합니다 (즉, GET 직후에 테스트를 추가해야합니다. / cc / em) "연속 부품 사용"을 "나머지 연속"부품에서 분리하려면 ".

그것은 나를 위해 집으로 몰려 갔다.

어쨌든 감사합니다!

다른 팁

Jay Shows와 같은 구조물을 사용하는 경우 연속을 잡을 수 있지만 어떤 방식 으로든, 이미 그 연속 내부에 있기 때문에 이미 잡힌 가치는 이미 망쳐졌습니다. 대조적으로, call/cc 연속을 잡는 데 사용될 수 있습니다 아직 현재 표현식 외부에서 보류 중입니다. 예를 들어, 연속의 가장 간단한 용도 중 하나는 일종의 abort:

(call/cc (lambda (abort)
           (+ 1 2 (abort 9))))

설명하는 작업으로는 그렇게 할 수 없습니다. 시도하면 :

(define (get-cc) (call/cc values))
(let ([abort (get-cc)]) (+ 1 2 (abort 9)))

그런 다음 적용에 대한 오류가 발생합니다 9 절차로. 이런 일이 발생합니다 abort 다시 점프합니다 let 새로운 가치와 함께 9 - 이는 이제 동일한 추가 표현의 두 번째 라운드를하고 있음을 의미합니다. abort 묶여 있습니다 9...

두 가지 추가 관련 노트 :

  1. 연속에 대한 실질적인 소개를 보려면 참조하십시오. plai.
  2. call/cc ~이다 기능이 필요하다는 점에서 약간 복잡합니다. 개념적으로 사용하기 쉬운 구성은 다음과 같습니다. let/cc PLT 체계와 같은 일부 구현에서 찾을 수 있습니다. 위의 예가됩니다 (let/cc abort (+ 1 2 (abort 9))).

그것은 덜 다재다능합니다. 그 행동을 원한다면 그냥 할 수 있습니다.

(call/cc (lambda (x) x))

"Darrell Ferguson and Dwight Deugo"의 연속 예제 예제를 살펴볼 수 있습니다. "현재 연속 패턴과 함께 전화하십시오". 프로그램의 패턴 언어에 관한 8 차 회의. 2001 년 9 월. " (http://library.readscheme.org/page6.html) 그리고 위와 같이 정의 된 Call/CC-Return을 사용하여 다시 작성하십시오.

나는 스스로에게 물어 보면서 시작하는 것이 좋습니다 : 일류 연속이라는 것은 무엇을 의미합니까?

표현식의 연속은 본질적으로 두 가지 데이터로 구성됩니다. 첫째, 그 표현의 폐쇄 (즉, 환경); 둘째, 표현의 결과로 수행해야 할 일의 표현. 그러므로 일류 연속이있는 언어는 이러한 부분을 캡슐화하는 데이터 구조를 가지고 있으며 이러한 데이터 구조를 다른 구조와 마찬가지로 처리하는 언어입니다.

Call/CC는이 아이디어를 실현하는 특히 우아한 방법입니다. 현재 연속은 표현식에 적용될 때 절차가 수행하는 것과 같이 표현과 함께 일대일을 캡슐화하는 절차로 포장됩니다. 이러한 방식으로 연속을 나타내는 것은 단순히이 절차의 폐쇄에 호출 된 사이트의 환경이 포함되어 있음을 의미합니다.

당신은 다른 방식으로 일류 지속에 대한 아이디어를 실현하는 것을 상상할 수 있습니다. 그들은 전화/CC가 아니며, 그러한 표현이 얼마나 간단 할 수 있는지 상상하기가 어렵습니다.

이별 노트에서, Eli가 언급 한 LET/CC의 구현을 고려하십시오.

(define-syntax bind/cc
    (syntax-rules ()
        ((bind/cc var . body)
             (call/cc (lambda (var) . body)))))

그리고 운동으로 BIND/CC를 기반으로 Call/CC를 어떻게 구현 하시겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top