콜-와이-와이-와이-와이-와이-와이-
call-with-current-continuation
Schemcomputer 프로그래밍 언어에서 procedure-with-current-continuation, 축약된 call/cc는 제어 흐름 연산자로 사용된다.그것은 몇몇 다른 프로그래밍 언어들에 의해 채택되었다.
함수를 취함f유일한 주장으로서(call/cc f)표현 내에서 표현식의 현재 지속에 적용된다.예를 들어,((call/cc f) e2)적용하는 것과 같다.f그 표현의 현재에 이르기까지.현재 계속은 교체에 의해 주어진다.(call/cc f)변수에 의하여c람다 추상화에 구속되어 있어, 현재의 계속은(lambda (c) (c e2)). 기능 적용f그것에 최종적인 결과를 준다.(f (lambda (c) (c e2))).
보완적인 예로서, 표현에서(e1 (call/cc f)), 하위 시스템에 대한 연속(call/cc f)이다(lambda (c) (e1 c)), 따라서 전체 표현은 다음과 같다.(f (lambda (c) (e1 c))). 즉, 프로그램의 현재 제어 컨텍스트 또는 제어 상태를 개체로 "스냅샷"하여 적용f그것에게. 연속 객체는 1등급 값이며 함수로 표현되며, 함수 적용은 유일한 연산이다.논쟁에 연속 객체를 적용할 때, 기존의 연속성이 제거되고 그 자리에 적용된 연속성이 복원되므로, 연속성이 포착된 지점에서 프로그램 흐름이 계속되어 연속성의 주장이 호출/cc 호출의 "반환 값"이 된다.통화/cc로 생성된 연속은 두 번 이상, 심지어 통화/cc 애플리케이션의 동적 범위 밖에서도 호출할 수 있다.
컴퓨터 과학에서는 이러한 유형의 암묵적 프로그램 상태를 개체로 보이게 하는 것을 재화라고 부른다.(Scheme은 연속이나 기능을 적용하는 것을 구문론적으로 구분하지 않는다.)
콜/cc를 통해 매카시 코드(예: 매카시 코드)를 통해 다른 언어에서 다양한 복합 제어 연산자를 구현할 수 있다.amb 비결정론적 선택, 프롤로그 스타일 역추적, 시뮬라 67 스타일 코루틴 및 그 일반화, 아이콘 스타일 생성기, 엔진 및 스레드 또는 불명확한 COMEFROM[citation needed].
예
다음 예에서 알 수 있듯이, call/cc를 사용하여 C-style 언어로 알려진 반환문의 기능을 에뮬레이트할 수 있으며, 이는 Scheme에서 누락된 것이다.
(정의를 내리다(f 돌아오다) (돌아오다 2) 3) (전시하다(f (람다(x) x))) ; 표시 3 (전시하다(콜-와이-와이-와이-와이-와이-와이-f)) ; 표시 2 정규 함수 인수로 f를 호출하면 먼저 이 함수를 값 2에 적용한 다음 3을 반환한다.그러나 (예의 마지막 줄에서처럼) f가 call/cc에 전달되면 파라미터(연속)를 2개 적용하면 프로그램 실행이 호출/cc가 호출된 지점으로 점프하고, call/cc가 값 2를 반환하게 된다.그 다음 디스플레이 기능에 의해 인쇄된다.
다음 예에서, 콜/cc는 두 번 사용된다. 첫 번째 예에서처럼 "반환" 연속성을 생성하기 위해 한 번, 그리고 항목 목록을 통해 반복을 일시 중단하기 위해 한 번:
;; [LISTOF X] -> ( -> X u '너-너-너-오프-더-엔드) (정의를 내리다(한 번에 하나씩 생성하다 lst) ;;; 두 내부 기능은 모두 lst를 통한 폐쇄임 ;;; 목록의 현재 요소를 통과하는 내부 변수/기능 ;; 반환 인수(계속) 또는 목록 끝 마커를 통과함 ;;; 더 이상 요소가 남아 있지 않은 경우.각 단계에서 함수 이름은 ;;; 기능 본체를 다시 가리키는 연속으로 리바운드, ;;반복은 발신자가 지정한 계속으로 되돌아간다. (정의를 내리다(통제국 돌아오다) (각각을 위한 (람다(요소) (세트!돌아오다 (콜-와이-와이-와이-와이-와이-와이- (람다(여기서 재개하다.) ;;; 현재 진행 상태를 파악하십시오. (세트!통제국 여기서 재개하다.) (돌아오다 요소))))) ;;; (반환 요소) 다음 반환으로 평가 lst) (돌아오다 '너-너-오프-더-엔드')) ;; (-) X u 'you-fell-off-the-end) ;; 이것은 a-list에서 한 번에 한 품목을 생산하는 실제 발전기 입니다. (정의를 내리다(발전기) (콜-와이-와이-와이-와이-와이-와이-통제국)) ;;; 제너레이터 반환 발전기) (정의를 내리다숫자를 생성하다. (한 번에 하나씩 생성하다 '(0 1 2))) (숫자를 생성하다.) ;; 0 (숫자를 생성하다.) ;; 1 (숫자를 생성하다.) ;; 2 (숫자를 생성하다.) ;; 너-너-너-오프-더-엔드 루프가 목록에서 다른 항목을 처리하려고 할 때마다 함수는 현재 계속을 잡아 변수 '제어 상태'에 할당한다.이 변수는 처음에 목록의 모든 요소를 통해 반복되는 닫힘이다.연산이 진행되면서 주어진 리스트의 접미사를 통해 반복되는 폐쇄가 된다.「콜/cc」의 사용은, 「선형 수집」에 대해서는, 「call/cc」의 사용이 불필요하지만, 「call/cc」의 사용은,[LISTOF X]코드는 통과할 수 있는 모든 컬렉션으로 일반화된다.
통화-전류-연속은 다른 정교한 원시 요소도 표현할 수 있다.예를 들어, 다음 샘플은 연속성을 사용하여 공동 다중 작업을 수행한다.
;;Call-with-current-계속(continuation)을 사용한 공동 다중 작업 ;; 25줄의 계략으로 ;;; 실행 대기 중인 스레드 목록.이것은 하나의 목록이다. ;; 인수 비합병 함수(대부분의 경우) ;; 계속은 (퇴장)과 마찬가지로 되돌리지 않는 기능이다. ;;; 그 점에서 그것은 그것을 부르는 어떤 것에도 지배력을 포기하지 않는다. (정의를 내리다레디리스트 '()) ;;; 되돌리지 않는 기능.다른 실이 있으면 ;; 실행될 때까지 기다리면 다음 스레드가 실행될 수 있음 ;;; 달리기에 좌석이 있는 경우, 원래 출구를 호출한다. ;; 전체 환경을 빠져나가는 것. (정의를 내리다퇴장하다 ;;;; 우리가 무시하는 원래 출구. (하게 하다((퇴장하다 퇴장하다)) ;;; 재정의 함수. (람다() (만일(아닌(무효가 되십니까?레디리스트)) ;;; 다른 실이 실행되기를 기다리고 있다. ;;; 그래서 우리는 그것을 실행한다. (하게 하다((결부시키다 (자동차레디리스트))) (세트!레디리스트 (cdr레디리스트)) ;;; ready list는 반환되지 않을 뿐이므로 ;; 기능, 이것은 되돌아오지 않는다. (결부시키다 #f)) ;;; 달리기에 남은 것은 아무것도 없다. ;;;; 원래의 (퇴장)은 반환되지 않는 함수, ;;; 즉, 이것은 비파생 함수다. (퇴장하다))))) ;; 주어진 인수의 함수 하나를 취함 ;;; 논쟁과 포기는 그것을 포기한다.포크 기능의 새로운 기능 ;;; 기능이 종료되면 스레드가 종료된다. (정의를 내리다(포크를 갈다 fn 아그) (세트!레디리스트 (덧셈을레디리스트 ;;; 이 기능이 에 추가됨 ;;; ready-list는 non-lights, ;;; 출구는 되돌아오지 않기 때문에. (리스트를 작성하다 (람다(x) (fn 아그) (퇴장하다)))))) ;;; 실행 대기 중인 다음 스레드에 대한 제어를 포기한다. ;; 비록 그것이 결국 돌아올 것이지만, 그것은 통제력을 포기한다. ;;; 그리고 계속이 호출될 때만 그것을 되찾을 것이다. (정의를 내리다(양보하다) (콜-와이-와이-와이-와이-와이-와이- ;; 이 호출을 나타내는 연속성을 포착하십시오. (람다(결부시키다) ;;; 준비 목록에 추가 (세트!레디리스트 (덧셈을레디리스트 (리스트를 작성하다결부시키다))) ;;; 다음 스레드를 가져와 실행을 시작하십시오. (하게 하다((결부시키다 (자동차레디리스트))) (세트!레디리스트 (cdr레디리스트)) ;;; 실행하라. (결부시키다 #f))))) 1999년 데이비드 마도어(운람바 프로그래밍 언어의 발명자)는 실수로 12자로 된 운람다 용어를 발견했는데, 이 용어는 콜/cc를 사용하여 모든 자연 숫자를 단수로 순차적으로 인쇄했다.``r`ci`.*`ci.[1] 이 프로그램과 그 효과를 둘러싼 명백한 미스터리는 어느 정도 관심을 끌었고, 흔히 음양 퍼즐로 알려져 있다.[2]마도어가 제공하는 체계 번역은 다음과 같다.
(let*((음양의 ((람다(참조하다) (전시하다#\@) 참조하다) (콜-와이-와이-와이-와이-와이-와이-(람다(c) c)))) (양 ((람다(참조하다) (전시하다#\*) 참조하다) (콜-와이-와이-와이-와이-와이-와이-(람다(c) c))))) (음양의 양)) 비판
OCAMl에 대한 구분된 연속 구현의 저자, 제어 운영자를 구현하기 위한 구분된 스택 조작을 위한 API(응용 프로그램 프로그래밍 인터페이스)의 설계자인 Oleg Kiseyov는 "핵심 제어 계통으로서의 통화/cc를 해제하는 전체 스택 연속성 대신 구분된 연속성 사용을 옹호한다.다른 모든 제어 설비를 구현해야 한다는 관점에서 볼 때 잘못된 생각이 드러난다.성능, 메모리 및 리소스 유출, 구현 용이성, 사용 용이성, 추론 용이성 모두 통화/cc에 반대한다."[3]
비건설 논리와의 관계
The Curry–Howard correspondence between proofs and programs relates call/cc to Peirce's law, which extends intuitionistic logic to non-constructive, classical logic: ((α → β) → α) → α. Here, ((α → β) → α) is the type of the function f, which can either return a value of type α directly or apply an argument to the continuation of type (α → β).계속을 적용할 때 기존의 컨텍스트가 삭제되기 때문에, 타입 β는 절대 사용되지 않으며 빈 타입인 ⊥으로 취할 수도 있다.
이중 부정 제거(α → α) → α의 원리는 그 주장 f가 정상적으로 값을 반환하지 않고 항상 현재 지속성을 평가하기를 기대하는 콜-cc의 변종과 비교된다.고전적 논리를 직감적 논리에 내장하는 것은 패스 스타일 번역을 계속하는 것과 관련이 있다.[4]
통화/cc를 구현하는 언어
참고 항목
참조
- ^ 데이비드 마도어, "call/cc mind-boggler"
- ^ 인왕 "인양 퍼즐 이해"
- ^ "An argument against call/cc".
- ^ Sørensen, Morten Heine; Urzyczyn, Paweł (2007). "Classical Logic and Control Operators". Lectures on the Curry-Howard isomorphism (1st ed.). Boston, MA: Elsevier. ISBN 978-0444520777.
- ^ "The CONT signature". Standard ML of New Jersey. Bell Labs, Lucent Technologies. 1997-10-28. Retrieved 2019-05-15.
- ^ "Class: Continuation". Ruby-doc.org. Neurogami, James Britt. Retrieved 2019-05-15.
- ^ Kowalke, Oliver (2014). "Context switching with call/cc". Boost.org. Retrieved 2019-05-15.
- ^ "R: Call with Current Continuation".