<<< BACK NEXT >>>

ОБЪЯВЛЕНИЕ БЛОКОВ - ПРОТОТИПИРОВАНИЕ

   Имена блоков, определенных в программном модуле, имеют видимость в пределах всей программы. Для локализации поля видимости имен внутри модуля должна быть использована инструкция
 
   internal <описатель блока> {, <описатель блока> }

<описатель блока> ::= [<описатель типа>] [ <дескриптор массива> ] <имя блока>
                     [([<дескриптор переменной>] {, < дескриптор переменной> })]

[<описатель типа>] [ <дескриптор массива> ] задают описание возвращаемого блоком значения.

Пример:

internal <int> bl_1( <int> y1, x1 ), =>
         <null> bl_2( <ListValue> list, <tagStru> stru ),
         bl_3, <tagStru> [] bl_4 ( <char> symbol )

   В Caper 4 каждый блок, представленный в internal, интерпретируется как определение структуры и, тем самым, порождается новый тип. Имя блока интерпретируется как тэговое имя структуры. Компилятором Caper в такую структуру стандартно включаются элементы, описываемые как

<block>  body
<тип>    return

где <тип> - тип возвращаемого значения. Так, описанные выше блоки будут представляться структурами:

struct bl_1 { <int> return, =>
              <block> body, =>
              <int>   y1,   =>
              <int>   x1    =>
            }

 

struct bl_2 { <null>  return,   =>
              <block> body,     =>
              <ListValue> list, =>
              <tagStru> stru    =>
            }

struct bl_3 { <null>  return, =>
              <block> body }

struct bl_4 { <tagStru> [] return, =>
              <block> body,        =>
              <char> symbol }

   Важным отличием от обычных структур является инициализация элемента body указанием блока. Элемент body может быть изменен в процессе выполнения программы.

Пример:

internal bl_examp
build private <bl_1> blk

blk.body := bl_examp

Следующая инструкция похожа на internal, однако служит несколько иным целям, а именно, созданию классов (типов) блоков. Данная инструкция не описывает реальные блоки:
 
prototype <описатель блока> {, <описатель блока> . . . }

В <описатель блока> задается имя не реального блока, а класса блоков. На данное имя может опираться реальное определение блока.

Использование прототипа блока осуществляется в операторе internal:

prototype <int> ADDITIVE ( <int> x, y )

internal <as  ADDITIVE> bl_1, <as ADDITIVE> bl_2

Тем самым bl_1 и bl_2 должны быть реально определены и, согласно прототипу, должны иметь по два целочисленных параметра и возвращать <int>.
Оператор prototype может быть использован для создания общих описаний блоков для множества модулей.

  

<<< BACK NEXT >>>