Clojure에는 연속 / 코 루틴 / 등이 있습니까?


20

파이썬으로 프로그래밍을 시작했고 코 루틴과 클로저 같은 개념에 혼란 스러웠습니다.

이제 나는 그것들을 어떤 피상적 인 수준에서 알고 있다고 생각하지만, 그 "깨달음"순간을 결코 느끼지 못했기 때문에 Clojure를 배우기로 결정했습니다. 나는 스튜어트 할로 웨이 (Stuart Halloway)가이 책을 샀다. 그러나 그것은 색인을 보았을 때 코 루틴이나 연속과 같은 단어는 없었다. 나는 그들을 봤지만 아무것도 없다.

그래서 내 질문은 :

Clojure에 스택 오버플로없이 핑퐁과 같은 작업을 수행하기 위해 연속 또는 코 루틴이 있습니까?

Python 예제 (표준 Python은이 대칭 코 루틴의 모든 기능을 갖춘 버전을 지원하지 않지만) :

def ping():
  while 1:
   print "ping"
   function to switching to pong

def pong():
  while 1:
   function to switching to ping
   print "pong"

답변:


20

Clojure에는 call / cc가 없지만 어쨌든 무제한 연속을 원하지 않습니다 .

우리는 call/cc기본적으로 다른 언어를 라이브러리로 강등시키는 구현을위한 차별화 된 제어 작업으로 핵심 언어 기능으로 주장 합니다. 프리미티브 call/cc는 아래에 표시된 '나쁜'의 다양한 의미에서 잘못된 추상화 이며 전체 프로그램의 연속을 캡처하는 것은 실제로 유용하지 않습니다. 전체 연속을 효율적으로 캡처하기위한 노력에 대한 유일한 보상은 전체 연속을 캡처하는 데 더 많은 노력이 필요하다는 것입니다. 사용자와 구현 자 모두 잘 고려 된 상호 작용을 통해 다양한 일반도의 잘 선택된 제어 프리미티브 세트를 더 잘 제공합니다 ...

... call/cc다른 모든 제어 기능을 구현해야하는 핵심 제어 기능으로 제공 하는 것은 나쁜 생각입니다. 성능, 메모리 및 리소스 누수, 구현의 용이성, 사용의 용이성, 추론의 용이성 모두에 대해 논쟁 call/cc합니다. 프리미티브로 구현할 고유 한 제어 기능이 실제로 있고 다른 기능이 라이브러리로 강등되는 경우에는 그렇지 않습니다 call/cc.

David Nolen은 Clojure를 위해 구분 된 연속 라이브러리 를 작성했습니다 . 사용해보십시오!

말하다

Clojure 1.4.0 (및 1.3.0)을위한 구분 된 연속 라이브러리. Slava Akhmechet ( http://defmacro.org )의 cl-cont 기반 부분 ...


2

Clojure에는 핵심 기능으로 일류 연속체 또는 코 루틴이 내장되어 있지 않지만 직접 구현할 수 있습니다.

예를 들어 core.async 는 CSP (Concurrent Sequential Processes) 모델을 구현하는 Clojure 라이브러리입니다. go매크로를 사용 하여 코드를 상태 머신으로 변환합니다. 정확히 코 루틴 자체는 아니지만 동일한 패턴을 구현하는 데 사용할 수 있습니다.

이 또한 pulley.cps 매크로 컴파일러 나는 변환 (경유 것을 저술 한, cps/ cps-fn매크로)의 Clojure 코드가 계속 패싱 스타일로 직접 스타일로 작성. 내가 아는 한, 가장 완벽한 연속 테마 Clojure 프로그램입니다. 네이티브 바인딩 코드와 변환 된 코드 간을 역동적으로 호출하는 동적 바인딩, 예외를 지원합니다 (컨텍스트에서 연속성이 유지되지는 않음). 현재는 중단 적 연속 (즉, traditional call-cc) 만 지원되지만 앞으로는 한정된 연속을 구현할 계획이 있습니다.

pulley.cps는 자체적으로 코 루틴을 직접 제공하지는 않지만 직접 call-cc구현하는 것은 비교적 간단합니다. 실제로, 하나의 예는 협력적인 멀티 태스킹 의 간단한 구현입니다 . 이것은 CSP 예제 에서 추가로 작성되었습니다 . 거기에 또한 탁구 예,하지만 코 루틴에 비해 꼬리 호출 최적화 더 예입니다.

물론 이러한 종류의 변환은 전체 프로그램에 적용될 때 가장 효과적입니다. 불행히도 지역화 된 매크로만으로는 가능하지 않습니다. 여전히 현지화 된 변환조차도 매우 효과적 일 수 있습니다.


1

Clojure에 스택 오버플로없이 핑퐁과 같은 작업을 수행하기 위해 연속 또는 코 루틴이 있습니까?

오래된 질문이므로 당시에이 기능을 사용할 수 있었는지 확실하지 않지만 "핑퐁"기능을 구현하려는 사람은 트램폴린을 확인하십시오 !

방금 Clojure의 효율적인 Continuation-Passing Style에 대한 내 질문에 대한 답으로 발견했습니다. /programming/50952443/continuation-passing-style-does-not-seem-to-make-a -클로저 리의 차이 / 50955276 # 50955276 그리고 나는 그것이 직업이라고 생각합니다. 얼마 전에는 들었지만 완전히 조사한 적이 없습니다. 더 바보 야 다른 많은 제안 된 솔루션과 달리 작동합니다 .

====== PS. 온라인으로 많은 튜토리얼 정보를 볼 수 있습니다.] 여기에 유용한 정보가 있습니다.


1
어쩌면 linkify 트램 폴린은 문서를 가리 키도록?
esoterik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.