Ada_Ru форум

Обсуждение языка Ада

Перегрузка атрибут ов

Оставить новое сообщение

Сообщения

u0410u043du0434u0440u0435u0439u
Перегрузка атрибут ов
2007-07-01 08:09:33

Доброе время суток.

 

Возник вопрос по перегрузке атрибутов, но в "Адском программировании" не нашёл. В ARM примеры на эту тему не очень понятные.

 

Пример:

 

type yes_no is new integer;

yes: constant yes_no := 1;

no: constant yes_no := 0;

 

В данном случае;

yes'Image -> "1";

no'Image -> "0"

 

Хотелось бы для атрибута определить свою функцию, возвращающую строку нужного вида.

for yes_no'Image use MyFunction;

 

Самое неприятное здесь, что MyFunction будет зависеть от констант yes и no.

Возможно эту же задачу можно решить определив перичислимый тип, но в этом случае требуеться указывать варианты в порядке возрастания их представления, что не очень удобно.

 

Буду благодарен за пример.

Marina-Ala wrote:

Cпасибо.

 

Эх, здравствуй Delphi:

 

IntToStr();

FloatToStr();

yes_noToStr();

 

А можно и так:

 

function Image (X : Integer) return String;

function Image (X : Float) return String;

function Image (X : Yes_No_Type) return String;

Хотелось бы для атрибута определить свою функцию, возвращающую

строку нужного вида.

for yes_no'Image use MyFunction;

 

Именно так. А прототип у не

function MyFunction (Arg : yes_no) return String;

 

ёВозможн оэт уж езадач уможн орешит ьопредели вперичислимы йти, пн о вэто мслуча етребуетьс яуказыват ьвариант ы впорядк евозрастани яи хпредставлени, ячт он еочен ьудобн.

оНе. т Ото, мка куказыват ьпредставлени enum :

http://www.adaic.com/standards/05rm/html/RM-13-4.html

 

--

If you want to get to the top, you have to start at the bottom

 

>Именно так. А прототип у неё

>function MyFunction (Arg : yes_no) return String;

 

Мой код

 

1 type yes_no is new integer;

2 function MyFunction(Arg: yes_no) return string;

3 for yes_no'Image use MyFunction;

 

сообщение компилятора:

3:1 attribute "Image" cannot be set with defination clause

3:1 representation item appears too late

3:1 primitive operations already defined for "integer"

 

Не хочет компилироваться.

Marina-Ala wrote:

 

Именно так. А прототип у неё

function MyFunction (Arg : yes_no) return String;

 

 

Мой код

1 type yes_no is new integer;

2 function MyFunction(Arg: yes_no) return string;

3 for yes_no'Image use MyFunction;

 

сообщение компилятора:

3:1 attribute "Image" cannot be set with defination clause

3:1 representation item appears too late

3:1 primitive operations already defined for "integer"

 

Не хочет компилироваться.

 

Дык, правильно не хочет! attribute_definition_clause неприменима

к атрибуту 'Image. Что до остальной диагностики - тут надо текст видеть.

Sergey I. Rybin

 

>attribute_definition_clause неприменима к атрибуту 'Image.

 

Это следует понимать как невозможность перегрузки атрибута 'Image?

--------------------------------------------------------------

GNAT GPL 2007 (20070405-41)

Copyright 1992-2007, Free Software Foundation, Inc.

 

Compiling: attributes.adb (source file time stamp: 2007-07-01 23:35:00)

1. with Ada.Text_IO;

2.

3. use Ada.Text_IO;

4.

5. procedure attributes is

6.

7. type yes_no is new integer;

8. for yes_no'Image use MyFunction(Arg);

|

>>> attribute "image" cannot be set with definition clause

9. function MyFunction(arg: yes_no) return string is

10. begin

11. return "yes_no Image";

12. end MyFunction;

13.

14. yes: constant yes_no :=1;

15.

16. begin

17.

18. Put_line(MyFunction(yes));

19.

20. Put_line(yes'Img);

21.

22.

23. end attributes;

 

23 lines: 1 error

-------------------------------------------------------------

Marina-Ala wrote:

 

Sergey I. Rybin

>attribute_definition_clause неприменима к атрибуту 'Image.

 

Это следует понимать как невозможность перегрузки атрибута 'Image?

Перегрузка (overloading) определена лишь для *объявленных* процедур и

функция (включая перечислимые литералы). (8.3(7):

 

The declarations of callable entities (including enumeration literals)

are overloadable, meaning that overloading is allowed for them.

 

Атрибуты же *объявленными* подпрограммами не являются, поэтому перегрузка

для них невозможна по определению.

 

То, что определено в 13.3 (Operational and Representation Attributes),

есть не перегрузка, а спецификации представления. Некоторые свойства

некоторых сущностей, которые программист может доставать посредством

атрибутов (ну, скажем, 'Size), могут быть (пере)определены программистом,

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

это свойство можно узнать или использовать. 'Image в число таких свойств

(атрибутов) не входит.

 

13.3(5/1) явно говорит:

 

An attribute_designator is allowed in an attribute_definition_clause

only if this International Standard explicitly allows it, or for an

implementation-defined attribute if the implementation allows it.

Each specifiable attribute constitutes an operational aspect or aspect

of representation.

 

Если посмотреть определение атрибута 'Image в 3.5 (35), там явного

разрешения его переопределять нет.

 

Cпасибо.

 

Эх, здравствуй Delphi:

 

IntToStr();

FloatToStr();

yes_noToStr();

IntToStr();

FloatToStr();

yes_noToStr();

Ужасно. Кто ж такие идентификаторы в Аде использует? :)

ВФ

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти