2011-11-08 10 views
1

パズルは、次のとおりです。asyncを使用してC#5.0で陰陽パズルを実装することは可能ですか?次のようにSchemeで実装さ

(let* ((yin 
    ((lambda (cc) (display #\@) cc) (call-with-current-continuation (lambda (c) c)))) 
    (yang 
    ((lambda (cc) (display #\*) cc) (call-with-current-continuation (lambda (c) c))))) 
(yin yang)) 

パズルの目標は、うまくこのコードの出力を理解することです。

C#5.0の新しい非同期CPS機能を使用して同じセマンティクスでコードを実装できるかどうかは疑問です。

私が困っている部分は、コール/ ccのようにlet *のセマンティクスに依存しているということです。私はC#でこの相互作用を正しく表現する方法がわかりません。

+1

私はSchemeをまだ読むことができません。パズルの別の実装を(擬似で)教えてもらえますか? – Polity

+0

この質問に対する私の答えはおそらくかなり役立ちます。 http://stackoverflow.com/questions/4070237/how-could-the-new-async-feature-in-c-sharp-5-0-be-implemented-with-call-cc –

答えて

1

CPSは完全にコール/ ccを取り除くことができるので、C#で手作業でCPSを実装することは間違いありません。 C#の自動CPSについて何も知らないので、その機能が自動的にこれを行うかどうかは言えません。しかし、名前の "非同期"は私に一時停止を与えます。あなたが与える質問は、この式の同期の評価と明示的に関連しています。

私の意見:これをC#に翻訳することは、これを理解する最速の方法ではないと思います。

最後に、let *はネストされたバインディングの短縮形です。だからあなたはこれを次のように書き換えることができます:

(let ([yin ...]) 
    (let ([yang ...]) 
    ...)) 

... let *を取り除くために。あなたの場合、「陽」は「陰」に依存しないので、効果は順序づけの効果です。つまり、 'yin'バインディングの右側にキャプチャされた継続は、まだ 'yang'バインディングを評価していないものです。

関連する問題