r1 - 04 Jun 2005 - 01:25:22 - OrloVYou are here: TWiki >  Refaldevel Web > RefalPlus > RefalPlusBookExt

Дополнительные возможности Рефала Плюс

Запись чисел и литер в шестнадцатиричной системе

Неотрицательные целые числа можно записывать в виде

          0xZZZ...ZZ

где ZZZ...ZZ - непустая последовательность шестнадцатиричных цифр.

Например, 0xFF и 0xff эквивалентны 255.

Изображения литер, входящие в изображения цепочек символов-литер и символов-слов, могут записываться в виде

          \xZZ

где ZZ - две шестнадцатиричные цифры, задающие ASCII-код литеры. При этом изображения символов-слов должны заключаться в двойные кавычки.

Например, "\x2A" и "\x2a" эквивалентны "*".

Новые функции в библиотеке функций

BIT: операции с цепочками битов

В библиотеку добавлен новый модуль BIT.

Функции из модуля BIT работают с цепочками двоичных цифр, представленными целыми числами.

Каждое целое число изображает цепочку двоичных цифр бесконечную влево. При этом в случае положительного числа эта цепочка содержит конечное число единиц, а в случае отрицательного - конечное число нулей. Например:

     +3   ...000011
     +2   ...000010
     +1   ...000001
     +0   ...000000
     -1   ...111111
     -2   ...111110
     -3   ...111101

Разряды нумеруются справа налево, начиная с нуля.

$func  BIT-OR   s.Int1 s.Int2 = s.Int;
$func  BIT-AND  s.Int1 s.Int2 = s.Int;
$func  BIT-XOR  s.Int1 s.Int2 = s.Int;

  • BIT-OR выдает поразрядное "или" двух аргументов.
  • BIT-AND выдает поразрядное "и" двух аргументов.
  • BIT-XOR выдает поразрядное исключающее "или" двух аргументов.

$func  BIT-NOT  s.Int = s.Int;

  • BIT-NOT выдает поразрядное логическое отрицание аргумента.

$func  BIT-LEFT   s.Int s.Shift = s.Int;
$func  BIT-RIGHT  s.Int s.Shift = s.Int;

  • BIT-LEFT выдает результат логического сдвига s.Int на s.Shift разрядов влево, если s.Shift неотрицательно, или на минус s.Shift разрядов вправо, если s.Shift отрицательно.
  • BIT-RIGHT выдает результат логического сдвига s.Int на s.Shift разрядов вправо, если s.Shift неотрицательно, или на минус s.Shift разрядов влево, если s.Shift отрицательно.

$func? BIT-TEST   s.Int s.Pos = ;

  • BIT-TEST выдает неуспех, если разряд s.Pos числа s.Int равен нулю, в противном случае результатом является пустое выражение.

$func  BIT-SET    s.Int s.Pos = s.Int;
$func  BIT-CLEAR  s.Int s.Pos = s.Int;

  • BIT-SET устанавливает разряд s.Pos числа s.Int в 1 и выдает полученное число в качестве результата.
  • BIT-CLEAR устанавливает разряд s.Pos числа s.Int в 0 и выдает полученное число в качестве результата.

$func  BIT-LENGTH s.Int = s.Len;

  • BIT-LENGTH выдает "длину" числа s.Int. А именно, если s.Int неотрицательно, выдается номер позиции самого правого нуля, слева от которого нет ни одной единицы. Если же число отрицательно, выдается номер самой правой единицы, слева от которой нет ни одного нуля.

Например:

     <BIT-LENGTH  3>     ==>  2
     <BIT-LENGTH  2>     ==>  2
     <BIT-LENGTH  1>     ==>  1
     <BIT-LENGTH  0>     ==>  0
     <BIT-LENGTH -1>     ==>  0
     <BIT-LENGTH -2>     ==>  1
     <BIT-LENGTH -3>     ==>  2

$func  BIT-PRINT   s.Int = ;

  • BIT-PRINT печатает s.Int в шестнадцатеричном виде.

DOS: связь с операционной системой

В модуль DOS добавлены следующие функции.

$func  DELAY s.MSeconds = ;
$func  SLEEP s.Seconds = ;
$func  RANDOM s.Max = s.Rand;  /* 0 <= s.Rand < s.Max */
$func  RANDOMIZE = ;

  • DELAY задерживает исполнение программы на s.MSeconds миллисекунд.
  • SLEEP задерживает исполнение программы на s.Seconds секунд.
  • RANDOM выдает случайное целое число в интервале от 0 до s.Max минус 1.
  • RANDOMIZE инициализирует генератор случайных чисел случайным начальным значением.

Работа с экраном

Координаты позиций экрана

Координаты позиций экрана задаются в виде двух неотрицательных целых чисел: s.Row s.Col, где s.Row - номер строки экрана, а S.Col - номер колонки экрана. Строки и колонки нумеруются с 0, начиная с левого верхнего угла экрана.

Окна

Каждое окно имеет номер: целое число от 1 до 255. Экран считается особым фиктивным окном с номером 0. В каждый момент времени одно из окон считается текущим. Все функции ввода-вывода работают с верхним окном (или с фиктивным окном номер 0, если нет ни одного окна). Визуально текущее окно находится поверх других, и его содержимое полностью видимо.

При вводе-выводе все координаты позиций задаются относительно левого верхнего угла содержимого текущего окна.

Несколько окон могут иметь один и тот же номер. При этом, если в аргументах какой-то операции над окнами указан номер окна, операция выполняется над самым верхним из окон, имеющих этот номер.

Обработка ошибок

Координаты позиций экрана и размеры полей и окон должны быть целыми числами. Атрибуты литер - целыми числами от 0 до 255. Номера окон - целыми числами от 0 до 255.

Если функции даны аргументы, для которых хотя бы одно из этих условий не выполнено, выдается ошибка $error(Fname "Invalid argument").

Если функции даны координаты, выходящие за пределы экрана, выдается ошибка $error(Fname "Invalid cursor values").

При попытке выполнить операцию над несуществующим окном, выдается ошибка $error(Fname "Unknown window").

При попытке выполнить операцию над верхним окном, когда не существует ни одного окна, выдается ошибка $error(Fname "No window").

При попытке что-то сделать с несуществующей рамкой окна, выдается ошибка $error(Fname "No frame").

При попытке задать такие параметры окна, при которых оно не помещается на экране, выдается ошибка $error(Fname "Invalid argument").

CONIO: работа с экраном

$func? KEY-PRESSED? = ;
$func  READ-KEY = s.Char;

  • KEY-PRESSED? выдает неуспех, если буфер ввода с клавиатуры пуст, в противном случае результатом является пустое выражение.
  • READ-KEY выдает очередную литеру, введенную с клавиатуры. Если буфер ввода пуст, функция ожидает ввода очередной литеры.

$func  GET-SCR-CHAR-ATTR  s.Row s.Col = s.Ch s.Attr;
$func  PUT-SCR-CHAR  s.Row s.Col s.Ch = ;
$func  PUT-SCR-ATTR  s.Row s.Col s.Attr = ;

  • GET-SCR-CHAR-ATTR выдает литеру s.Ch и ее атрибут s.Attr находящиеся в позиции s.Row s.Col.
  • PUT-SCR-CHAR помещает литеру s.Ch в позицию s.Row s.Col. Атрибут позиции при этом не меняется.
  • PUT-SCR-ATTR помещает атрибут s.Attr в позицию s.Row s.Col. Литера позиции при этом не меняется.

$func  GET-FIELD-STR  s.Row s.Col s.Length = s.Chars;
$func  PUT-FIELD-STR  s.Row s.Col s.Length s.Chars = ;
$func  PUT-FIELD-ATTR  s.Row s.Col s.Length s.Attr = ;

Эти функции работают с полями. Каждое поле задается координатами его начала s.Ros s.Col и его длиной s.Length, и должно целиком помещаться в текущем окне.

  • GET-FIELD-STR выдает содержимое поля длиной s.Length в виде символа-слова.
  • PUT-FIELD-STR помещает цепочку литер s.Chars, заданную в виде символа-слова в указанное поле. Если длина цепочки больше, чем s.Length, используются только первые s.Length литер цепочки. Если длина цепочки меньше, чем s.Length, остаток поля заполняется пробелами справа. Атрибуты позиций поля при этом не меняются.
  • PUT-FIELD-ATTR помещает атрибут s.Attr во все позиции поля. Литеры позиций поля при этом не меняются.

$func  GET-CURSOR  = s.Row s.Col;
$func  SET-CURSOR  s.Row s.Col = ;

  • GET-CURSOR выдает координаты курсора в текущем окне.
  • SET-CURSOR устанавливает курсор в указанную позицию внутри текущего окна.

$func  GET-CURSOR-FORM  = s.StartLine s.EndLine;
$func  SET-CURSOR-FORM  s.StartLine s.EndLine = ;

Форма курсора определяется номером начальной строки развертки и номером конечной строки развертки, которые представляют собой небольшие неотрицательные целые числа s.StartLine и s.Endline.

  • GET-CURSOR-FORM выдает текущую форму курсора.
  • SET-CURSOR-FORM устанавливает форму курсора.

$func  GET-ATTRIBUTE  = s.Attr;
$func  SET-ATTRIBUTE  s.Attr = ;

С каждым окном связан текущий атрибут записи. Когда функции ввода-вывода помещают литеры в текущее окно, эти литеры получают атрибут, равный текущему атрибуту записи этого окна.

  • GET-ATTRIBUTE выдает значение текущего атрибута записи.
  • SET-ATTRIBUTE устанавливает новое значение для текущего атрибута записи.

$func  GET-TEXT-MODE  = s.Rows s.Cols;

  • GET-TEXT-MODE выдает текущий размер экрана.

$func  CLEAR-SCREEN = ;

  • CLEAR-SCREEN очищает экран в пределах текущего окна, при
этом используется текущее значение атрибута окна.

$func  CWRITE    e.Exp = ;
$func  CWRITELN  e.Exp = ;
$func  CPRINT    e.Exp = ;
$func  CPRINTLN  e.Exp = ;

  • CWRITE пишет в текущее окно изображение выражения e.Exp.
  • CWRITELN делает то же самое, что и CWRITE, но в конце добавляет литеры "возврат каретки" и "конец строки".
  • CPRINT преобразует выражение e.Exp в цепочку литер так же, как это делает функция TO-CHARS, и выводит его в текущее окно.
  • CPRINTLN делает то же самое, что и CPRINT, но в конце добавляет литеры "возврат каретки" и "конец строки". Вывод литеры "возврат каретки" передвигает курсор в начало текущей строки. Вывод литеры "конец строки" передвигает курсор на следующую строку, не перемещая его по горизонтали. Таким образом, для перехода на следующую строку требуется вывести две литеры: "возврат каретки" и "конец строки".

WINDOW: работа с окнами

$const  NO-FRAME = -1;

$func  MAKE-WINDOW
         s.WindowNo s.WindowAtt s.FrameAtt s.FrameStr
         s.Row s.Col s.Height s.Width = ;
$func  MAKE-WINDOW!
         s.WindowNo s.WindowAtt s.FrameAtt s.FrameStr
         s.Row s.Col s.Height s.Width
         s.ClearWindow s.FrameStrPos s.FrameTypeStr = ;

MAKE-WINDOW и MAKE-WINDOW! создают новое окно, которое становится текущим. При этом задаются следующие параметры.

  • s.WindowNo - номер создаваемого окна.
  • s.WindowAtt - атрибут записи для содержимого окна.
  • s.FrameAtt - атрибут рамки и заголовка окна. Если этот параметр равен -1, окно не будет иметь рамку и заголовок. В этом случае параметры s.FrameStr, s.FramePos и s.FrameTypeStr игнорируются.
  • s.FrameStr - заголовок окна (в виде символа-слова).
  • s.Row и s.Col - координаты левого верхнего угла окна по отношению к экрану.
  • s.Height и s.Width - высота и ширина окна (включая рамку, если таковая имеется).
  • s.ClearWindow - указывает, следует ли очищать текстовую область создаваемого окна. Если параметр равен 0, в области текста окна остается то, что было до его создания. Если параметр равен 1, область текста заполняется пробелами.
  • s.FrameStrPos - указывает, где должен быть расположен заголовок окна. Если параметр равен 255, заголовок будет отцентрирован. Если параметр - целое число от 0 до 254, заголовок сдвигается вправо на эту величину от левого края окна.
  • s.FrameTypeStr - указывает как чертить рамку окна. Должен быть символом-словом, содержащим цепочку из ровно шести литер, каждая из которых используется для вычерчивания одного из элементов рамки:
    • 1я   верхний левый угол
    • 2я   верхний правый угол
    • 3я   нижний левый угол
    • 4я   нижний правый угол
    • 5я   горизонтальная линия
    • 6я   вертикальная линия

Функция MAKE-WINDOW позволяет задавать только первые восемь параметров. При этом для остальных, по умолчанию, принимаются следующие значения:

    s.ClearWindow    1 (очищать окно)
    s.FrameStrPos    255 (центрировать заголовок)
    s.FrameTypeStr   "\xDA\xBF\xC0\xD9\xC4\xB3" (нормальная рамка)

$func  CURRENT-WINDOW-NO  = s.WindowNo;
$func  CURRENT-WINDOW = 
         s.WindowNo s.WindowAtt s.FrameAtt s.FrameStr
         s.Row s.Col s.Height s.Width;
$func  CURRENT-WINDOW! =
         s.WindowNo s.WindowAtt s.FrameAtt s.FrameStr
         s.Row s.Col s.Height s.Width
         s.ClearWindow s.FrameStrPos s.BorderChars ;

Эти функции позволяют узнать параметры текущего окна. Если ни одного окна не существует, выдаются параметры фиктивного окна с номером 0, соответствующего экрану.

$func? EXIST-WINDOW?  s.WindowNo = ;
$func  SHIFT-WINDOW  s.WindowNo = ;
$func  REMOVE-WINDOW  = ;
$func  REMOVE-WINDOW!  s.WindowNo s.Refresh = ;

  • EXIST-WINDOW выдает неуспех, если не существует ни одного окна с номером s.WindowNo, в противном случае результат - пустое выражение.
  • SHIFT-WINDOW делает окно с номером s.WindowNo текущим.
  • REMOVE-WINDOW удаляет текущее окно, при этом восстанавливается часть экрана, находившаяся под этим окном.
  • REMOVE-WINDOW! удаляет самое верхнее из окон с номером s.WindowNo. Параметр s.Refresh указывает, нужно ли восстанавливать часть экрана, находившуюся под этим окном. Если параметр равен 0, восстановление не делается, если равен 1 - делается.

$func  RESIZE-WINDOW!  s.Row s.Col s.Height s.Width = ;

  • RESIZE-WINDOW устанавливает новое положение и размеры текущего окна.

$func  SET-WINDOW-ATTR  s.Attr = ;
$func  SET-FRAME-ATTR  s.Attr = ;
$func  SET-WINDOW-FRAME  s.FrameAtt s.FrameStr s.FrameStrPos
                        s.BorderChars = ;

  • SET-WINDOW-ATTR - устанавливает новое значение атрибута записи для текущего окна и устанавливает этот атрибут для всего содержимого окна.
  • SET-FRAME-ATTR - устанавливает новое значение атрибута для рамки окна.
  • SET-WINDOW-FRAME - устанавливает новые параметры заголовка и рамки окна. При этом окно должно иметь рамку, т.е. иметь старое значение s.FrameAtt отличное от 0.

$func  CLEAR-WINDOW  = ;

  • CLEAR-WINDOW очищает содержимое окна, заполняя его пробелами.

$func  SCROLL s.NoOfRows  s.NoOfCols = ;

  • SCROLL сдвигает содержимое окна на s.NoOfRows строк и s.NoOfCols столбцов. Положительное значение s.NoOfRows означает сдвиг вверх, а отрицательное - сдвиг вниз. Положительное значение s.NoOfCols означает сдвиг влево, а отрицательное - сдвиг вправо.

$func  GET-WINDOW-STR  = s.ScreenString;
$func  PUT-WINDOW-STR  s.ScreenString = ;

  • GET-WINDOW-STR выдает содержимое окна в виде символа-слова, содержимое которого получается из содержимого окна следующим образом. От каждой строки окна отбрасываются все хвостовые пробелы, после чего к каждой строке добавляется литера "конец строки".
  • PUT-WINDOW-STR помещает в окно текст, представленный содержимым символа-слова s.ScreenString. При этом текст заносится в окно в соответствии со следующими принципами.
    • Если в тексте больше строк, чем в окне, лишние строки игнорируются.
    • Если в тексте меньше строк, чем в окне, оставшиеся строки окна заполняются пробелами.
    • Если длина строки текста больше, чем ширина текста в окне, лишние литеры строки отбрасываются.
    • Если длина строки текста меньше, чем ширина текста в окне, остаток строки окна заполняется пробелами.
Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r1 | More topic actions
 
R+

This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback