Доброе время суток.
Возник вопрос по перегрузке атрибутов, но в "Адском программировании" не нашёл. В 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();
Ужасно. Кто ж такие идентификаторы в Аде использует? :)
ВФ
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти