2009-06-04 12 views
4

UnrealScriptは常に状態(および潜在関数)/グループ化のようなブロックに機能してフィールドをオーバーロードすることによってのためにそれで、多少、その本質的な支援を私に感銘を受けていますの負荷を使用するよりもかなりきれいですどのプログラミング言語が言語レベルの状態をサポートしていますか?

state() SomeState 
{ 
    ... 
    function void Foo() 
    { 
     GotoState('SomeOtherState'); 
    } 
    ... 
} 

すべての関数内のswitch-statements(ほとんど何らかの種類のdesign by contract)です。

このような状態宣言を本質的にサポートする他の汎用プログラミング言語がありますか(ビジュアルプログラミング言語やWorkflow Foundationなどのツールを無視します)。

編集:

UnrealScriptの中の状態の美しさのいくつかは、あなたがサブクラスでステートフルな機能をオーバーライドし、さらに新しい、名前の状態を定義することができるということです。 C#やJavaなどの単一の継承しかサポートしていない言語を中心に、異なる状態を実装するenumスイッチ(enumを拡張することができない)、代理人、またはco-classを扱うのは面倒です。

+0

は面白いですね。動的プロトタイプベースの継承とどのように違いますか? –

答えて

2

UnrealScriptは実際には使用されませんが、ファーストクラス関数/ lambdaをサポートするどの言語でも同じことを達成できますか?

3

私が知っていることはありませんが、メタプログラミング(例:Ruby)を使用してドメイン固有の言語を簡単に書くことをサポートする言語は、本質的にふるまうことができます。 Railsのためのacts_as_state_machineプラグインから:

class Nonprofit < ActiveRecord::Base 
    acts_as_state_machine :initial => :created, :column => 'status' 

    # These are all of the states for the existing system. 
    state :submitted 
    state :processing 
    state :nonprofit_reviewing 
    state :accepted 

    event :accept do 
    transitions :from => :processing,   :to => :accepted 
    transitions :from => :nonprofit_reviewing, :to => :accepted 
    end 

    event :receive do 
    transitions :from => :submitted, :to => :processing 
    end 

    # either a CTP or nonprofit user edits the entry, requiring a review 
    event :send_for_review do 
    transitions :from => :processing,   :to => :nonprofit_reviewing 
    transitions :from => :nonprofit_reviewing, :to => :processing 
    transitions :from => :accepted,   :to => :nonprofit_reviewing 
    end 
end 

(あなたもだけでなく、状態遷移、eventブロック単位で任意のコードを含めることができます)

2

状態を宣言することができますPythonでboduchライブラリがあります...これは本来のものではありません

+0

boduchライブラリはかなりクールです。 –

+0

まだ使用していませんが、かなり有望ですが、初期段階 – LB40

3

オブジェクト指向プログラミング言語を使用すると、簡単にステートマシンを作成できます。しかし、あなたはQTを見てみたいかもしれません。それはhttp://labs.trolltech.com/blogs/2009/01/30/qt-state-machine-framework/です。私はそれを試していない。

さまざまな種類の特殊な状況に特別な機能を提供する言語に対して、私が選択したさまざまなサポート構造を作成できる言語を優先します。 QTに示されているようなC++がその良い例です。

2

同じ機能にUnrealScriptの「状態」があることを私が知っているプログラミング言語はありません。 UnrealScriptのステートは、通常のステートマシンと似ていません。彼らはあなたがオブジェクトの上に置くことができる層のようなものです。メソッド呼び出しを傍受し、オブジェクトの内部状態にアクセスできる層。

UnrealEngine3からは、複数のアクティブレイヤーを持つ状態をスタックすることもできます。 たとえば:あなたは(開始状態またはS2のいずれかから)S1を述べるために行くと今

function bar() 
{ 
    // print quux 
} 

state S1 
{ 
    function foo() 
    { 
     // print foo 
    } 
} 


state S2 
{ 
    function foo() 
    { 
     // print bar 
    } 


    function bar() 
    { 
     // print bar 
    } 
} 

あなたはS2を述べると、(FOOを呼び出すために行く)、バー()あなたは「バーバー」 が表示されます"foo quux"と同じメソッドを呼び出します。 しかし、あなたがS2にいて、ステートスタックでS1を押すと、 "foo quux"ではなくfoo()bar()を呼び出すと、 "foo bar"が表示されます。

とにかく、元の質問に戻ってください。UnrealScriptで提供されているのと同じ状態機能を実現する1つの方法は、実行時にアスペクトを有効/無効にする動的な方法を提供するAOP言語を採用することです。 レクサーエキスパートシステム:私は状態や状態マシンのための固有のサポート付きの知っている

1

言語は、一般的に2つのクラスに分類されます。

レクサーは、一般にテキスト処理に向けられていますが、多くの場合、他の用途にも適用できます。レッカーの例は、(f)lex,Antlr,Quexである。私はロボット制御のためにlexを使っている人々の話を聞いてきました。

エキスパートシステムは、一連のルールと提示する状況に基づいて(おそらく専門家のような)意思決定を行うように設計されています。独自の状態処理言語を実装するエキスパートシステムの例は、makeおよびClipsです。 makeはソフトウェアを構築するのに役立つように設計されているので、世界の見解がファイルの日付に基づいていれば最適です。クリップははるかに柔軟性がありますが、makeのような外部OSの本質的な見方は本質的ではありません。

1

Luaはまた、あなたがのLuaのテーブルの上にプログラムして喜んでであることを提供し、状態を持つクラスをサポートしています。

または、私のライブラリ:MindStateを使用してください。私はそれをUnrealScriptのクラスシステムと模倣するように設計しました。通常のクラス継承からスタック可能な状態にできる限り多くのことを行います。

1

私はC#でこれを行う方法も考えています。なぜなら、自分自身のコンポーネントオブジェクトモデルを設計するための基礎としてUnrealEngine 3を使用しているからです。 (ちなみに、UDKはフィーチャのプロトタイプ作成には最適な方法です)egarciaのような外部の手法を実装する以外にも(実際には.NETでLuaInterface経由で使用できます)、私は2つの可能性を考え出しました。

  1. 明示的なインターフェイスの実装で、各状態のインターフェイスがあります。次に、オブジェクトを対応するインタフェース(つまり、「状態」)にキャストし、メソッドを呼び出します。残りはCLRが行います。この呼び出しを汎用メソッドでラップして、型パラメーターとしてインターフェース( "state")を渡すこともできますが、これは過度の可能性があります。

  2. デリゲートを値とする状態でキー付き辞書を作成します。種類のハックアイを犠牲にして、より大きな柔軟性を提供します。

個人的には、コーディングの観点からは私はすべてが強いですが、方法2は実装と更新が容易です。

egarciaのLuaアプローチに興味があり、LuaInterfaceがあなたにとって遅すぎると思うなら、私はLuaJetをサポートするようにLuaInterfaceを修正しました。これはネイティブインポートを使用しますが、LuaJITのパフォーマンスがディスパッチコールを相殺することを願っています。あなたがソースを望むなら、私にラインをドロップしてください。

1

私の素朴な理解は「タイプの状態は」オブジェクト指向言語のためのこの種の機能を提供することである:

What is typestate?

と特徴をサポートしている任意の言語で容易に実施することができます

Mixins vs. Traits

私はまだこれらのすべてについて学んでいますが、もっと知識のある答えを聞いてみたいと思います。

関連する問題