Почему-то захотелось поделиться ссылкой - PL/I
Я лет двадцать назад читал про него книжку. Ещё папину. И решал задачи из "примеров".
Почему захотелось поделиться?
Там даже числа Фиббоначи или факториалы можно было макросами разворачивать.
В контексте вот этого - О возбуждении исключений
Если найдётся кто-то дотошный - тогда поясню.
Поясню пока лишь вскользь, там можно написать что-то вроде (я синтаксис уже не помню, поэтому использую паскалеподобный):
MACRO NameAndValue (R, A)
begin
R.Value := A;
R.Name := '%A%';
end;
Тогда если мы напишем:
TMyRec = record
Value : Int64;
Name : String;
end;
var
myRec : TMyRec;
NameAndValue(myRec, SomeValue)
То это развернётся в:
myRec.Value := SomeValue;
myRec.Name := 'SomeValue';
Т.е. те же "шаблоны" из C++, но с "подстановкой".
Я могу путать детали. Скорее всего я их путаю. Но хотелось бы "идею донести".
Почему "обработка исключений"?
А вот почему:
Цитата:
Можно было бы конечно "сочинить" что-то вроде:
-- но я осознанно этого не делаю.
Т.к. конечно запись короче и "читабельнее".
Но! В таком варианте - сложнее искать реальный источник ошибки.
Конец цитаты.
А вот если бы можно было бы написать:
-- тогда - я бы обязательно воспользовался бы подобной конструкцией.
Как бы выглядел бы этот Check?
А вот так:
-- для разработки и "реального программирования" это конечно же - бред.
А вот для диагностики ошибок - самое то.
В "моих скриптах" я кстати подобное уже сделал.
Я лет двадцать назад читал про него книжку. Ещё папину. И решал задачи из "примеров".
Почему захотелось поделиться?
Там даже числа Фиббоначи или факториалы можно было макросами разворачивать.
В контексте вот этого - О возбуждении исключений
Если найдётся кто-то дотошный - тогда поясню.
Поясню пока лишь вскользь, там можно написать что-то вроде (я синтаксис уже не помню, поэтому использую паскалеподобный):
MACRO NameAndValue (R, A)
begin
R.Value := A;
R.Name := '%A%';
end;
Тогда если мы напишем:
TMyRec = record
Value : Int64;
Name : String;
end;
var
myRec : TMyRec;
NameAndValue(myRec, SomeValue)
То это развернётся в:
myRec.Value := SomeValue;
myRec.Name := 'SomeValue';
Т.е. те же "шаблоны" из C++, но с "подстановкой".
Я могу путать детали. Скорее всего я их путаю. Но хотелось бы "идею донести".
Почему "обработка исключений"?
А вот почему:
Цитата:
Можно было бы конечно "сочинить" что-то вроде:
Em3InvalidStreamPos.Check(Self.IsValidPosition,
aHeader.f_Name,
[l_Pos,
aHeader.f_TOCItemData.rBody.rRealSize,
aHeader.f_TOCItemData.rBody.RTOCBuffRootPosition,
aHeader.f_TOCItemData.rBody.RTOCItemListPosition,
aHeader.f_TOCItemData.RNextPosition]);
-- но я осознанно этого не делаю.
Т.к. конечно запись короче и "читабельнее".
Но! В таком варианте - сложнее искать реальный источник ошибки.
Конец цитаты.
А вот если бы можно было бы написать:
Em3InvalidStreamPos.Check(Self.IsValidPosition,
[
NameAndValue(l_Pos),
NameAndValue(aHeader.f_TOCItemData.
rBody.rRealSize),
NameAndValue(aHeader.f_TOCItemData.
rBody.RTOCBuffRootPosition),
NameAndValue(aHeader.f_TOCItemData.
rBody.RTOCItemListPosition),
NameAndValue(aHeader.f_TOCItemData.RNextPosition)
]);
-- тогда - я бы обязательно воспользовался бы подобной конструкцией.
Как бы выглядел бы этот Check?
А вот так:
type
TNameAndValue = record
Name : String;
Value : Int64;
constructor Create(const aName: String; aValue: Int64);
end;//TNameAndValue
....
constructor Create(const aName: String; aValue: Int64);
begin
Name := aName;
Value := aValue;
end;
MACRO NameAndValue (A)
begin
TNameAndValue.Create('%A%', A');
end;
class procedure Em3InvalidStreamPos.Check(aCondition: TInt64Predicate; const aValues array of TNameAndValue);
var
l_V : TNameAndValue;
begin
for l_V in aValues do
if not aCondition(l_V.Value) then
raise Self.CreateFmt('Invalid data: %s = %d', [l_V.Name, l_V.Value]);
end;
-- для разработки и "реального программирования" это конечно же - бред.
А вот для диагностики ошибок - самое то.
В "моих скриптах" я кстати подобное уже сделал.
Комментариев нет:
Отправить комментарий