レトロスタイル:TCL上のJ2ME



娘の電話で電話に出られなかったので、何かする必要があると判断しました。 専門家 、すべてが失われるわけではなく、特別な技術の助けを借りて若い世代に追いつくことができると言います。 そのようなツールの1つがN-Backです。 Toscreenの携帯電話には対応できないため(悪循環が発生)、J2MEでそのようなアプリケーションを見つけようとしました。 私はそれを見つけられず、自分で書くことにしました。 しかし、ここに問題があります-ScalaとClojureはJ2MEをサポートしていないため、書かれていないプログラムを練習せずにJavaを学ぶのは難しいでしょう。 いくつかのグーグル検索の後、解決策が見つかりました-Hecl 、わずかに修正されたTcl



私は非常に長い間Tclでプログラミングしたことを言わなければなりません-それから私はSGI O2コンピューターで働き、「ライン」(「ボール」でもある)をプレイできる人をうらやましく思いました。 私はアプリケーションの外観についてあまり気取らないので、TkライブラリでTclを使用してこの問題を解決しました。

Tclは、単純な命令型スクリプト言語であり、Unix Shellを連想させる構文です(また、その品質で使用されることもあります)。 拡張性により、FortおよびLispと比較できます。 Cアプリケーションへの組み込みが容易なため、CAD開発者に人気があります。

HeclはTclの多くの機能を継承し、CではなくJavaアプリケーションとのみ統合します。コマンド履歴と行編集をサポートする従来のtclshとは異なり、REPLによって開発が簡素化されます。

HeclのWebサイトには、サンプルや最小限の開発環境を備えた既製のMIDletがあります。 jarアーカイブにscript.hclファイルがあります-J2MEプラットフォームでスクリプトを実行するために(.jadを修正することを忘れずに)それを置き換えるだけで十分です。



それでは、始めましょう。 ランダムなキャラクターを取得する必要があります。
set alph {ACGT} set alphsize [llen $alph] proc rand {} { global alph alphsize lindex $alph [* [random] $alphsize] }
      
      





変数の割り当ては、 setコマンドを使用して行われます。 変更する変数の名前は、Pythonのように簡単に記述されます。使用する場合は、Perlのように「$」を追加する必要があります。 ご希望の場合は、書くことができます
 set aaa bbb set $aaa ccc
      
      



bbb変数はcccに設定されます。

Unix Shellの場合のように、通常、文字列を引用符で囲む必要はありません。 まだ必要な場合は、通常の二重引用符に加えて、バランスの取れた中括弧({})を使用できます。文字列は「ネスト」できます。

行はスペースに分割され(リストが表示されます)、最初の単語はプロシージャの名前として解釈されます-ここで、TclはLispに少し似ています。 コマンドに埋め込まれた他のコマンドの呼び出しは、角括弧([])で囲まれています。

コマンド+および* -Heclの革新。 オリジナルのTclでは、特別なDSLを呼び出す必要がありました
 expr 1 + 2 * 3
      
      



シェルのように( *エスケープなしのみ)。



少しの心理学とターバー
このN-Back実装では、等しい確率で小さなアルファベットの文字を使用します。 アルファベットを増やすと、試合が非常にまれになり、プレイが退屈になります。 キャラクターの生成をより複雑なマルコフ過程にすることは可能です(確率は変化する状態に依存します)。 もう1つの興味深い点があります。脳が隠されたマルコフモデルをどれだけ分析し、一致を認識するときにベイズ確率を考慮することができるかです。 記号の代わりに、写真(漢字または化学式-トレーニングと暗記を組み合わせたもの)または音声を使用できます。




 set nback {aa aa} set last "" proc getnext {} { global nback last set nbach [lappend [lset $nback 0] $last] set last [rand] return $last } proc first {} { global nback last eq $last [lindex $nback 0] }
      
      





N-Backという名前のNは、リストの最初の長さで指定されます。 十分なN == 2があります:-)。

ストーリーの初期値は、簡単にするためにアルファベットの文字と一致しないように選択されています。 私は可愛さを追いかけなかったので、バッファを満たすために生成された最初のN-1文字は推測されたカウンターに行きます。



 set stats {0 0 0 0} proc update k { global stats lset $stats $k [1+ [lindex $stats $k]] set stats }
      
      





統計を計算する手順。 1+は、ユニット追加機能の名前です。 stats配列には、正常に検出された不一致、誤って認識された不一致、誤って認識された一致、および正常に認識された一致の数が格納されます。 そのようなシーケンスは、実装の利便性から選択されましたが、認識にも便利でした。



次のコードは、元のscript.hclからskargokultil

 proc PrintLn {g txt} { global MIDL $g clear $g string [list 4 $MIDL] $txt nw } proc EventHandler {ce} { global last MIDL set reason [$e cget -reason] if {!= 5 $reason} {return} set MIDL [/ [$c cget -height] 2] set keycode [$e cget -keycode] set res [first] set sym [getnext] set g [$c graphics] set k [eq 49 $keycode] if {eq $k $res} { PrintLn $g "[update [+ $res $res $k]] Ok $last" } else { PrintLn $g "[update [+ $res $res $k]] Fail $last" } } set c [lcdui.canvas -title "N-Back" -fullscreen 1 -eventhandler EventHandler] $c setcurrent
      
      





ここでは、Tclのオブジェクト指向プロパティを確認できます。オブジェクトは変数に格納されたプロシージャとして偽装され、メッセージは引数に文字列定数でマークされます。 「コンストラクター」 lcdui.canvasは「canvasオブジェクト」を作成し、イベントハンドラーをその上にハングさせます。 ハンドラーは、理由5(キーストローク)のイベントを認識します。 キー「1」は気づいた一致として、残りは気づいた不一致として扱われます。 選択が良いかどうかはわかりませんが、実験するのは怠lazで、これを電話にダウンロードする手順は開発全体で最も難しいです:-)。



一般に、Heclは、迅速な開発/プロトタイピング、およびレガシープラットフォームを含むJavaアプリケーションに組み込まれた言語として推奨できます。



All Articles