v show variable v\n`hide Язык K: Отображение графического интерфейса из данных / Comments / Habr v hide variable v\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003Cbr\u003E\r\nЭто всё, больше нет ничего. Т.е. основная особенность — что GUI в K это прямое отображение данных в памяти. А теперь как с этим можно удобно работать.\u003Cbr\u003E","imageUrl":null,"buttonTextHtml":"Ну ладно, посмотрю на ваш K","image":null},"editorVersion":"1.0","postType":"article","postLabels":[],"author":{"id":"467706","alias":"inv2004","fullname":null,"avatarUrl":null,"speciality":null,"deleted":false,"scoreStats":{"score":23,"votesCount":53},"rating":0,"relatedData":null,"contacts":[],"authorContacts":[],"paymentDetails":{"paymentYandexMoney":null,"paymentPayPalMe":null,"paymentWebmoney":null},"donationsMethod":null,"isInBlacklist":null,"careerProfile":null,"isShowScores":true,"reach":null},"statistics":{"commentsCount":6,"favoritesCount":43,"readingCount":9136,"score":29,"votesCount":35,"votesCountPlus":32,"votesCountMinus":3,"reach":9374,"readers":9374},"hubs":[{"id":"84","alias":"crazydev","type":"collective","title":"Abnormal programming","titleHtml":"Abnormal programming","isProfiled":true,"relatedData":null},{"id":"359","alias":"programming","type":"collective","title":"Programming","titleHtml":"Programming","isProfiled":true,"relatedData":null}],"flows":[{"id":"1","alias":"develop","title":"Development","titleHtml":"Development"}],"relatedData":{"vote":null,"unreadCommentsCount":0,"bookmarked":false,"canComment":false,"canEdit":false,"canViewVotes":false,"votePlus":{"canVote":false,"isChargeEnough":false,"isKarmaEnough":false,"isVotingOver":true,"isPublicationLimitEnough":false},"voteMinus":{"canVote":false,"isChargeEnough":false,"isKarmaEnough":false,"isVotingOver":true,"isPublicationLimitEnough":false},"canModerateComments":false,"trackerSubscribed":false,"emailSubscribed":false},"textHtml":"\u003Cdiv xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\"\u003EЯ как всегда об APL, а точнее о старой версии языка \u003Ca href=\"http:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FK_(programming_language)\" rel=\"nofollow noopener noreferrer\"\u003EK\u003C\u002Fa\u003E, которая содержала в себе GUI, с весьма необычным подходом к нему.\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nК сожалению новые версии языка K решили сосредоточиться только на обработке данных и исключили GUI, так что данный подход остался в истории, однако может быть кто-то подскажет аналогичные современные фреймворки — было бы очень интересно посмотреть.\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nНачнём. Краткое описание API, которое нам доступно:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E`show Язык K: Отображение графического интерфейса из данных / Comments / Habr v show variable v\n`hide Язык K: Отображение графического интерфейса из данных / Comments / Habr v hide variable v\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\nЭто всё, больше нет ничего. Т.е. основная особенность — что GUI в K это прямое отображение данных в памяти. А теперь как с этим можно удобно работать.\u003Cbr\u002F\u003E\n\u003Ca name=\"habracut\"\u003E\u003C\u002Fa\u003E\u003Cbr\u002F\u003E\nДля начала попробуем самое простое:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003EC:\\>k\nK 3.1 2004-01-28 Copyright (C) 1993-2004 Kx Systems\nWIN32 2CPU 4030MB ws-1341.x.com 0 EVAL\n a:10 _draw 100 \u002F vec\n a\n20 51 12 34 31 51 29 35 17 89\n `show Язык K: Отображение графического интерфейса из данных / Comments / Habr a\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\nНа экране появляется таблица со списком \u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F9ef\u002F464\u002F6e3\u002F9ef4646e30005ddb7b2032184541b786.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F9ef\u002F464\u002F6e3\u002F9ef4646e30005ddb7b2032184541b786.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F9ef\u002F464\u002F6e3\u002F9ef4646e30005ddb7b2032184541b786.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\nЛюбое значение редактируемое, меняем 35 на 135 и это изменение сразу меняет значение в списке:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E a\n20 51 12 34 31 51 29 135 17 89\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\nЕсли меняем значение в списке, то оно тутже обновляется в интерфейсе.\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nВывести небольшой список не проблема, а что если данных будет много? пусть будет очень много:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E a:(10 10000000) _draw 100 \u002F 10 списков по 10 миллионов каждый\n `show Язык K: Отображение графического интерфейса из данных / Comments / Habr a\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F4c4\u002Fa55\u002F65f\u002F4c4a5565fd509d8c979f99c8d033fa5f.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F4c4\u002Fa55\u002F65f\u002F4c4a5565fd509d8c979f99c8d033fa5f.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F4c4\u002Fa55\u002F65f\u002F4c4a5565fd509d8c979f99c8d033fa5f.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\nНикаких проблем — всё быстро отображается, прокручивается и редактируется.\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nИменуем колонки: логично что имя колонки — это ключ, а список — значение из hashtable:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E t:.((`a;10 _draw 100;);(`b;10 _draw 100))\n `show Язык K: Отображение графического интерфейса из данных / Comments / Habr t\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fc3a\u002F068\u002Fcf2\u002Fc3a068cf20b4c73cc8433cb13af269f4.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fc3a\u002F068\u002Fcf2\u002Fc3a068cf20b4c73cc8433cb13af269f4.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fc3a\u002F068\u002Fcf2\u002Fc3a068cf20b4c73cc8433cb13af269f4.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nНо это всё очень просто, смотрим что есть ещё. аттрибуты и триггеры — по сути это просто ключ-значение в hashtable, привязанном к переменной, в зависимости от того есть такое значение или нет — происходят разные действия:\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nСамый простой пример: добавление label.\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E val:10\n val..l:\"Input field\"\n `show Язык K: Отображение графического интерфейса из данных / Comments / Habr val\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F9e8\u002Fafe\u002F925\u002F9e8afe92572c6d02333f710afe82210d.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F9e8\u002Fafe\u002F925\u002F9e8afe92572c6d02333f710afe82210d.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F9e8\u002Fafe\u002F925\u002F9e8afe92572c6d02333f710afe82210d.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nСледующие аттрибуты влияют на отображение в gui:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E Display attributes (for variables that have class).\n x width integer(KFONT width)\n y height integer(KFONT height)\n a arrangement nest of symbols(class `form)\n o options list of symbols(class `radio)\n l label string\n kl click label string (also klr)\n\n Data-display attributes (for variables that have class `data).\n functions (monadic, constant or array) default\n e editable 0 or 1 1\n f format string from data 11$(11.2$)\n g getdata data from string 0$ etc.\n u update update[old;new] :\n fg foreground integer(rrggbb) 0\n bg background integer(rrggbb) -1(808080)\n\n expressions\u002Fevents (strings)\n ins, del, f1 ... f12, ctrl_a ... ctrl_z\n k, kr, kk click, click right, double click(precludes e)\n\n c class(display) symbol\n `data(default) atom, list, dict, list of lists, dict of lists\n `chart as above where atom is list of y values\n `plot as above where atom is matrix of (x;y) values\n `check 0 or 1\n `radio symbol (one of ..o; see below)\n `button expression or dictionary of expressions\n `form dictionary of entries of any class(incl. `form)\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\nНе буду описывать детальные особенности каждого из аттрибутов, так как большинство из них очевидны из описания и делать подобие мануала не хочется.\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nДля простоты создания словаря — язык позволяет работать в контексте внутри словаря — т.е. аналогия с папками и модулями, которые просто хэш-таблицы:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E \\d form\n val:100\n incr:\"val+:1\"\n incr..l:\"Increment\"\n decr:\"val-:1\"\n decr..l:\"Decrement\"\n incr..c: decr..c: `button\n \\d ^\n form \u002F хэш ключей-значений и хэшей аттрибутов.\n.((`val;100;)\n (`incr\n \"val+:1\"\n .((`l;\"Increment\";)\n (`c;`button;)))\n (`decr\n \"val-:1\"\n .((`l;\"Decrement\";)\n (`c;`button;))))\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nАттрибутом ..a установим порядок отображения.\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E form..a:`incr`val`decr\n form.val..e:0 \u002F отключаем редактирование значения.\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fc03\u002F227\u002F980\u002Fc0322798039d1e34c85f9b95bf1d257d.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fc03\u002F227\u002F980\u002Fc0322798039d1e34c85f9b95bf1d257d.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fc03\u002F227\u002F980\u002Fc0322798039d1e34c85f9b95bf1d257d.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\n..a может быть любой формы. Например добавим пару кнопок.\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E form.incr10:\"val+:10\"\n form.decr10:\"val-:10\"\n form.incr10..c : form.decr10..c: `button\n form..a:(,`incr;`decr10`val`incr10;,`decr)\n form..a\n(,`incr\n `decr10 `val `incr10\n ,`decr)\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F053\u002Fbb4\u002F506\u002F053bb450691c4bab9a0cb45f7f09b8f6.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F053\u002Fbb4\u002F506\u002F053bb450691c4bab9a0cb45f7f09b8f6.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F053\u002Fbb4\u002F506\u002F053bb450691c4bab9a0cb45f7f09b8f6.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nТ.е. смысл в том, что всё GUI описывается примитивными структурами языка и является их же прямым отображением. Можно включать hash в hash, т.е. включать форму в форму компонуя элементы и тд.\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nНу а теперь самое интересное, а именно несколько примеров:\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nКалькулятор:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003Ecalc..a:(`exp\n `va`vb`vc`vd\n `n0`n1`n2`n3\n `n4`n5`n6`n7\n `n8`n9`lp`rp\n `fa`fs`fm`fd`fe\n `eval`clear) \u002F порядок элементов на форме\ncalc:@[_n;1_-1_ calc..a;:[;\"exp,:(~_v)`l\"]]\t\u002F expressions\ncalc[.;`l]:\"abcd0123456789()+-*%:\"\t\t\u002F labels\ncalc.eval:\"exp:5:. exp\"\ncalc.clear:\"exp:\\\"\\\"\"\ncalc[.;`c]:`button\ncalc.exp:calc.exp..l:\"\"\n\n`show Язык K: Отображение графического интерфейса из данных / Comments / Habr calc\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F0c9\u002F226\u002F737\u002F0c92267375cebb67904275b0524bae32.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F0c9\u002F226\u002F737\u002F0c92267375cebb67904275b0524bae32.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F0c9\u002F226\u002F737\u002F0c92267375cebb67904275b0524bae32.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nМожно рисовать графики:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E p..c:`chart\n p:(5 5) _draw 100\n `show Язык K: Отображение графического интерфейса из данных / Comments / Habr p\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F022\u002F04f\u002F8f1\u002F02204f8f1ca51ebefa3fb60e45abb1dc.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F022\u002F04f\u002F8f1\u002F02204f8f1ca51ebefa3fb60e45abb1dc.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002F022\u002F04f\u002F8f1\u002F02204f8f1ca51ebefa3fb60e45abb1dc.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nИли высокохудожественная мазня:\u003Cbr\u002F\u003E\n\u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003E`show$.,((`p;({[x] (2 30)_draw 30}'!10);.,(`c;`plot;)))\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fd5a\u002F380\u002Fdbc\u002Fd5a380dbc18550ebf93f7601647e8ff9.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fd5a\u002F380\u002Fdbc\u002Fd5a380dbc18550ebf93f7601647e8ff9.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fd5a\u002F380\u002Fdbc\u002Fd5a380dbc18550ebf93f7601647e8ff9.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nА теперь удивительная вещь, которая когда-то так удивила своей краткостью и понятностью (при минимальном знании словаря конечно), что я решил начать изучать K глубже:\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nBroadcast сервер: \u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003Ed:10 _draw 10\n\nw:!0\t\t\u002F empty client list\n\n.m.g:{w,:_w;d}\t\u002F return data\n.m.c:\"w@:&~w=_w\"\t\u002F retain clients\n.m.s:{. x;w 3:\\:x;}\t\u002F (log `l 5:,x) apply and broadcast\n\n\\m i 1 listen on port 1\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\nКлиент: \u003Cpre\u003E\u003Ccode class=\"plaintext\"\u003Eh:3:(`;1)\t\u002F connect to server\nd:h 4:_n\t\u002F get database\nd..t:\"if[0=_w;h 3:(_v;_i;:;_v ._i)]\"\t\u002F send my updates\n\n`show Язык K: Отображение графического интерфейса из данных / Comments / Habr d\n\u003C\u002Fcode\u003E\u003Cdiv class=\"code-explainer\"\u003E\u003Ca href=\"https:\u002F\u002Fsourcecraft.dev\u002F\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"\u003E\u003Cimg style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\u003C\u002Fpre\u003E\u003Cbr\u002F\u003E\nВот эти несколько строчек создают сервер с простым списком в качестве данных. А сколько угодно клиентов присоединяются к нему и имеют совместно редактируемый список с обновление в реальном времени, всего 9 строчек. Подобный код (без GUI конечно) в настоящее время используется на многих крупнейших биржах для транспортных и балансировочных узлов, которые обслуживают инстансы баз данных \u003Ca href=\"http:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FQ_(programming_language_from_Kx_Systems)\" rel=\"nofollow noopener noreferrer\"\u003EQ\u003C\u002Fa\u003E (новая версия K).\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\nКартинка конечно не передаёт того как это работает в динамике.\u003Cbr\u002F\u003E\n\u003Cbr\u002F\u003E\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fa19\u002F7ce\u002F5f6\u002Fa197ce5f6df578a4977f9eea4b0d9fd2.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw780\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fa19\u002F7ce\u002F5f6\u002Fa197ce5f6df578a4977f9eea4b0d9fd2.png 780w, https:\u002F\u002Fhabrastorage.org\u002Fr\u002Fw1560\u002Fgetpro\u002Fhabr\u002Fpost_images\u002Fa19\u002F7ce\u002F5f6\u002Fa197ce5f6df578a4977f9eea4b0d9fd2.png 781w\" loading=\"lazy\" decode=\"async\"\u002F\u003E\u003C\u002Fdiv\u003E","tags":[{"titleHtml":"apl"},{"titleHtml":"k"},{"titleHtml":"kx"},{"titleHtml":"gui"}],"metadata":{"stylesUrls":[],"scriptUrls":[],"shareImageUrl":"https:\u002F\u002Fhabr.com\u002Fshare\u002Fpublication\u002F205844\u002F2a85aa5c142094e2002defae73ee13fd\u002F","shareImageWidth":1200,"shareImageHeight":630,"vkShareImageUrl":"https:\u002F\u002Fhabr.com\u002Fshare\u002Fpublication\u002F205844\u002F2a85aa5c142094e2002defae73ee13fd\u002F?format=vk","schemaJsonLd":"{\"@context\":\"http:\\\u002F\\\u002Fschema.org\",\"@type\":\"Article\",\"mainEntityOfPage\":{\"@type\":\"WebPage\",\"@id\":\"https:\\\u002F\\\u002Fhabr.com\\\u002Fru\\\u002Farticles\\\u002F205844\\\u002F\"},\"headline\":\"Язык K: Отображение графического интерфейса из данных\",\"datePublished\":\"2013-12-13T09:06:22+04:00\",\"dateModified\":\"2021-01-25T23:37:37+03:00\",\"author\":{\"@type\":\"Person\",\"name\":\"inv2004\"},\"publisher\":{\"@type\":\"Organization\",\"name\":\"Habr\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fwebt\\\u002Fa_\\\u002Flk\\\u002F9m\\\u002Fa_lk9mjkccjox-zccjrpfolmkmq.png\"}},\"description\":\"Я как всегда об APL, а точнее о старой версии языка K, которая содержала в себе GUI, с весьма необычным подходом к нему. К сожалению новые версии языка K решили...\",\"url\":\"https:\\\u002F\\\u002Fhabr.com\\\u002Fru\\\u002Farticles\\\u002F205844\\\u002F#post-content-body\",\"about\":[\"h_crazydev\",\"h_programming\",\"f_develop\"],\"image\":[\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002F9ef\\\u002F464\\\u002F6e3\\\u002F9ef4646e30005ddb7b2032184541b786.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002F4c4\\\u002Fa55\\\u002F65f\\\u002F4c4a5565fd509d8c979f99c8d033fa5f.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002Fc3a\\\u002F068\\\u002Fcf2\\\u002Fc3a068cf20b4c73cc8433cb13af269f4.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002F9e8\\\u002Fafe\\\u002F925\\\u002F9e8afe92572c6d02333f710afe82210d.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002Fc03\\\u002F227\\\u002F980\\\u002Fc0322798039d1e34c85f9b95bf1d257d.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002F053\\\u002Fbb4\\\u002F506\\\u002F053bb450691c4bab9a0cb45f7f09b8f6.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002F0c9\\\u002F226\\\u002F737\\\u002F0c92267375cebb67904275b0524bae32.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002F022\\\u002F04f\\\u002F8f1\\\u002F02204f8f1ca51ebefa3fb60e45abb1dc.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002Fd5a\\\u002F380\\\u002Fdbc\\\u002Fd5a380dbc18550ebf93f7601647e8ff9.png\",\"https:\\\u002F\\\u002Fhabrastorage.org\\\u002Fgetpro\\\u002Fhabr\\\u002Fpost_images\\\u002Fa19\\\u002F7ce\\\u002F5f6\\\u002Fa197ce5f6df578a4977f9eea4b0d9fd2.png\"]}","metaDescription":"Я как всегда об APL, а точнее о старой версии языка K , которая содержала в себе GUI, с весьма необычным подходом к нему. К сожалению новые версии языка K решили сосредоточиться только на обработке...","mainImageUrl":null,"amp":false,"customTrackerLinks":[]},"polls":[],"commentsEnabled":{"status":true,"reason":null},"rulesRemindEnabled":false,"votesEnabled":true,"status":"published","plannedPublishTime":null,"checked":null,"hasPinnedComments":false,"format":"tutorial","banner":null,"multiwidget":null,"multiwidgetUuid":null,"readingTime":4,"complexity":null,"isEditorial":false,"flowNew":null,"linkedPostTranslation":null,"hasRegionalRestrictions":false}},"articlesIds":{},"isLoading":false,"pagesCount":{},"route":{},"reasonsList":null,"postReasonsList":null,"view":"cards","oldEditorForm":null,"lastVisitedRoute":{},"ssrCommentsArticleIds":[],"viewedPosts":[],"myFeedFilter":{"complexity":"all","score":"all","types":["articles","posts","news"]},"myFeedIsApplyFilters":false,"myFeedIsForce":false},"me":{"user":null,"uuid":null,"ppgDemanded":false,"karmaResetInfo":{"canReincarnate":null,"wasReincarnated":null,"currentScore":null},"notes":null,"userUpdates":{"feeds":{"newCount":null},"conversationUnreadCount":0,"trackerUnreadCount":0},"features":null},"flowsMenu":{"flowsMenuData":{"whatsNew":{"newAuthors":{"order":7,"items":[{"alias":"Maden4ic","fullname":"Maden4ic","avatarUrl":null},{"alias":"slavacpp","fullname":"0xC0DE1E55","avatarUrl":null},{"alias":"Gim6626","fullname":"Дмитрий Винокуров","avatarUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F27a\u002Fe3f\u002Fda7\u002F27ae3fda77c3828724b6c0568d17ee16.jpg"}]},"updates":{"order":8,"items":[{"title":"Changelog","url":"https:\u002F\u002Fhabr.com\u002Fen\u002Fdocs\u002Fchangelog\u002F2025\u002F","imageUrl":null},{"title":"Habr Code of Authors","url":"https:\u002F\u002Fhabr.com\u002Fen\u002Fdocs\u002Fauthors\u002Fcodex\u002F","imageUrl":null},{"title":"How it works","url":"https:\u002F\u002Fhabr.com\u002Fen\u002Fdocs\u002Fhelp\u002Frules\u002F","imageUrl":null},{"title":"Corporate blogs","url":"https:\u002F\u002Fhabr.com\u002Fen\u002Fdocs\u002Fcompanies\u002Fcorpblogs\u002F","imageUrl":null}]},"socialNetwork":{"order":1},"thematicChannels":{"order":3},"ourActivities":{"order":4},"partnersActivities":{"order":5},"banner":{"order":6},"ourBlogs":{"order":2}},"flows":{"backend":{"technologies":{"order":1,"items":[{"alias":"go","title":"Go","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002Fa10\u002Fc5c\u002F626\u002Fa10c5c62685d9a7d2964993daf6958c3.png"}]},"topics":{"order":2,"items":[]},"topPosts":{"order":3,"items":[],"period":"day"},"topAuthors":{"order":4,"items":[{"alias":"xeovo","fullname":"xeovo","avatarUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Fe83\u002Fde8\u002Ff9e\u002Fe83de8f9ed182d9287ca9900d263c2f9.png"}]},"topCompanies":{"order":5,"items":[{"alias":"xeovo","title":"Xeovo VPN","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fcompany\u002F864\u002F431\u002F196\u002F864431196b8a78de320f5707f6d8ff33.png"}]},"banner":{"order":6}},"frontend":{"technologies":{"order":1,"items":[{"alias":"javascript","title":"JavaScript","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002F2b3\u002F99b\u002F964\u002F2b399b964d456f3ad1bfddc0346b60d4.png"},{"alias":"reactjs","title":"ReactJS","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002Fe77\u002F27d\u002F25b\u002Fe7727d25b433a67f0e69acc74d2ba785.png"},{"alias":"nestjs","title":"NestJS","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002F820\u002Ff03\u002F364\u002F820f03364cccdb926fd93cfe2438f962.png"}]},"topics":{"order":2,"items":[]},"topPosts":{"order":3,"items":[],"period":"day"},"topAuthors":{"order":4,"items":[{"alias":"aymericzip","fullname":"Aymeric PINEAU","avatarUrl":null}]},"topCompanies":{"order":5,"items":[]},"banner":{"order":6}},"hardware_and_gadgets":{"technologies":{"order":1,"items":[]},"topics":{"order":2,"items":[]},"topPosts":{"order":3,"items":[{"id":"1033642","isCorporative":false,"lang":"en","titleHtml":"Appeal to keyboard makers: Please Stop Adding FN Buttons","postType":"article","hubs":[{"id":"21898","alias":"hardware","type":"collective","title":"Computer hardware","titleHtml":"Computer hardware","isProfiled":false},{"id":"17189","alias":"itstandarts","type":"collective","title":"IT Standards","titleHtml":"IT Standards","isProfiled":true},{"id":"21954","alias":"Peripheral","type":"collective","title":"Periphery","titleHtml":"Periphery","isProfiled":false}],"author":{"alias":"Murz","fullname":"Alexey Murz Korepov","avatarUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F527\u002Fcd0\u002F606\u002F527cd060631ef496fb52ce16199efca0.jpg"}}],"period":"day"},"topAuthors":{"order":4,"items":[]},"topCompanies":{"order":5,"items":[]},"banner":{"order":6}},"mobile_development":{"technologies":{"order":1,"items":[{"alias":"dart","title":"Dart","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002F41e\u002F671\u002F2dd\u002F41e6712dd7d298077553efff8562bd73.png"},{"alias":"flutter","title":"Flutter","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002F63b\u002F728\u002Fb76\u002F63b728b76ec18862a5454a684509940b.png"},{"alias":"cpp","title":"C++","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002F89a\u002Fc44\u002F09e\u002F89ac4409ea406d835a82383fa53fcda7.png"},{"alias":"qt_software","title":"Qt","imageUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002Fa69\u002F436\u002F043\u002Fa69436043016a35349d05068d584b316.png"}]},"topics":{"order":2,"items":[]},"topPosts":{"order":3,"items":[],"period":"day"},"topAuthors":{"order":4,"items":[{"alias":"Paulik8","fullname":"Paulik8","avatarUrl":null},{"alias":"slavacpp","fullname":"0xC0DE1E55","avatarUrl":null}]},"topCompanies":{"order":5,"items":[]},"banner":{"order":6}},"industrial_engineering":{"technologies":{"order":1,"items":[]},"topics":{"order":2,"items":[]},"topPosts":{"order":3,"items":[],"period":"day"},"topAuthors":{"order":4,"items":[{"alias":"rsashka","fullname":"Александр Рябиков","avatarUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Fad5\u002Fd5f\u002Feb2\u002Fad5d5feb2fbf547d4d74f65d041cb2c7.jpg"}]},"topCompanies":{"order":5,"items":[]},"banner":{"order":6}}},"events":{"items":[]}},"isMenuVisible":false},"banner":{"isArticleStickyPanelVisible":false,"isArticleStickyPanelAtTheBottom":false,"bannerContainer":null,"isHeaderBannerInView":true,"isSponsorBlockPresent":false,"isHeaderBannerVisible":true,"isPBrandingVisible":false},"refs":{"flowsRefs":[{"id":"2","title":"Бэкенд","alias":"backend"},{"id":"4","title":"Фронтенд","alias":"frontend"},{"id":"6","title":"Мобильная разработка","alias":"mobile_development"},{"id":"8","title":"Системное администрирование","alias":"admin"},{"id":"10","title":"Информационная безопасность","alias":"information_security"},{"id":"12","title":"AI и ML","alias":"ai_and_ml"},{"id":"14","title":"Промышленная инженерия","alias":"industrial_engineering"},{"id":"16","title":"Геймдев","alias":"gamedev"},{"id":"18","title":"Тестирование","alias":"quality_assurance"},{"id":"20","title":"Техническая поддержка","alias":"support"},{"id":"22","title":"Системный и бизнес-анализ","alias":"analytics"},{"id":"24","title":"Дизайн","alias":"design"},{"id":"26","title":"Менеджмент","alias":"management"},{"id":"28","title":"Топ-менеджмент","alias":"top_management"},{"id":"30","title":"Маркетинг и контент","alias":"marketing"},{"id":"34","title":"Продажи","alias":"sales"},{"id":"36","title":"HR","alias":"human_resources"},{"id":"38","title":"Бэк-офис","alias":"back_office"},{"id":"40","title":"Зерокодинг","alias":"zero-code_development"},{"id":"42","title":"Железо и гаджеты","alias":"hardware_and_gadgets"},{"id":"44","title":"DIY","alias":"diy"},{"id":"46","title":"Здоровье","alias":"healthcare"},{"id":"48","title":"Научпоп","alias":"popsci"},{"id":"50","title":"Другое","alias":"other"}]},"promoData":{"isLoading":false,"hasLoaded":false,"featurer":null,"megaposts":null,"promoLinks":null,"promoPosts":null,"sticker":null,"stories":null,"activities":[],"partnerActivities":[],"isPromoDataAvailable":{"featurer":true,"promoPosts":true,"promoLinks":false,"megaposts":false}},"fixedBanner":{"isLoading":false,"viewEventsSent":[],"imagesLoaded":{}},"companies":{"companyRefs":{"__ALIAS_STORE__":true},"companyIds":{},"companyTopIds":[],"companyRouteStatistics":{},"pagesCount":{},"companyProfiles":{"__ALIAS_STORE__":true},"companiesCategories":[],"companiesCategoriesTotalCount":0,"companiesWidgets":{"__ALIAS_STORE__":true},"companiesWorkers":{"__ALIAS_STORE__":true},"companiesFans":{"__ALIAS_STORE__":true},"multiwidgets":{"__ALIAS_STORE__":true},"route":{},"isLoading":false,"companyWorkersLoading":false,"companyFansLoading":false,"multiwidgetLoading":false,"vacancies":{},"companiesGalleries":{"__ALIAS_STORE__":true},"companiesBanners":{"__ALIAS_STORE__":true},"companiesLandingVacancies":{"__ALIAS_STORE__":true},"companiesTechnologies":{"__ALIAS_STORE__":true},"workplaceInfo":null},"ssr":{"error":null,"isDataLoaded":true,"isDataLoading":false},"hubs":{"hubRefs":{"__ALIAS_STORE__":true},"hubIds":{},"hubRouteStats":{},"pagesCount":{},"isLoading":false,"counters":{"__ALIAS_STORE__":true},"route":{"name":"","params":{},"query":{}}},"adblock":{"hasAcceptableAdsFilter":false,"hasAdblock":false},"pullRefresh":{"shouldRefresh":false},"viewport":{"prevScrollY":{},"scrollY":0,"width":0,"pageContentHeight":0},"feedStatistics":{"feedsStatistics":{}},"pageArticleComments":{"lastViewedComment":0,"postId":null,"lastCommentTimestamp":1386944247,"moderated":[],"moderatedIds":[],"commentRoute":"","idempotenceKey":""},"comments":{"articleComments":{"205844":{"refs":{"7093184":{"id":"7093184","parentId":null,"level":0,"timePublished":"2013-12-13T06:49:35+00:00","timeChanged":null,"isSuspended":false,"status":"published","score":2,"votesCount":2,"message":"Весьма напоминает по принципу работы библиотеку Metawidget для Java и JavaScript. Я не понимаю, почему такая библиотека не одна и народ не увлечён этой концепцией. По моему мнению она потрясающая.","editorVersion":1,"author":{"id":"48528","alias":"asm0dey","fullname":"Паша Финкельштейн","avatarUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Ff79\u002F89c\u002Fa6f\u002Ff7989ca6ffa43e652953051611d71b4b.jpg","speciality":"Разработчик и серийный спикер. Люблю Kotlin","deleted":false},"isAuthor":false,"isPostAuthor":false,"isNew":false,"isFavorite":false,"isCanEdit":false,"timeEditAllowedTill":null,"children":[],"vote":null,"votePlus":null,"voteMinus":null,"isPinned":false},"7094630":{"id":"7094630","parentId":null,"level":0,"timePublished":"2013-12-13T11:52:46+00:00","timeChanged":null,"isSuspended":false,"status":"published","score":0,"votesCount":0,"message":"Не Tcl\u002FTk ли исспользуется для отрисовки? Очень схожие виджеты.","editorVersion":1,"author":{"id":"14545","alias":"stoune","fullname":"Petro","avatarUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F672\u002F325\u002Ff2a\u002F672325f2a197cbb00cc54e74aaae5f0d.png","speciality":"Solutions Architect | Engineering Manager","deleted":false},"isAuthor":false,"isPostAuthor":false,"isNew":false,"isFavorite":false,"isCanEdit":false,"timeEditAllowedTill":null,"children":["7095278"],"vote":null,"votePlus":null,"voteMinus":null,"isPinned":false},"7094666":{"id":"7094666","parentId":null,"level":0,"timePublished":"2013-12-13T11:56:19+00:00","timeChanged":null,"isSuspended":false,"status":"published","score":0,"votesCount":0,"message":"Мне это напомнило библиотеку \u003Ca href=\"http:\u002F\u002Fwww.sandr.dds.nl\u002FFunctionalForms\u002F\"\u003EFunctionalForms\u003C\u002Fa\u003E для Haskell. \u003Cbr\u002F\u003E\r\nВообще всегда считал, что с языками, методами и фреймворками для построения GUI что-то не так: не могут они быть так сложны при относительной простоте GUI'шных формочек.","editorVersion":1,"author":{"id":"467870","alias":"leshiysoft","fullname":"Емельянов Алексей","avatarUrl":null,"speciality":null,"deleted":false},"isAuthor":false,"isPostAuthor":false,"isNew":false,"isFavorite":false,"isCanEdit":false,"timeEditAllowedTill":null,"children":[],"vote":null,"votePlus":null,"voteMinus":null,"isPinned":false},"7095278":{"id":"7095278","parentId":"7094630","level":1,"timePublished":"2013-12-13T13:34:29+00:00","timeChanged":null,"isSuspended":false,"status":"published","score":6,"votesCount":6,"message":"Вы хотите сказать, подозрительно одинаково вырвиглазные?","editorVersion":1,"author":{"id":"20734","alias":"WGH","fullname":"WGH","avatarUrl":null,"speciality":"Пользователь","deleted":false},"isAuthor":false,"isPostAuthor":false,"isNew":false,"isFavorite":false,"isCanEdit":false,"timeEditAllowedTill":null,"children":["7095366","7095460"],"vote":null,"votePlus":null,"voteMinus":null,"isPinned":false},"7095366":{"id":"7095366","parentId":"7095278","level":2,"timePublished":"2013-12-13T13:56:06+00:00","timeChanged":null,"isSuspended":false,"status":"published","score":0,"votesCount":0,"message":"Да, такое немного есть. Я шрифт чуть поправил, он ещё хуже был.","editorVersion":1,"author":{"id":"467706","alias":"inv2004","fullname":null,"avatarUrl":null,"speciality":null,"deleted":false},"isAuthor":false,"isPostAuthor":false,"isNew":false,"isFavorite":false,"isCanEdit":false,"timeEditAllowedTill":null,"children":[],"vote":null,"votePlus":null,"voteMinus":null,"isPinned":false},"7095460":{"id":"7095460","parentId":"7095278","level":2,"timePublished":"2013-12-13T14:17:27+00:00","timeChanged":null,"isSuspended":false,"status":"published","score":0,"votesCount":0,"message":"Современная версия Tk симпатичней смотрится, если только старая версия какая-нибудь. Вот скриншот утилиты, написанной на Tcl\u002FTk:\u003Cbr\u002F\u003E\r\n\u003Cimg src=\"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fcomment_images\u002F213\u002F244\u002F4cb\u002F2132444cbf2c3cb34a4e713bb6d2aeec.png\"\u002F\u003E\u003Cbr\u002F\u003E\r\n\u003Cbr\u002F\u003E\r\nЧем K похож на Tcl\u002FTk, так это легкостью создания окон. Например, создание окна с кнопкой, аналогичной представленной на скриншоте:\u003Cbr\u002F\u003E\r\n\u003Cpre\u003E\u003Ccode\u003Ewm title . "Заголовок программы"\nttk::button .button -text "Сделать хорошо" -command doSomething\npack .button -side top -anchor center \n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003EВ результате нажатия на кнопку выполнится функция doSomething.","editorVersion":1,"author":{"id":"15450","alias":"maovrn","fullname":"maovrn","avatarUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F1db\u002F1fd\u002F91e\u002F1db1fd91efbb6d8323cc04e74275bf26.jpg","speciality":null,"deleted":false},"isAuthor":false,"isPostAuthor":false,"isNew":false,"isFavorite":false,"isCanEdit":false,"timeEditAllowedTill":null,"children":[],"vote":null,"votePlus":null,"voteMinus":null,"isPinned":false}},"root":["7093184","7094630","7094666"],"cacheKey":"285aca03-8243-40d1-83b1-f6afdebf71f4"}},"articlePinnedComments":{"205844":{"refs":{},"commentIds":[]}},"searchCommentsResults":null,"pagesCount":null,"commentAccess":{},"scrollParents":{}},"publicationStats":{"statsInfo":{},"statsFunnels":{},"statsGraph":{},"defaultSuggest":{},"suggest":{},"timeTracker":{},"isUserActive":true,"otherPublicationStats":{}}};(function(){var s=document.currentScript||document.scripts[document.scripts.length-1];s.parentNode.removeChild(s);}());
Pull to refresh

Comments 6

Весьма напоминает по принципу работы библиотеку Metawidget для Java и JavaScript. Я не понимаю, почему такая библиотека не одна и народ не увлечён этой концепцией. По моему мнению она потрясающая.
Не Tcl/Tk ли исспользуется для отрисовки? Очень схожие виджеты.
Вы хотите сказать, подозрительно одинаково вырвиглазные?
Да, такое немного есть. Я шрифт чуть поправил, он ещё хуже был.
Современная версия Tk симпатичней смотрится, если только старая версия какая-нибудь. Вот скриншот утилиты, написанной на Tcl/Tk:


Чем K похож на Tcl/Tk, так это легкостью создания окон. Например, создание окна с кнопкой, аналогичной представленной на скриншоте:
wm title . "Заголовок программы"
ttk::button .button -text "Сделать хорошо" -command doSomething
pack .button -side top -anchor center   
В результате нажатия на кнопку выполнится функция doSomething.
Мне это напомнило библиотеку FunctionalForms для Haskell.
Вообще всегда считал, что с языками, методами и фреймворками для построения GUI что-то не так: не могут они быть так сложны при относительной простоте GUI'шных формочек.
Sign up to leave a comment.

Articles