2011-07-27 4 views
11

私はスカラ(2.9.0)継続を使って一見妨げになるAPIを構築しようとしていますが、実際は非同期です。ユーザーがはいを押すと、inputが値を要求した場合askはブール値を返しますノンブロッキングAPIのためのスカラ継続の使用

if(ask("Continue?")) //Prompts Yes/No 
    name = input("Enter your name") 

:あなたが何かを書きたいとしよう。これはWebサーバーから呼び出され、askinputはスレッドをブロックしません。プロンプトを表示して(ほとんどのリソースを解放して)ページを表示する前に、マップに継続を格納します(またはセッションは大したことではありません) 。また、応答が返ってくると、マップ内の継続をルックアップしてコードを再開します。

これまでのところ、askinputを定義して、呼び出しコンテキストの戻り値の型をパラメータとして渡さずに継続を使用する適切な方法を見つけることができないようです。

私が得た最も近い

は次のようなものをやっている:

#!/bin/sh 
exec scala -P:continuations:enable -deprecation "$0" "[email protected]" 
!# 
import util.continuations._ 

//Api code 
def display[T](prompt: String) = shift { 
    cont: (Unit => T) => { 
     println(prompt) 
     cont() 
    } 
} 

//Client code 
def foo() : Int = reset { 
    display[Int]("foo!") // <-- how do I get rid of the type annotation? 
    5 
} 

def bar() : Unit = reset { 
    display[Unit]("bar!") 
} 

println(foo()) 
bar() 

私は本当にdisplayへの呼び出しに型注釈を取り除くしたいと思います。誰もがこれを達成する方法を知っていますか?クライアントコードがよりシンプルになる限り、API定義が醜いかどうかは気にしません。 ありがとう!

+2

回答を回答として投稿してください。 –

+0

私はできることを知らなかった! – juancn

答えて

6

私はついにそれを考え出し:

#!/bin/sh 
exec scala -P:continuations:enable -deprecation "$0" "[email protected]" 
!# 
import util.continuations._ 

class Display(val resume: (Unit => Any)) extends Throwable 

//Api code 
def display(prompt: String) = shift { 
    cont: (Unit => Any) => { 
     println(prompt) 
     throw new Display(cont) 
    } 
} 

//Client code 
def foo() : Int = reset { 
    display("foo!") 
    5 
} 

def bar() : Unit = reset { 
    display("bar!") 
} 

//Framework 
try { 
    foo() 
} catch { 
    case d: Display => println(d.resume()) 
} 

try { 
    bar() 
} catch { 
    case d: Display => d.resume() 
} 

をトリックがAny(Homeresque!:D'OH)を返すメソッドを受け入れているとNothingを返します。

あなたがそのようなaskとして、値を返すものを実装したい場合は、あなたが行うことができます:上記のコードで

class Ask(val resume: (Boolean => Any)) extends Throwable 

//Api code 
def ask(prompt: String) = shift { 
    cont: (Boolean => Any) => { 
     println(prompt) 
     throw new Ask(cont) 
    } 
} 

、戻りBooleanをお願いします。

関連する問題