{"id":3672,"date":"2018-11-15T13:43:42","date_gmt":"2018-11-15T13:43:42","guid":{"rendered":"http:\/\/www.colorwave.it\/blog\/?p=3672"},"modified":"2018-11-15T13:43:42","modified_gmt":"2018-11-15T13:43:42","slug":"clb-il-macro-linguaggio-di-colibri","status":"publish","type":"post","link":"https:\/\/www.colorwave.it\/blog\/framework\/clb_ang\/clb-il-macro-linguaggio-di-colibri\/admin\/2018\/11\/","title":{"rendered":"CLB : il macro linguaggio di Colibr\u00ec"},"content":{"rendered":"<p>Dalla versione 7 il framework di Colibri mette a disposizione anche un linguaggio script,\u00a0<strong>CLB\u00a0<\/strong>,\u00a0 utilizzabile\u00a0 sia dallo sviluppatore che da\u00a0 un utente esperto dell&#8217;applicazione; buona parte degli sviluppi di Colibri nell&#8217;ultimo anno sono stati costruiti in questo modo, sia per l&#8217;interfaccia utente, sia per le comunicazioni fra oggetti del software. In particolare, i programmi da trasferire a GPU ed eseguiti dal framework <a href=\"https:\/\/www.colorwave.it\/blog\/heterogeneus-computing\/gpu_program\/admin\/2017\/12\/\">OpenCL<\/a>\u00a0sono scritti in un sottoinsieme di CLB, che espande la sintassi OpenCL per facilitare la comunicazione dati con le classi dell&#8217;ambiente di sviluppo di Colibr\u00ec;<\/p>\n<p><strong>CLB\u00a0<\/strong> \u00e8 definito da un insieme di:<\/p>\n<ul>\n<li><span style=\"color: #000080;\"><em>parole chiave (clb_keyword) ,<\/em><\/span><\/li>\n<li><span style=\"color: #000080;\"><em>parametri (clb_params)<\/em><\/span><\/li>\n<li><span style=\"color: #000080;\"><em>operatori (clb_operator) ,<\/em><\/span><\/li>\n<li><span style=\"color: #000080;\"><em>funzioni (clb_function)<\/em><\/span><\/li>\n<li><span style=\"color: #000080;\"><em>programmi(clb_program)<\/em><\/span><\/li>\n<\/ul>\n<p>\u00c9 possibile implementare il linguaggio creando nuove clb_keyword e\u00a0 clb_function; i nuovi oggetti vengono salvati in librerie\u00a0che possono, a loro volta,\u00a0 essere incluse (direttiva\u00a0\u00a0_$include\u00a0) in file di programmi eseguibili.\u00a0 Alcuni oggetti di CLB\u00a0 sono stati gi\u00e0\u00a0 presentati nell&#8217;articolo\u00a0 sulla classe\u00a0gpu_program_preprocessor ( vedi direttive\u00a0\u00a0_$include\u00a0 e\u00a0\u00a0_$programs).<\/p>\n<p>CLB \u00e8 un linguaggio script interpretabile ed eseguibile nel framework di Colibr\u00ec; i programmi e le funzioni possono essere inseriti in librerie; Il programma \u00e8 eseguibile attraverso il comando __clb_exec\u00a0 inserito nel\u00a0 codice c++:<\/p>\n<pre class=\"lang:default decode:true\">__clb_exec(\u201cmy-program\u201d)\r\n<\/pre>\n<p>CLB \u00e8 stato sviluppato principalmente\u00a0 per scambiare informazioni con\/fra\u00a0 gli oggetti del software visibili all&#8217;interprete tramite un identificatore;\u00a0 lo scambio\u00a0 \u00e8 effettuato con il comando\u00a0 <em>__send<\/em>:<\/p>\n<pre class=\"lang:default decode:true\">__send(_$clbobject, v_$p1,v_$p2,..,v_$pn)\r\n\r\n<\/pre>\n<p>dove\u00a0_$clbobject \u00e8 uno degli identificatori\u00a0 di oggetti\u00a0 visibili nel software(ad esempio\u00a0\u00a0_$dock_gamut) e _$p1 .. _$pn\u00a0 sono parametri di CLB (clb_params);<\/p>\n<p>Se, ad esempio volessimo calcolare la riflettanza dalle coordinate lab\u00a0 (81,23,34)\u00a0 di un punto del gamut, potremmo usare questo codice CLB;<\/p>\n<pre class=\"lang:default decode:true\">lab=__par(_$lab, (81,23,34));\r\nrefl=__par(_$reflectance);\r\nprofile = __par(_$profile,\"epson_my_profile\");\r\n\r\n__send(profile,_$get, refl, _$from, lab );\r\n\r\n<\/pre>\n<p>lab , refl e profile\u00a0 sono\u00a0 \u00a0oggetti di tipo <span style=\"color: #800000;\"><em>clb_params<\/em> <\/span>istanziati nelle prime tre righe; come \u00e8 evidente sono tipizzate da _$<em>lab ,<\/em>\u00a0 _$<em>reflectance<\/em> e _$<em>profile<\/em>;\u00a0 inserite nel comando __send trasmettono l&#8217;informazione all&#8217;oggetto\u00a0 _$profile, il quale provveder\u00e0 a calcolare la riflettanza refl dalle coordinate lab.<\/p>\n<p>il primo argomento (profile) definisce l&#8217;oggetto che riceve il comando;<\/p>\n<p>la\u00a0\u00a0<em><span style=\"color: #800000;\">clb_keyword <\/span>_$get definisce l&#8217;azione da effettuare<\/em><\/p>\n<p><em>la\u00a0\u00a0<span style=\"color: #800000;\">clb_keyword<\/span> _$from<\/em>\u00a0\u00e8\u00a0la preposizione che identifica l&#8217;oggetto da trattare;<\/p>\n<p>gli oggetti <span style=\"color: #800000;\"><em>clb_param<\/em><\/span>\u00a0 \u00a0fra<em> _$get\u00a0 ..\u00a0 $from<\/em>\u00a0in genere possono essere modificati\u00a0 dal comando<\/p>\n<p>i parametri che seguono <em>_$from <\/em>sono gli argomenti forniti al calcolo, ed in genere non modificati dal comando.<\/p>\n<p>Il comando precedente \u00e8 equivalente alla frase inglese<\/p>\n<p style=\"text-align: center;\"><span style=\"color: #000080;\"><em>get reflectance from Lab\u00a0 using this profile<\/em><\/span><\/p>\n<p>il comando __get \u00e8, come abbiamo scritto, la funzione di interscambio informazioni fra gli oggetti di CLB; \u00e8 da considerare come una importante funzione di basso livello, progettata\u00a0 per interfacciare le classi del framework di Colibri. Come vedremo, sar\u00e0 possibile, ridefinendo proprie funzioni, non esporre il comando __get: ad esempio scrivere un programma CLB come il seguente<\/p>\n<pre class=\"lang:default decode:true\">_lab(lab,81,23,34);\r\n\r\n_profile(profile, \"epson_my_profile\")\r\n\r\n refl =_profile.reflectance(lab);\r\n<\/pre>\n<p>In questo esempio abbiamo usato le funzioni _lab e\u00a0 _profile scritti in CLB (vedremo come..) e salvati in una libreria,\u00a0 per definire ed inizializzare le due istanze\u00a0<em>clb_params<\/em>; l&#8217;interprete automaticamente creer\u00e0 dall&#8217;ultima riga il comando<\/p>\n<pre class=\"lang:default decode:true\">__send(profile,_$get, refl, _$from, lab );\r\n<\/pre>\n<p>Notare che la variabile <em>refl<\/em> \u00e8 istanziata automaticamente in fase di assegnazione e non necessita di alcuna dichiarazione preventiva; descriveremo in dettaglio la costruzione di questo\u00a0 programma di esempio dopo avere discusso di <em>clb_params<\/em>, <em>clb_operators<\/em> e <em>clb_function<\/em> nei prossimi articoli di presentazione del linguaggio. Analizzeremo le modalit\u00e0 di costruzione delle funzioni _lab , _profile<\/p>\n<p>Per concludere questa breve presentazione: abbiamo introdotto cinque classi di oggetti definibili in CLB:<\/p>\n<p style=\"text-align: center;\">\u00a0<span style=\"color: #000080;\"><em>clb_keyword, clb_params, clb_operator,\u00a0 clb_function, clb_programs<\/em><\/span><\/p>\n<p>descriveremo ciascuna tipologia di oggetti in articoli diversi;<\/p>\n<p>In questo primo articolo discuteremo degli oggetti di tipo clb_keyword che fanno parte del linguaggio e di come possono essere aggiunte nuove librerie di keywords;\u00a0 in seguito discuteremo degli oggetti\u00a0clb_params, usati per comunicare fra gli oggetti, e di quali keyword sono associabili alle\u00a0\u00a0<em>clb_params<\/em>; negli articoli successivi discuteremo di operatori, funzioni ed infine di organizzazione dei programmi;<\/p>\n<p><!--nextpage-->CLB usa le seguenti convenzioni di scrittura del codice per definire le denominazioni degli oggetti:<\/p>\n<h4><span style=\"color: #000080;\"><em><strong>clb_keyword:<\/strong><\/em><\/span><\/h4>\n<p>sono tutte nella forma\u00a0 <span style=\"color: #333399;\"><strong><span style=\"color: #ff0000;\">_$<\/span><\/strong><em>idname<\/em><\/span> dove\u00a0 il prefisso <strong><span style=\"color: #ff0000;\">_$<\/span><\/strong> informa che si tratta di una<em> <span style=\"color: #ff0000;\">clb_keyword<\/span> <\/em>e <em><span style=\"color: #000080;\">idname <\/span><\/em>\u00e8 la descrizione mnemonica che la identifica<\/p>\n<h4><span style=\"color: #000080;\"><em><strong>clb_param:<\/strong><\/em><\/span><\/h4>\n<p>un&#8217;oggetto\u00a0 di questo tipo \u00e8 sempre istanziato da una dichiarazione \u00a0__par(_$<em>idobj<\/em>,<em>init_data<\/em>), dove\u00a0_$<em>idobj<\/em> \u00e8 una <em>clb_keyword<\/em> e\u00a0<em>init_data<\/em> \u00e8 una sequenza di inizializzazione in seguito meglio specificata.<\/p>\n<h4><span style=\"color: #000080;\"><em><strong>clb_operator:<\/strong><\/em><\/span><\/h4>\n<p>consistono attualmente negli operatori\u00a0 aritmetici\u00a0 =, +,-, *, \/.<\/p>\n<h4><span style=\"color: #000080;\"><em><strong>clb_function:<\/strong><\/em><\/span><\/h4>\n<p>le funzioni sono sempre scritti nella forma:<\/p>\n<pre class=\"lang:default decode:true\">_$function _function_name (params)\r\n{\r\n...\r\n...  CLB code..\r\n...\r\n  \r\n}<\/pre>\n<p>dove _$function \u00e8 la clb_keyword che identifica la sua dichiarazione, _function_name \u00e8 il nome assegnato che inizia sempre con il carattere &#8216;_&#8217;.<\/p>\n<p><em>La sequenza params<\/em> identifica la sequenza di parametri accettata dalla funzione<\/p>\n<p>Le\u00a0<em>clb_function<\/em> rimandano sempre un valore <em>_$true o _$false<\/em> ad indicarne la corretta esecuzione (vedremo con esempio come..)<\/p>\n<h4><span style=\"color: #000080;\"><em><strong>clb_program:<\/strong><\/em><\/span><\/h4>\n<p>i programmi sono sempre scritti nella forma<\/p>\n<pre class=\"lang:default decode:true\">_$program $program_name\u00a0(params)\r\n\r\n{\r\n  ...\r\n  ... CLB code..\r\n  ...\r\n}\r\n<\/pre>\n<p>dove _$program \u00e8 la clb_keyword che identifica la sua dichiarazione e\u00a0 program_name\u00a0 \u00e8 il nome assegnato che inizia sempre con il carattere &#8216;$&#8217;.<\/p>\n<p><em>La sequenza params<\/em> identifica la sequenza di parametri accettata dal programma.<\/p>\n<p>Le<em><span style=\"color: #000000;\"> clb_program\u00a0<\/span><\/em>rimandano sempre un valore <em>_$true o _$false<\/em> ad indicarne la corretta esecuzione (vedremo con esempio come..)<\/p>\n<p>Le convenzioni di scrittura usate hanno lo scopo di semplificare la scrittura\/lettura del codice, facilitandone l&#8217;interpretazione. In fase di interpretazione del codice, eventuali errori di scrittura saranno evidenziati in una finestra di comunicazione);<\/p>\n<h3>inclusioni necessarie<\/h3>\n<p>Per utilizzare <em>CLB <\/em>in un programma c++ \u00e8 sufficiente includere\u00a0 nel codice la direttiva<\/p>\n<pre class=\"lang:default decode:true\">#include \"WIDGET_definition.h\"<\/pre>\n<p style=\"text-align: left;\">Questa inclusione contiene un #include\u00a0 &#8220;CLB_interpreter.h&#8221;, che definisce il motore dell&#8217;interprete.<\/p>\n<p>&nbsp;<\/p>\n<!--nextpage-->\n<p>Le keyword identificano quattro tipi di elementi:<\/p>\n<ul>\n<li><span style=\"color: #000080;\"><strong>valori costanti:\u00a0<\/strong> <\/span>ad esempio <em>_$true, _$false, _$yes, $no..<\/em><\/li>\n<li><span style=\"color: #000080;\"><strong>classi\u00a0 e oggetti del framework:<\/strong> <\/span>ad esempio <em>_$color, _$lab, $hue,\u00a0_$line_size, _$image, _$layout,_$float, _$int..\u00a0<\/em> possono essere utilizzati, come vedremo, per scambiare informazioni e argomenti con le <em>clb_function<\/em>;\u00a0 le keyword che definiscono classi e oggetti possono essere usate per generare istanze della classe stessa usando il metodo __new ;<\/li>\n<li><span style=\"color: #000080;\"><strong>verbi<\/strong>:<\/span> ad esempio <em>_$create, _$replace, _$destroy..<\/em> tutti i verbi indicano un&#8217;azione richiesta (in genere ad uno specifico oggetto).<\/li>\n<li><span style=\"color: #000080;\"><strong>preposizioni<\/strong><\/span>: ad esempio\u00a0<em> _$from, _$to..\u00a0<\/em><\/li>\n<\/ul>\n<p>Le keyword standard predefinite nel linguaggio sono contenute nel file CLB_keyword.h sotto riportato. Il file contiene tutte le keyword in ordine alfabetico<\/p>\n<pre class=\"height:300 lang:default decode:true \" title=\"CLB keywords\">#pragma region    --------------------------------&gt; A \r\n\r\n#define _$accept\t\t\tL\"accept\"\t\t\t\/\/ accettare (se successivo a _$query : accetti?)\r\n#define _$add\t\t\t\tL\"add\"\t\t\t\t\/\/ aggiungi alla lista dei selezionati un elemento\r\n#define _$all\t\t\t\tL\"all\"\r\n#define _$application\t\tL\"app\"\t\t\t\t\/\/ id dell'interfaccia APPLICATION\r\n#define _$attach\t\t\tL\"atch\"\t\t\t\t\/\/ collega un elemento con..\r\n#define _$average\t\t\tL\"avg\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; B\r\n\r\n#define _$background\t\tL\"backgrd\"\r\n#define _$bitmap\t\t\tL\"btmap\"\r\n#define _$border\t\t\tL\"bord\"\r\n#define _$brush\t\t\t\tL\"brush\"\r\n\r\n#pragma endregion \r\n#pragma region --------------------------------&gt; C\r\n\r\n#define _$call_back\t\t\tL\"callback\"\r\n#define _$canvas\t\t\tL\"canvas\"\t\t\t\/\/ widget di visualizzazione\/editin del documento\r\n#define _$captured\t\t\tL\"captured\"\r\n#define _$clear\t\t\t\tL\"clr\"\r\n#define _$color\t\t\t\tL\"color\"\t\t\t\/\/ oggetto colore\r\n#define _$color_table\t\tL\"col_tbl\"\t\t\t\/\/ tabella colori\r\n#define _$copy\t\t\t\tL\"cpy\"\t\t\t\t\/\/ verbo copiare\r\n#define _$connect\t\t\tL\"connect\"\t\t\t\/\/\/ richiesta di attivare una connessione per trasmissione automatica di un oggetto\r\n#define _$container\t\t\tL\"container\"\t\t\/\/ \r\n#define _$create\t\t\tL\"create\"\t\t\t\/\/ verbo creare\r\n#define _$croma\t\t\t\tL\"croma\"\t\t\t\/\/ croma\r\n#define _$cut\t\t\t\tL\"cut\"\t\t\t\t\/\/ verbo taglia\r\n\t\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; D\r\n\r\n#define _$delta\t\t\t\tL\"\u0394\"\t\t\t\t\/\/ delta colorimetrico\r\n#define _$deltaC\t\t\tL\"deltaC\"\r\n#define _$deltaE\t\t\tL\"deltaE\"\r\n#define _$deltaH\t\t\tL\"deltaH\"\r\n#define _$deltaL\t\t\tL\"deltaL\"\r\n#define _$destroy\t\t\tL\"destroy\"\t\t\t\/\/ verbo distruggere\r\n#define _$detach\t\t\tL\"detach\"\r\n#define _$display\t\t\tL\"display\"\r\n#define _$display_selected  L\"display_sel\"\t\t\/\/ visualizza elementi selezionati\r\n#define _$distance\t\t\tL\"dist\"\t\t\t\t\/\/ distanza\r\n#define _$document\t\t\tL\"document\"\t\t\t\/\/ documento\r\n#define _$draw\t\t\t\tL\"draw\"\t\t\t\t\/\/ verbo disegnare\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; E\r\n\r\n#define _$end\t\t\t\tL\"end\"\r\n#define _$ended\t\t\t\tL\"ended\"\r\n#define _$edit\t\t\t\tL\"edit\"\t\t\t\t\/\/ visualizza elementi selezionati\r\n#define _$effect\t\t\tL\"effect\"\t\t\t\/\/ effetto (filtraggio) \r\n#define _$exec\t\t\t\tL\"exec\"\t\t\t\t\/\/ esecuzione di un comando\r\n#define _$exist\t\t\t\tL\"exist\"\r\n#define _$export\t\t\tL\"export\"\t\t\t\/\/ esportazione di\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; F\r\n\r\n#define _$false\t\t\t\tL\"0\"\r\n#define _$fault\t\t\t\tL\"fault\"\r\n#define _$file\t\t\t\tL\"file\"\r\n#define _$file_name\t\t\tL\"fname\"\r\n#define _$fill\t\t\t\tL\"fill\" \r\n#define _$filter\t\t\tL\"fltr\"\r\n#define _$float\t\t\t\tL\"float\"\r\n#define _$focus\t\t\t\tL\"focus\"\r\n#define _$foreground\t\tL\"foregrd\"\r\n#define _$from\t\t\t\tL\"from\"\t\t\t\t\/\/  preposizioni da, dal, dai..\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; G\r\n\r\n\r\n#define _$gamut\t\t\t\tL\"gamut\"\r\n#define _$get\t\t\t\tL\"get\"\r\n#define _$get_preview\t\tL\"get_preview\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; H\r\n\r\n\r\n#define _$hatch\t\t\t\tL\"hatch\"\r\n#define _$hide\t\t\t\tL\"hide\"\t\t\t\t\/\/ nascondere, contrario di _$show\r\n#define _$hlc\t\t\t\tL\"hlc\"\t\t\t\t\/\/ classe hlc\r\n#define _$hue\t\t\t\tL\"hue\"\t\t\t\t\/\/ hue\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; I\r\n\r\n\r\n#define _$illuminant \t\tL\"illum\"\r\n#define _$image\t\t\t\tL\"image\"\r\n#define _$int\t\t\t\tL\"int\"\r\n#define _$interval\t\t\tL\"itv\"\t\t\t\t\/\/ intervallo \r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; J\r\n\r\n#define _$jump\t\t\t\t\"jmp\"\t\t\t\t\/\/ salta a \r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; K\r\n\r\n#define _$keyword\t\t\t\"kword\"\t\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; L\r\n\r\n#define _$lab\t\t\t\tL\"lab\"\t\t\t\t\/\/ spazio colore Lab\r\n#define _$lab_a\t\t\t\tL\"a\"\r\n#define _$lab_b\t\t\t\tL\"b\"\r\n\r\n#define _$layout\t\t\tL\"LY\"\t\t\t\t\/\/ id oggetti layout\r\n#define _$ly_img\t\t\tL\"lay_image\"\t\t\/\/ id sezione immagine \r\n#define _$ly_obj\t\t\tL\"LY_OBJECT\"\t\t\t\/\/ id sezione immagine \r\n#define _$ly_prt_mode\t\tL\"lay_prt_mode\"\t\t\/\/ modi di tracciamento di un layout\r\n#define _$ly_title\t\t\tL\"lay_tit\"\t\t\t\/\/ sezione titolo\t\r\n#define _$line_size\t\t\tL\"lnsize\"\t\t\t\/\/ spessore linea\r\n#define _$lum\t\t\t\tL\"lum\"\t\t\t\t\/\/ luminanza\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; M\r\n\r\n#define _$mask\t\t\t\tL\"msk\"\r\n#define _$menu\t\t\t\tL\"menu\"\r\n#define _$move\t\t\t\tL\"move\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; N\r\n\r\n#define _$not\t\t\t\t_$false\t\t\t\/\/ contrario di _$yes\r\n#define _$null\t\t\t\tL\"null\"\t\t\t\/\/\/ significato non definito, vuoto ecc; rimandato da  __exec_global_fn e __exec_obj_fn se la richiesta non \u00e8 soddisfatta\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; O\r\n\r\n#define _$object_3d\t\t\t L\"obj3d\"\t\t\t\/\/ oggetto 3d visualizzabile ed editabile in finestre 3d openGL\r\n#define _$object_db\t\t\tL\"objdb\"\t\t\t\/\/ oggetto derivato da DB_OBJECT\r\n#define _$obsserver\t\t\tL\"cie_obs\"\t\t\t\/\/ osservatore standard CIE\r\n#define _$only\t\t\t\tL\"only\"\t\t\t\t\/\/ solo.. \r\n#define _$organize\t\t\tL\"organize\"\t\t\t\/\/ modalit\u00e0 di organizzazione\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; P\r\n\/\/--------------------------------------------------------------------------------------------------------------------\r\n\r\n#define _$paste\t\t\t\tL\"paste\"\r\n#define _$pixels\t\t\tL\"pxl\"\t\t\t\t\r\n#define _$_pop\t\t\t\tL\"pop\" \r\n#define _$profile\t\t\tL\"profile\"\t\t\t\/\/ profilo colore\r\n#define _$_push\t\t\t\tL\"push\" \r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; Q\r\n\r\n#define _$query\t\t\t\tL\"query:\"\t\t\t\/\/ richiesta di informazioni, normalmente rispondere con _$yes o _$no\r\n#define _$queue\t\t\t\tL\"queue\"\t\t\t\/\/ coda generica, se necessario da specificare con successiva informazione\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; R\r\n\r\n#define _$ready\t\t\t\tL\"ready\"\r\n#define _$receive\t\t\tL\"receive\"\t\t\t\/\/ ricezione di.. segue l'idi del tipo di oggetto\r\n#define _$redo\t\t\t\tL\"redo\"\t\t\t\t\/\/ comando annulla _$undo\r\n\r\n#define _$reflectance\t\tL\"refl\"\t\t\t\t\/\/ oggetto riflettanza\r\n\r\n#define _$remove\t\t\tL\"remove\"\r\n#define _$replace\t\t\tL\"replace\"\r\n#define _$resize\t\t\tL\"resize\"\r\n#define _$restore\t\t\tL\"restore\"\r\n#define _$return\t\t\tL\"return\"\t\t\t\/\/\/ richiesta di ritorno di un oggetto\r\n#define _$rgb\t\t\t\tL\"rgb\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; S\r\n\r\n#define _$select\t\t\tL\"select\"\t\t\t\/\/ elimina lista e aggiungi l'elemento..\r\n#define _$selected\t\t\tL\"selected\"\r\n#define _$selected_area\t\tL\"selarea\"\t\t\t\/\/ selezionata area\r\n#define _$selected_point\tL\"selpoint\"\t\t\t\/\/ selezionato un punto\r\n#define _$set\t\t\t\tL\"set\"\r\n#define _$size\t\t\t\tL\"size\"\r\n#define _$show\t\t\t\tL\"show\"\t\t\t\t\/\/visualizza , contrario di _$hide\r\n#define _$solid\t\t\t\tL\"solid\"\r\n#define _$started\t\t\tL\"started\"\r\n#define _$string_empty\t\tL\"\"\t\t\t\t\t\/\/ stringa vuota\r\n#define _$style\t\t\t\tL\"style\"\r\n#define _$supported\t\t\tL\"suptd\"\t\t\t\/\/ usato per richiedere se una classe di funzioni \u00e8 supportata (classe o funzione o altra richiesta riconosciuta dall'elemento)\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; T\r\n\r\n#define _$type\t\t\t\tL\"type\"\t\t\t\/\/ tipo generico (interpretato dal contesto)\r\n#define _$thickness\t\t\tL\"thickn\"\t\t\/\/ spessore\r\n#define _$thumbnail\t\t\tL\"thumbnail\"\t\r\n#define _$to\t\t\t\tL\"to\"\t\t\t\/\/ preposizione \r\n#define _$transmit\t\t\tL\"transmit\"\t\t\/\/ inizia trasmissione automatica\r\n#define _$true\t\t\t\tL\"1\"\t\t\t\/\/ vero, equivalente a _$yes\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; U\r\n\r\n#define _$undo\t\t\t\tL\"undo\"\t\t\t\/\/ comando undo, ripristina\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; V\r\n\r\n#define _$view\t\t\t\tL\"view\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; W\r\n\r\n#define _$widget\t\t\tL\"widget\"\t\t\/\/ widget\r\n#define _$working\t\t\tL\"working\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; X\r\n\r\n#define _$xtract\t\t\tL\"xtract\"\t\t\/\/ verbo estrai\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; Y\r\n\r\n#define _$yes\t\t\t\t_$true\t\t\t\/\/ contrario di _$not\r\n<\/pre>\n<p><img decoding=\"async\" data-attachment-id=\"3308\" data-permalink=\"https:\/\/www.colorwave.it\/blog\/?attachment_id=3308\" data-orig-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-119.png?fit=24%2C24&amp;ssl=1\" data-orig-size=\"24,24\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"word-image\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-119.png?fit=24%2C24&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-119.png?fit=24%2C24&amp;ssl=1\" tabindex=\"0\" role=\"button\" class=\"size-full wp-image-3308 alignnone\" src=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-119.png?resize=24%2C24&#038;ssl=1\" alt=\"\" width=\"24\" height=\"24\" data-recalc-dims=\"1\" \/><em><span style=\"color: #000080;\">Altre keyword sono definite in inclusioni separate, per evidenziarne la similitudine funzionale: ad esempio il file CLB_dock_panels.h sotto riportato, contiene le keywords che identificano i PANEL visibili dall&#8217;interprete; ad esempio\u00a0_$dock_3d_gamut identifica il pannello di Colibri dove vengono visualizzati i gamut nello spazio Lab.\u00a0<\/span><\/em><\/p>\n<pre class=\"lang:default decode:true\" title=\"CLB_dock_panels.h\">...\r\n...\r\n...\r\n\r\n#pragma region DOCK_NAMES id dei PANEL visibili in CLB_language\r\n\/\/---------------------------------------------------------------------------\r\n#define _$dock_3d_gamut\t\t\t L\"DOCK_3DGAMUT\"\r\n#define _$dock_color_difference\t L\"DOCK_COLOR_DIFFERENCE\"\r\n#define _$dock_color_splitter\t L\"DOCK_IMAGE_SPLITTER\"\r\n#define _$dock_curve\t\t\t L\"DOCK_CURVE\"\r\n#define _$dock_edit_layout\t\t L\"DOCK_edit_layout\"\r\n#define _$dock_gamut\t\t\t L\"DOCK_GAMUT_ANALYSIS\"\r\n#define _$dock_image_color_tbl\t L\"DOCK_IMAGE_COLORS_SELECTION\"\r\n#define _$dock_image_metamerism\t L\"DOCK_IMAGE_METAMERISM\"\r\n#define _$dock_img_chn\t\t\t L\"DOCK_IMAGE_CHANNELS\"\r\n#define\t_$dock_img_mask\t\t\t L\"DOCK_IMAGE_MASK\"\r\n#define\t_$dock_img_measures\t\t L\"DOCK_IMAGE_MEASURES\"\r\n#define _$dock_printing_layout   _$dock_edit_layout \/\/  reindirizzato in attesa di eliminazione L\"DOCK_PRINTING_LAYOUT\"\r\n#define _$dock_recipe\t\t\t L\"DOCK_RECIPES\"\r\n#define _$dock_task_manager\t\t L\"DOCK_TASK_MANAGER\"\r\n\r\n#pragma endregion\r\n...\r\n...\r\n---\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dalla versione 7 il framework di Colibri mette a disposizione anche un linguaggio script,\u00a0CLB\u00a0,\u00a0 utilizzabile\u00a0 sia dallo sviluppatore che da\u00a0 un utente esperto dell&#8217;applicazione; buona parte degli sviluppi di Colibri nell&#8217;ultimo anno sono stati costruiti in questo modo, sia per l&#8217;interfaccia utente,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"aside","meta":{"_acf_changed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[114],"tags":[116,20,117,118],"jetpack_publicize_connections":[],"acf":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9rwsf-Xe","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3672"}],"collection":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/comments?post=3672"}],"version-history":[{"count":46,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3672\/revisions"}],"predecessor-version":[{"id":3719,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3672\/revisions\/3719"}],"wp:attachment":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media?parent=3672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/categories?post=3672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/tags?post=3672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}