Эйффель


Комментарий

-- комментарий

Класс

 
[indexing   -- для документации
    description: "описаниекласса"
    author: "Автор"]
class имязаглавными буквами
[inherit суперкласс]...-- возможно много суперклассов
[creation список конструкторов, через запятую]
feature
 переменные
 методы
end
 
feature может быть много
 
feature –определяет публичные свойства
feature {NONE} – приватные
feature {} – тоже приватные
feature{A} –публичные только для класса A
feature {A,B} – публичные только для классов А, В
 

Абстрактные классы

Определяются словом deffered. Абстрактныеметоды также имеют этот определитель.
Пример:
deferred class COMPARABLE
infix "<" (other:like Current):BOOLEAN is
deferred
ensure
smaller: Result implies not (Current >= other)
end-- infix "<"
 

Переопределеление методов(redefine)

class X
inherit Y
redefine printend

print is do … end
 
 

Переименование свойств (rename)

class CLIENT_LIST
inherit THREE_COL_TABLE[STRING,INTEGER,REAL]
rename
left as name,
middle as account_no,
right as current_balance,
insert_left as insert_name,
insert_mid as insert_account,
insert_right as insert_balance
end
end-- CLIENT_LIST
 
 

Метод

имя[(аргументы_см_переменные)][:тип]is
[locale локальныепеременные]
do
 ...
end
 
Для возврата из метода значения используется переменная Result:
Result:=значение – как в дельфи
 
пример:
factorial(i:INTEGER):INTEGER is
local count:INTEGER
do
 from   count := 0;   Result := 1;
until count = I  loop
count := count + 1;
Result := Result * count;
 end-- loop
end -- factorial;
 
Для методов, которые выполняются единожды, предусмотрен блокonce:
io :STD_FILESis
once
!!Result
end
 
Можно описывать свои операторы:
infix “оператор”
postfix “оператор”
prefix “оператор”
 
Например:
infix "<" ,smaller_than(c: DELUXE_CLOCK):BOOLEAN is …
 

Передача по ссылке – не работает, работает, тольков external

Осуществляется с помощью типа ANY
 
ls(x:ANY) is do x:=10 end

local f:INTEGER
do
ls(f)

 

Внешние процедуры на С

any_routine( arg1: INTEGER; arg2:REAL) is
    external "C" alias "_c1"
end

Переменные

пер1 [, пер2]… : тип [is значение];
 
При описании переменных возможно указать тип переменной, каку другой переменной, с помощью like:
clone(other:ANY): like other;
deep_clone(other:ANY): like other;
 
 

Типы и константы

тип
константазначение по умолчанию
CHARACTER
‘B’
символ с № 0
INTEGER
‘B’, 10
0
REAL
10.0, 192e40
0.0
DOUBLE
 
0.0
STRING
“строка”
“”
BOOLEAN
true, false
false
POINTER
 
нулевой указатель
 

Блок do

do --выполняется единожды
 …
end
 

Цикл

from [инициализация]
[invariant Assertion]
[variant Integer_expression]
until условие
loop
 ...
end
пример:
from
 multiplier:= 0
until
 multiplier= 12
loop
 multiplier := multiplier +1;
end
 

Условие

if условие then ...
[elseif условие then ...]
else
...
end
 

Инвариантное условие (case)

inspect выражение
when множество then ...
[when множествоthen ...]...
[else ...]
end
 
Пример
 
inspect x + y
when 0 then compound
when 25, 67,87 then compound
when 1..10 then compound
when 11..20, 31..40 thencompound
when 90..100 then compound
else compound
end
 

Исключения

require

Проверка аргументов и свойств объекта на соответствиеусловиям осуществляется в начале метода:
метод is
require условия
...
 
пример:
fibonachii (n:INTEGER): like n is
require n>=0
...
 
n не можетбыть меньше нуля. Если же n меньше нуля, то программазавершиться, предварительно распечатав стэк. Перед каждым условием можно ставитьметку:
 
require
  balance: balance<=balance+78;
  n: n/=2*k;
 
тогда метка будет отображаться при распечатке стэка
 

ensure

используется, для проверки условиям после процедуры:
метод is
do
 ...
ensure условия
end
 
например:
 
n: INTEGER;
 
met is
do
 n:=n+u;
ensure met: oldn<n
end
 
Проверяет – правильно изменилась n входе выполнения процедуры или нет

old

Позволяет узнать значение переменной до выполнения процедуры.Используется только в ensure и rescue
 

invariant

Указывает, что переменные должны удовлетворять определённымзначениям всюду в указанном классе:
 
class CALC
feature
...
invariant
 upper_limit: hour < 24 and min < 60 and sec < 60;
 lower_limit: hour >= 0 and min >= 0 and sec >= 0;
end
 

check

Проверяет возникновение исключительных ситуаций в коде:
 
check
<identifier> ":" boolean_expression";"
<identifier> ":" boolean_expression";"
 ...
end
 
Пример:
 
cl1 is
do
...
check
 can_be_incremented: clock1.sec < 59 or clock1.min < 59 or clock1.hour <23
end
...
end
 

variant и invariant в цикле

 
есливыполняется условие в invariant, то срабатывает variant
 
Пример:
 
exp(n:REAL, p:INTEGER):REALis
require non_neg_args: p >= 0 and n > 0
local count:INTEGER
do
from
 Result := 1;
 count := 0;
   invariant    count < p + 1;
   variant       p - count
until count = p
loop
  Result := Result * n;
  count := count + 1;
end --loop
ensure
-- returns n to power of p
end-- exp
 

rescue

«Ловит» исключительные ситуации.

retry

Используется для восстановления из исключительной ситуации.
Может находиться только в блоке rescue.
retry указывает,что нужно выполнить метод в котором он находиться сначала.
 

Операторы

Математические операторы

+ - * /
^ -- возведение в степень
// -- целочисленное деление (только INTEGER)
\\ -- остаток от деления (только INTEGER)
 

Логические операторы

not
and                  and then
or                     xor                   orelse
implies
 
and then и or else эквивалентныand и or. Отличие в том, что выражениеза and then не вычисляется, если первое выражение false.И наоборот – выражение за or else не вычисляется, если выражениеперед ним – true.
 
a implies b ~ not a or else b
 
 

a   b    a implies b
t    t    t
t    f    f
f    t    t
f    f    t
 

Операторы сравнения

<  >  <=  >=  /=  =

Оператор like

возвращает тип переменной:
fib(n:INTEGER): like n is ... ~fib(n:INTEGER): INTEGER is ...
 

Создание объекта. Оператор !!

![тип]!переменная
 
!! то же самое как и now(переменная)в паскале
 

Приведение типов. Оператор ?=

Используется для приведения типов.
 
Пример:
Наследуются классы (A на вершине иерархии): A->B->C->D
find_class(a:CLASS_A) is
local
b:CLASS_B;c:CLASS_C; d:CLASS_D;
do
b ?= a;
if b = Void then c ?= a
 if c = void then d ?= a
  if d = Void then e? = a
   if e = Void then f ?= a
    if f = Void then g ?= a
     if g= Void then -- must be type A
     else -- is type G
    end -- if
  else -- is type F
  end -- if
else -- is type E
end --if
else -- is type D
end --if
else-- is type C
end --if
else -- is type B
end --if
end-- find_class
 

Специальные символы

В строках есть комбинации символов, заменяемыхна специальные символы:
Символ         Комбинация            Описание
@                           %A                                        Atsign
BS                          %B                                         Backspace
^                             %C                                         Circumflex
$                             %D                                        Dollar
FF                           %F                                         FormFeed
\                              %H                                        Backslash
~                             %L                                         tilda
NL(LF)                   %N                                        Newline
`                              %Q                                        back quote
CR                          %R                                         carriagereturn
#                             %S                                         sharp
HT                          %T                                         horizontaltab
NUL                       %U                                        nulcharacter
|                               %V                                         verticalbar
%                            %%                                        percent
'                               %'                                           singlequote
"                             %"                                         doublequote
[                              %(                                          openingbracket
]                              %(                                          closingbracket
{                             %{                                         openingbrace
}                             %}                                         closingbrace
 

Командная строка программы

Аргументами командной строки можно пользоваться с помощью функций argument_count и argument(номер_аргумента):
 
   make is
      do
         if argument_count /= 1 or else not argument(1).is_integer  then
           io.put_string("Usage: ");
            io.put_string(argument(0));
           io.put_string(" <Integer_value>%N");
           die_with_code(exit_failure_code);
         end;

...
      end
 

Пустая ссылка void

В С называется NULL, в Паскале – nil, а в Eiffel –Void. C POINTER не работает, работает с ANY

Классы

В Eiffel всетипы являются классами – INTEGER также.
Иерархия классов начинается с класса ANY.
Существуют генерируемые классы, которые создаются на основедругих классов. Например:
class THREE_COL_TABLE [C1,C2,C3]
feature
lft_col:ARRAY[C1];
mid_col:ARRAY[C2];
rt_col:ARRAY[C3];
...
 
 

POINTER

Указатель. Получить указатель на нужную переменную можноиспользуя оператор $.
x:POINTER;
i:INTEGER;

x:=$i;
 

STRING

Для сравнения строк используется метод is_equal, как вJava:
a.is_equal(b)
 
создание строки в 10 символов: !!a_string.make(10);
 
a.append(b) – добавить b к a
a.prepend(b) – вставить b перед a
a.precede(c) – вставитьсимвол с перед а
a.extend(c) – вставить символс после а
a.put(i, c) – установить символ на i-юпозицию
a.fill_blank - fills target string withblanks
a.head(n) – удалить изстроки всё, кроме первых n символов
a.tail -- removes all but last n characters
a.left_adjust -- removes leading blanksfrom target string
a.right_adjust -- removes trailing blanksfrom target
a.remove(i) - удалить i-й символ
a.remove_all_occurrences -- removes alloccurrences of a specified character
a.to_lower --конвертировать строку в нижний регистр
a.to_upper –конвертировать строку в верхний регистр
a.size – размер строки
 

ARRAY

names :ARRAY[STRING];
employees : ARRAY[PERSON]
sensor_readings: ARRAY[REAL];
 
в [] указывается тип элементовмассива
 
Создание массива
make( minindex:INTEGER; maxindex:INTEGER);
Пример
!!employees.make(-5,100)
 
a.count – возвращает количество элементовмассива
a.lower – возвращает нижний индекс
a.upper – верхний
a.resize(0,15) изменяетразмер и границы массива
a.item(i) – возвращает i-й элемент
a @ i – то же самое
a.put(i, c) – установить элемент на i-юпозицию

I.force(2,8) – установить 2-ку в 8-ю ячейку и расширить массив доэтой ячейки, если он недостаёт

 
I := << 12, 9, 8, 5 ,90, 17, 21 >> -- инициализация массива
 
matrix :ARRAY[ARRAY[INTEGER]] – многомерные массивы

LINKED_LIST

Transformers
forth – переместить курсор на один элемент вперёд
back – переместить курсор на один элемент назад
start – переместить курсор на один первый элемент
finish – на последний
go_to_ith (i:INTEGER) – на i-й элемент
add_left(v: like item)– добавить элемент в левую от курсор на позицию
add_right (v: like item) – в правую
remove_left – удалить элемент слева от курсора
remove_right – справа
remove – на позиции курсора
Accessors
before :BOOLEAN– курсор указывает в начало списка?
after:BOOLEAN – в конец?
off:BOOLEAN – перед илипосле?
isfirst:BOOLEAN – курсор указывает на 1-й элемент?
islast:BOOLEAN– на последний?
item : G – вернуть элемент на позиции курсора
first: like item – первый элемент
last: like item – последний
previous: like item – перед курсором
next: like item – за курсором