K言語:データからGUIを表示

いつものように、私はAPLについて、具体的にはGUIを含むK言語の古いバージョンについて、非常に珍しいアプローチで話しています。



残念ながら、K言語の新しいバージョンはデータ処理のみに焦点を合わせ、GUIを除外することを決定したため、このアプローチは歴史に残っていますが、誰かが同様の最新のフレームワークを教えてくれるかもしれません。



始めましょう。 利用可能なAPIの簡単な説明:

`show$`v show variable v `hide$`v hide variable v
      
      





それだけです、これ以上はありません。 つまり 主な機能は、KのGUIがメモリ内のデータの直接マッピングであることです。 そして今、それを便利に扱う方法。



まず、最も簡単なものを試してみましょう。

 C:\>k K 3.1 2004-01-28 Copyright (C) 1993-2004 Kx Systems WIN32 2CPU 4030MB ws-1341.x.com 0 EVAL a:10 _draw 100 / list a 20 51 12 34 31 51 29 35 17 89 `show$`a
      
      





リストを含むテーブルが画面に表示されます。



値は編集可能です。35から135に変更すると、この変更によりリスト内の値がすぐに変更されます。

  a 20 51 12 34 31 51 29 135 17 89
      
      





リストの値を変更すると、インターフェイスでも更新されます。



小さなリストをリストすることは問題ではありませんが、大量のデータがある場合はどうでしょうか? たくさんあります:

  a:(10 10000000) _draw 100 / 10   10   `show$`a
      
      







問題ありません-すべてがすばやく表示、スクロール、編集されます。



列に名前を付けます。列名がキーであり、リストがハッシュテーブルの値であることが論理的です:

  t:.((`a;10 _draw 100;);(`b;10 _draw 100)) `show$`t
      
      









しかし、これは非常に簡単です。 属性とトリガー-実際、それは変数にアタッチされたハッシュテーブルのキー値であり、そのような値があるかどうかによって異なります-異なるアクションが発生します:



最も単純な例:ラベルを追加します。

  val:10 val..l:"Input field" `show$`val
      
      









次の属性は、GUIの表示に影響します。

  Display attributes (for variables that have class). x width integer(KFONT width) y height integer(KFONT height) a arrangement nest of symbols(class `form) o options list of symbols(class `radio) l label string kl click label string (also klr) Data-display attributes (for variables that have class `data). functions (monadic, constant or array) default e editable 0 or 1 1 f format string from data 11$(11.2$) g getdata data from string 0$ etc. u update update[old;new] : fg foreground integer(rrggbb) 0 bg background integer(rrggbb) -1(808080) expressions/events (strings) ins, del, f1 ... f12, ctrl_a ... ctrl_z k, kr, kk click, click right, double click(precludes e) c class(display) symbol `data(default) atom, list, dict, list of lists, dict of lists `chart as above where atom is list of y values `plot as above where atom is matrix of (x;y) values `check 0 or 1 `radio symbol (one of ..o; see below) `button expression or dictionary of expressions `form dictionary of entries of any class(incl. `form)
      
      





各属性の詳細な機能については説明しません。それらのほとんどは説明から明らかであり、マニュアルとの類似点は避けたいためです。



辞書の作成を簡単にするために、言語は辞書内のコンテキストで作業できるようにします。 単なるハッシュテーブルであるフォルダーとモジュールの類推:

  \d form val:100 incr:"val+:1" incr..l:"Increment" decr:"val-:1" decr..l:"Decrement" incr..c: decr..c: `button \d ^ form /  -   . .((`val;100;) (`incr "val+:1" .((`l;"Increment";) (`c;`button;))) (`decr "val-:1" .((`l;"Decrement";) (`c;`button;))))
      
      







属性..aは表示順序を設定します。

  form..a:`incr`val`decr form.val..e:0 /   .
      
      









..aは任意の形式にすることができます。 たとえば、いくつかのボタンを追加します。

  form.incr10:"val+:10" form.decr10:"val-:10" form.incr10..c : form.decr10..c: `button form..a:(,`incr;`decr10`val`incr10;,`decr) form..a (,`incr `decr10 `val `incr10 ,`decr)
      
      









つまり ポイントは、GUI全体が言語のプリミティブ構造によって記述され、それらの直接マッピングであるということです。 ハッシュにハッシュを含めることができます、つまり 要素を構成するフォームなどにフォームを組み込む



さて、今最も興味深い、すなわちいくつかの例:



電卓:

 calc..a:(`exp `va`vb`vc`vd `n0`n1`n2`n3 `n4`n5`n6`n7 `n8`n9`lp`rp `fa`fs`fm`fd`fe `eval`clear) /     calc:@[_n;1_-1_ calc..a;:[;"exp,:(~_v)`l"]] / expressions calc[.;`l]:"abcd0123456789()+-*%:" / labels calc.eval:"exp:5:. exp" calc.clear:"exp:\"\"" calc[.;`c]:`button calc.exp:calc.exp..l:"" `show$`calc
      
      









グラフを描くことができます:

  p..c:`chart p:(5 5) _draw 100 `show$`p
      
      









または非常に芸術的な塗りつぶし:

 `show$.,((`p;({[x] (2 30)_draw 30}'!10);.,(`c;`plot;)))
      
      









そして今では、その簡潔さと明快さ(もちろん辞書の最低限の知識で)に驚くほど驚いたことで、私はKをさらに深く勉強し始めることにしました。



ブロードキャストサーバー:
 d:10 _draw 10 w:!0 / empty client list .mg:{w,:_w;d} / return data .mc:"w@:&~w=_w" / retain clients .ms:{. x;w 3:\:x;} / (log `l 5:,x) apply and broadcast \mi 1 listen on port 1
      
      





顧客:
 h:3:(`;1) / connect to server d:h 4:_n / get database d..t:"if[0=_w;h 3:(_v;_i;:;_v ._i)]" / send my updates `show$`d
      
      





これらの数行は、データとして単純なリストを持つサーバーを作成します。 そして、好きなだけ多くの顧客がそれに参加し、リアルタイムで更新される共同編集されたリストを持っています。わずか9行です。 同様のコード(もちろんGUIなし)は、 Qデータベースインスタンス(新しいバージョンK)を提供するトランスポートノードとバランシングノードの多くの最大の交換で現在使用されています。



もちろん、画像はダイナミクスでどのように機能するかを伝えません。










All Articles