Эйффель
-- комментарий
[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 "<"
class X
inherit Y
redefine printend
…
print is do … end
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 …
Осуществляется с помощью типа 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 --выполняется единожды
…
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
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
Проверка аргументов и свойств объекта на соответствиеусловиям осуществляется в начале метода:
метод is
require условия
...
пример:
fibonachii (n:INTEGER): like n is
require n>=0
...
n не можетбыть меньше нуля. Если же n меньше нуля, то программазавершиться, предварительно распечатав стэк. Перед каждым условием можно ставитьметку:
require
balance: balance<=balance+78;
n: n/=2*k;
тогда метка будет отображаться при распечатке стэка
используется, для проверки условиям после процедуры:
метод is
do
...
ensure условия
end
например:
n: INTEGER;
met is
do
n:=n+u;
ensure met: oldn<n
end
Проверяет – правильно изменилась n входе выполнения процедуры или нет
Позволяет узнать значение переменной до выполнения процедуры.Используется только в ensure и rescue
Указывает, что переменные должны удовлетворять определённымзначениям всюду в указанном классе:
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
<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
есливыполняется условие в 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 указывает,что нужно выполнить метод в котором он находиться сначала.
+ - * /
^ -- возведение в степень
// -- целочисленное деление (только 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
< > <= >= /= =
возвращает тип переменной:
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
В С называется 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];
...
Указатель. Получить указатель на нужную переменную можноиспользуя оператор $.
x:POINTER;
i:INTEGER;
…
x:=$i;
Для сравнения строк используется метод 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 – размер строки
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]] – многомерные массивы
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 – за курсором