Разработка программ в среде операционной платформы Inferno


Limbo: коммуникация каналов и основные графические возможности - часть 3


В 13-й посредством ключевого слова load и константы PATH, содержащей путь к модулю, создается ссылка на реализацию библиотечного модуля Sys, которая присваивается переменной sys. Происходит связывание программы с модулем, при этом первая получает доступ ко всем данным и методам последнего. В следующей строке под номером 14 переменной n присваивается значение количества элементов в списке параметров.

Limbo присуща легкость в организации упреждающей многозадачности (другими словами, созданию асинхронных, независимых нитей, совместно использующих одно общее пространство памяти) и управлении взаимодействием между ними с помощью коммуникационного канала. В 15-й строке программы объявляется канал-коммуникатор sync целого типа. Далее, строка 16, с использованием оператора spawn инициируется отдельная нить targ, служащая темпо-регулятором показа параметров командной строки; с этого момента функции init и targ будут запускаться параллельно в независимых нитях. 17-я служит комментарием - в Limbo комментарии начинаются с шарпа и распространяются на всю оставшуюся строку. В строках с 18-й по 22-ю задается цикл секундного ожидания и вывода параметров командной строки. Инкремент (фигурирующий в заголовке цикла) допускается только в постфиксной форме. Перемещение по элементам argv выполняется посредством операторов hd (первый элемент списка) и tl (часть списка без первого элемента). Последнее выражение цикла - ожидание значения, получаемого из канала. В targ же совершается секундная задержка, - это строка 27, где функция sys->sleep получает время в миллисекундах как аргумент, и отправка единицы. После n-передач выполняется выход из цикла.

01 implement Targ2; 02 03 include "sys.m"; 04 sys: Sys; 05 include "draw.m"; 06 draw: Draw; 07 Point, Rect, Display, Image, Font, Screen, Context: import draw; 08 09 Targ2: module { 10 init: fn (ctxt: ref Draw->Context, argv: list of string); 11}; 12 13 init (ctxt: ref Draw->Context, argv: list of string) 14 { 15 sys = load Sys Sys->PATH; 16 draw = load Draw Draw->PATH; 17 18 display:= ctxt.display; 19 screen:= ctxt.screen; 20 21 black:= display.color (Draw->Black); 22 grey:= display.rgb (192,192,192); 23 font:= Font.open (display, "*default*"); 24 wr:= Rect ((100,100), (325,150)); 25 r:= Rect ((125,110), (300,140)); 26 27 win:= screen.newwindow (wr, Draw->White); 28 29 n:= len argv; 30 for (i:= 0; i < n; i++) { 31 win.draw (r, grey, nil, r.min); 32 win.text (r.min.add ((5,8)), black, (0,0), font, string i+": "+hd argv); 33 argv = tl argv; 34 sys->sleep (1000); 35 } 36}




Начало  Назад  Вперед