Правильно ли я понимаю этот термин – макросы это возможность вставить в код произвольный текст, меняющийся по каким-то настройкам или кейвордам?
Вот мне в Delphi очень не хватает чего-то такого. У меня есть, например, класс TIntArray: это динамический массив из интегеров, со всевозможными функциями типа поиска или сортировки. А если мне надо, чтобы этот массив поддерживал другой тип данных – например, double – мне приходится создавать ещё один такой класс, например TDoubleArray, и дублировать весь базовый код.
Очевидно, было бы очень полезно иметь возможность такой декларации:
Type
TAnyArray[%Macr1]=class;
FCount: integer;
FCapacity: integer;
FItems: array of %MacrVar1
...
И далее объявление:
Var
MyExtArray:TAnyArray[%’Extended’]
Ну в общем как-то так, я полагаю все поняли мою мысль. В других языках такое есть?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Макросы это код, исполняющийся на этапе компиляции, результатом которого является другой код, который будет компилироваться. То, что ты описываешь, называется шаблон (generic). В Delphi они поддерживаются. Конечно с какой-то точки зрения шаблоны можно назвать макросами и макросами можно их эмулировать, если в языке нет поддержки шаблонов (например в С так иногда делают).
K>Правильно ли я понимаю этот термин – макросы это возможность вставить в код произвольный текст, меняющийся по каким-то настройкам или кейвордам?
Различают текстовые макросы и синтаксические макросы.
В С++ первые реализуются препроцессором.
Простая текстовая подстановка — замена одного фрагмента текста на другой.
Такой текстовый макропроцессор абсолютно не зависит от компилятора и языка.
Вторые макросы (синтаксические) — это шаблоны.
В этом случае после подстановки компилятор проверяет синтаксис получившейся конструкции.
Тут уже реализация происходит внутри парсера компилятора.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Khimik, Вы писали:
K>Ну в общем как-то так, я полагаю все поняли мою мысль. В других языках такое есть?
То что ты описал — это шаблоны (С++), которые можно назвать частным случаем синтаксических макросов с параметризацией только типами и целочисленными константами.
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Здравствуйте, Khimik, Вы писали: K>Правильно ли я понимаю этот термин – макросы это возможность вставить в код произвольный текст, меняющийся по каким-то настройкам или кейвордам?
Типа такого:
var
x:
{$ifdef Win32}
Cardinal
{$else}
int64
{$endif}
K>Вот мне в Delphi очень не хватает чего-то такого. У меня есть, например, класс TIntArray: это динамический массив из интегеров, со всевозможными функциями типа поиска или сортировки. А если мне надо, чтобы этот массив поддерживал другой тип данных – например, double – мне приходится создавать ещё один такой класс, например TDoubleArray, и дублировать весь базовый код. https://habr.com/post/314780/ K>Очевидно, было бы очень полезно иметь возможность такой декларации:
Либо возмите любой скриптовый язык и сгенерите все необходимые варианты своим препроцессором
Скрытый текст
#!/usr/bin/lua
function template(G) G=G or _G return function(text)
text=text:gsub('{{([^}]+)}}',function(value) local res=G
for name in value:gmatch "[^%.]+" do
local p,fn=name:find('|') if p then fn=name:sub(p+1) name=name:sub(1,p-1) end
res=res[name] if res==nil then error("no "..value) end
if type(res)=='function'then res=res() end
if p then fn:gsub('[^|]+',function(f) if G[f]==nil then error("no "..f) end res=G[f](res) end) end
end
if res==nil then error("no value "..value) end return res
end)
return text
end end
function capitalise(s) return s:gsub("^.",string.upper) end
T=template{ name="double", c=capitalise }
print(T[[
Type
T{{name|c}}Array=class;
FCount: integer;
FCapacity: integer;
FItems: array of{{name}}
...
И далее объявление:
Var
MyExtArray:T{{name|c}}Array
]])
<?php
$name="double";
$cname=ucfirst($name);
?>
Type
T<?=$cname?>Array=class;
FCount: integer;
FCapacity: integer;
FItems: array of <?=$name?>
...
И далее объявление:
Var
MyExtArray:T<?=$cname?>Array
Здравствуйте, anonymouse2, Вы писали:
A>Здравствуйте, Khimik, Вы писали:
K>>Ну в общем как-то так, я полагаю все поняли мою мысль. В других языках такое есть?
A>То что ты описал — это шаблоны (С++), которые можно назвать частным случаем синтаксических макросов с параметризацией только типами и целочисленными константами.
Я немного почитал про шаблоны в Delphi — это .inc? Я пока ещё не очень въехал, можете на моём примере написать как реализовать что мне нужно (избежать дублирования кода для двух похожих классов)?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
K>>Правильно ли я понимаю этот термин – макросы это возможность вставить в код произвольный текст, меняющийся по каким-то настройкам или кейвордам? _>Типа такого: _>
Шаблоны в дельфях зовутся "дженериками"
K>Я немного почитал про шаблоны в Delphi — это .inc? Я пока ещё не очень въехал, можете на моём примере написать как реализовать что мне нужно (избежать дублирования кода для двух похожих классов)?
Здравствуйте, Khimik, Вы писали:
K>Вот мне в Delphi очень не хватает чего-то такого. У меня есть, например, класс TIntArray: это динамический массив из интегеров, со всевозможными функциями типа поиска или сортировки. А если мне надо, чтобы этот массив поддерживал другой тип данных – например, double – мне приходится создавать ещё один такой класс, например TDoubleArray, и дублировать весь базовый код.
Здравствуйте, Wolverrum, Вы писали:
W>Здравствуйте, Khimik, Вы писали:
W>Шаблоны в дельфях зовутся "дженериками"
K>>Я немного почитал про шаблоны в Delphi — это .inc? Я пока ещё не очень въехал, можете на моём примере написать как реализовать что мне нужно (избежать дублирования кода для двух похожих классов)?
W>http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Overview_of_Generics
1) Если я правильно понимаю, этими дженериками нельзя реализовать, например, инлайновые функции?
2) Можно ли всё-таки реализовать инлайновые функции модулями .inc?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, LaptevVV, Вы писали:
LVV>Различают текстовые макросы и синтаксические макросы.
А еще бывают макрогенераторы — например, как в ассемблере System/360. Там фактически язык внутри языка — черта лысого можно нагенерить, по любым мыслимым алгоритмам. После такого стандартный сишный препроцессор видится крайним убожеством, а плюсовые шаблоны — извращенной заумью.
Здравствуйте, Khimik, Вы писали:
W>>http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Overview_of_Generics
K>1) Если я правильно понимаю, этими дженериками нельзя реализовать, например, инлайновые функции? K>2) Можно ли всё-таки реализовать инлайновые функции модулями .inc?
стоп-стоп-стоп.
Современный Паскаль позволяет инлайнить (как подсказка для компилятора, т.е. — по обстоятельствам), и это независимая от дженериков фича.
Дженерики Паскаля как и везде — абстрагируют код от конкретного типа данных (обобщают код на различные типы)
И тебе в принципе, дозволено эти фичи относительно свободно комбинировать.
(upd) PS А еще можно поверх Паскаля повесить макропроцессор типа StringTemplate или M4 — и в довесок получить незамутненные Си-стайл макросы: source -> M4 -> Compilier -> result
ЕМ>А еще бывают макрогенераторы — например, как в ассемблере System/360. Там фактически язык внутри языка — черта лысого можно нагенерить, по любым мыслимым алгоритмам. После такого стандартный сишный препроцессор видится крайним убожеством, а плюсовые шаблоны — извращенной заумью.
Евгений, препроцессор С++ — это простейший текстовый макропроцессор.
А макросы на ассемблере я писал еще в 1974 году...
Еще даже не на ЕС, а на БЭСМ-6.
Рекомендую почитать основополагающий труд по макросам: http://ru.b-ok.xyz/book/3370738/221bb6
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>>А макросы на ассемблере я писал еще в 1974 году... LVV>>Еще даже не на ЕС, а на БЭСМ-6. ЕМ>Кстати, макропроцессор автокода БЕМШ — почти точная копия с System/360.
Возможно.
Хотя сама машина — абсолютно не похожа.
Да и оси были разные. Дубна и Диспак — это "две большие разницы"...
Я, естественно, писал на БЭМШ под Диспак.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Khimik, Вы писали:
K>Ну в общем как-то так, я полагаю все поняли мою мысль. В других языках такое есть?
Посмотри в сторону языка Ада...
Ну и наверное уже написали, что препроцессор С можно запускать просто как прекомпилятор...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, anonymouse2, Вы писали:
A>То что ты описал — это шаблоны (С++), которые можно назвать частным случаем синтаксических макросов с параметризацией только типами и целочисленными константами.
Забыл указатели на глобальные объекты и специализации...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском