문제

리치 히키(Rich Hickey)가 다음과 같이 말한 곳을 읽었습니다.

"이론적으로 연속이 깔끔하지만 실제로는 아니라고 생각합니다."

나는 클로저에 익숙하지 않다.
1.클로저에는 계속이 있습니까?
2.그렇지 않다면 계속이 필요하지 않습니까?특히 좋은 사례를 많이 봤습니다. 이 남자.대안은 무엇입니까?
삼.그렇다면 문서가 있습니까?

도움이 되었습니까?

해결책

연속에 대해 이야기 할 때는 두 가지 다른 종류를 구별해야합니다.

  • 일류 지속-언어 (체계 또는 루비)에 깊이 통합 된 연속 지원. Clojure는 일류 연속을 지원하지 않습니다.

  • CPS (Continuation-Passing Style)-CPS는 단지 코딩 스타일 일 뿐이며 익명 기능을 지원하는 모든 언어는이 스타일 (Clojure에도 적용)을 허용합니다.

예 :

-- Standard function
double :: Int -> Int
double x = 2 * x

-- CPS-function – We pass the continuation explicitly
doubleCPS :: Int -> (Int -> res) -> res
doubleCPS x cont = cont (2 * x)
; Call
print (double 2)

; Call CPS: Continue execution with specified anonymous function
double 2 (\res -> print res)

읽다 계속 Wikipedia에서.

나는 좋은 언어에 계속 연속이 필요하다고 생각하지 않지만 특히 Haskell과 같은 기능적 언어의 일류 연속 및 CPS는 매우 유용 할 수 있습니다 (지능형 역 추적 예).

다른 팁

CL-Cont의 Clojure 포트를 작성하여 Common LISP에 연속이 추가되었습니다.

https://github.com/swannodette/delimc

연속은 언어로 필요한 기능입니까?

아니요. 많은 언어에는 연속이 없습니다.

그렇지 않으면 연속이 필요하지 않습니까? 나는 특히이 남자로부터 많은 좋은 예를 보았습니다. 대안은 무엇입니까?

통화 스택

추상 연속

연속은 제어 흐름 의미를 설명하는 데 사용되는 추상 개념입니다.이런 의미에서 숫자는 둘 다 존재하고 존재하지 않습니다(추상적이라는 점을 기억하세요). 숫자가 둘 다 존재(추상적 개체로)되고 (유형의 실체로서) 존재하지 않습니다.

연속은 함수 호출/반환, 예외 처리, 심지어 goto와 같은 제어 효과를 설명합니다.잘 정립된 언어는 무엇보다도 연속(예: 예외)을 기반으로 하는 추상화로 설계됩니다.(즉, 기반이 탄탄한 언어는 연속성을 염두에 두고 설계된 제어 연산자로 구성됩니다.물론 언어가 연속을 다음과 같이 노출하는 것은 완벽하게 합리적입니다. 오직 추상화를 제어하여 사용자가 그 위에 자신만의 추상화를 구축할 수 있도록 합니다.)

퍼스트 클래스 계속

계속되는 개념이라면 구체화된 언어의 일류 개체로서 우리는 모든 종류의 제어 효과를 구축할 수 있는 도구를 갖게 됩니다.예를 들어, 언어에 일류 연속이 있지만 예외가 없는 경우 연속 위에 예외를 구성할 수 있습니다.

일류 연속의 문제

일류 연속은 많은 경우에 강력하고 유용한 도구이지만 이를 언어로 노출하는 데에는 몇 가지 단점도 있습니다.

  • 연속 위에 구축된 다양한 추상화는 구성 시 예상치 못한/비직관적인 동작을 초래할 수 있습니다.예를 들어, finally 계산을 중단하기 위해 연속을 사용하면 블록을 건너뛸 수 있습니다.
  • 현재 연속을 언제든지 요청할 수 있는 경우 언어 런타임은 언제든지 현재 연속의 일부 데이터 구조 표현을 생성할 수 있도록 구조화되어야 합니다.이는 좋든 나쁘든 종종 "이국적"이라고 간주되는 기능의 런타임에 어느 정도 부담을 줍니다.언어가 호스팅되는 경우(예: Clojure가 JVM에서 호스팅되는 경우) 해당 표현은 호스팅 플랫폼에서 제공하는 프레임워크 내에 적합할 수 있어야 합니다.솔루션 공간을 제한하는 언어가 유지하고 싶은 다른 기능(예: C interop)이 있을 수도 있습니다.이와 같은 문제는 "임피던스 불일치"의 가능성을 높이고 성능 솔루션의 개발을 심각하게 복잡하게 만들 수 있습니다.

언어에 일류 연속 추가하기

메타프로그래밍을 통해 언어에 최고 수준의 연속성에 대한 지원을 추가하는 것이 가능합니다.일반적으로 이 접근 방식에는 코드를 CPS(연속 전달 스타일)로 변환하는 작업이 포함됩니다. 이 방식에서는 현재 연속이 각 함수에 대한 명시적 인수로 전달됩니다.

예를 들어 데이비드 놀렌(David Nolen)의 delimc 라이브러리는 일련의 매크로 변환을 통해 Clojure 프로그램 부분의 구분된 연속을 구현합니다.비슷한 맥락으로 나는 글을 썼다. 풀리.cps, 는 더 많은 핵심 Clojure 기능(예: 예외 처리)을 지원하고 기본 Clojure 코드와의 상호 운용성을 지원하는 런타임 라이브러리와 함께 코드를 CPS로 변환하는 매크로 컴파일러입니다.

이 접근 방식의 한 가지 문제는 네이티브(Clojure) 코드와 변환된(CPS) 코드 간의 경계를 처리하는 방법입니다.특히, 네이티브 코드의 연속을 캡처할 수 없으므로 기본 언어와의 상호 운용성을 허용하지 않거나 제한하거나 컨텍스트에서 실제로 캡처하려는 연속을 허용하도록 사용자에게 부담을 주어야 합니다. 체포되다.

pulley.cps는 후자를 지향하는 경향이 있지만 사용자가 이를 관리할 수 있도록 하는 몇 가지 시도가 있었습니다.예를 들어 CPS 코드가 네이티브 코드를 호출하는 것을 허용하지 않을 수 있습니다.또한 기존 기본 기능의 CPS 버전을 제공하는 메커니즘도 제공됩니다.

Haskell과 같은 충분히 강력한 유형 시스템을 갖춘 언어에서는 기능적으로 순수한 코드에서 제어 작업(즉, 연속)을 사용할 수 있는 계산을 캡슐화하기 위해 유형 시스템을 사용하는 것이 가능합니다.

요약

이제 귀하의 세 가지 질문에 직접 답변하는 데 필요한 정보가 있습니다.

  1. Clojure는 실용적인 고려 사항으로 인해 최고 수준의 연속성을 지원하지 않습니다.
  2. 모든 언어는 이론적 의미에서 연속을 기반으로 구축되었지만 연속을 일급 객체로 노출하는 언어는 거의 없습니다.그러나 CPS로의 변환 등을 통해 모든 언어에 연속성을 추가하는 것이 가능합니다.
  3. 다음에 대한 설명서를 확인하세요. delimc 및/또는 풀리.cps.

연속화의 일반적인 사용은 다음과 같은 제어 구조를 구현하는 것입니다. 함수에서 돌아 오기, 루프, 예외 처리 등 대부분의 언어 (Java, C ++ 등)는 이러한 기능을 핵심 언어의 일부로 제공합니다. 일부 언어는 그렇지 않습니다 (예 : 체계). 대신,이 언어는 연속성을 일류 개체로 노출시키고 프로그래머가 새로운 제어 구조를 정의하게합니다. 따라서 체계는 그 자체로 완전한 언어가 아니라 프로그래밍 언어 툴킷으로 간주되어야합니다.

Clojure에서는 거의 모든 제어 구조가 언어/VM 조합에 의해 제공되므로 연속화를 직접 사용할 필요가 거의 없습니다. 그럼에도 불구하고 일등석 연속은 유능한 프로그래머의 손에 강력한 도구가 될 수 있습니다. 특히 체계에서, 연속은 다른 언어 (C의 setjmp/longjmp 쌍과 같은)의 동등한 상대보다 낫다. 이것 기사에 이에 대한 자세한 내용이 있습니다.

BTW, Rich Hickey가 지속성에 대한 그의 의견을 어떻게 정당화하는지 아는 것은 흥미로울 것입니다. 그것에 대한 링크가 있습니까?

clojure (또는 오히려 clojure.contrib.monads) 연속 모나드가 있습니다. 다음은 사용법과 동기를 설명하는 기사입니다..

글쎄 ... Clojure 's -> 당신이 후에 무엇을 구현하지만 ... 대신 매크로로

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