Макросы
От: Khimik  
Дата: 06.11.18 17:49
Оценка:
Правильно ли я понимаю этот термин – макросы это возможность вставить в код произвольный текст, меняющийся по каким-то настройкам или кейвордам?
Вот мне в Delphi очень не хватает чего-то такого. У меня есть, например, класс TIntArray: это динамический массив из интегеров, со всевозможными функциями типа поиска или сортировки. А если мне надо, чтобы этот массив поддерживал другой тип данных – например, double – мне приходится создавать ещё один такой класс, например TDoubleArray, и дублировать весь базовый код.
Очевидно, было бы очень полезно иметь возможность такой декларации:


Type
  TAnyArray[%Macr1]=class;
    FCount: integer;
    FCapacity: integer;
    FItems: array of %MacrVar1
...

И далее объявление:

  Var
    MyExtArray:TAnyArray[%’Extended’]


Ну в общем как-то так, я полагаю все поняли мою мысль. В других языках такое есть?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Макросы
От: vsb Казахстан  
Дата: 06.11.18 17:55
Оценка: +1
Макросы это код, исполняющийся на этапе компиляции, результатом которого является другой код, который будет компилироваться. То, что ты описываешь, называется шаблон (generic). В Delphi они поддерживаются. Конечно с какой-то точки зрения шаблоны можно назвать макросами и макросами можно их эмулировать, если в языке нет поддержки шаблонов (например в С так иногда делают).
Отредактировано 06.11.2018 17:56 vsb . Предыдущая версия .
Re: Макросы
От: LaptevVV Россия  
Дата: 06.11.18 18:03
Оценка:
K>Правильно ли я понимаю этот термин – макросы это возможность вставить в код произвольный текст, меняющийся по каким-то настройкам или кейвордам?
Различают текстовые макросы и синтаксические макросы.
В С++ первые реализуются препроцессором.
Простая текстовая подстановка — замена одного фрагмента текста на другой.
Такой текстовый макропроцессор абсолютно не зависит от компилятора и языка.

Вторые макросы (синтаксические) — это шаблоны.
В этом случае после подстановки компилятор проверяет синтаксис получившейся конструкции.
Тут уже реализация происходит внутри парсера компилятора.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Макросы
От: anonymouse2 Иностранный Агент
Дата: 06.11.18 18:59
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Ну в общем как-то так, я полагаю все поняли мою мысль. В других языках такое есть?


То что ты описал — это шаблоны (С++), которые можно назвать частным случаем синтаксических макросов с параметризацией только типами и целочисленными константами.
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Re: Макросы
От: kov_serg Россия  
Дата: 06.11.18 19:44
Оценка:
Здравствуйте, 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
]])

https://www.lua.org/cgi-bin/demo

Type
  TDoubleArray=class;
    FCount: integer;
    FCapacity: integer;
    FItems: array of double
...


И далее объявление:

  Var
    MyExtArray:TDoubleArray


или во php
<?php
$name="double";
$cname=ucfirst($name);
?>
Type
  T<?=$cname?>Array=class;
    FCount: integer;
    FCapacity: integer;
    FItems: array of <?=$name?>
...


И далее объявление:

  Var
    MyExtArray:T<?=$cname?>Array
Re[2]: Макросы
От: Khimik  
Дата: 07.11.18 03:54
Оценка:
Здравствуйте, anonymouse2, Вы писали:

A>Здравствуйте, Khimik, Вы писали:


K>>Ну в общем как-то так, я полагаю все поняли мою мысль. В других языках такое есть?


A>То что ты описал — это шаблоны (С++), которые можно назвать частным случаем синтаксических макросов с параметризацией только типами и целочисленными константами.


Я немного почитал про шаблоны в Delphi — это .inc? Я пока ещё не очень въехал, можете на моём примере написать как реализовать что мне нужно (избежать дублирования кода для двух похожих классов)?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[2]: Макросы
От: Khimik  
Дата: 07.11.18 03:56
Оценка:
K>>Правильно ли я понимаю этот термин – макросы это возможность вставить в код произвольный текст, меняющийся по каким-то настройкам или кейвордам?
_>Типа такого:
_>
_>var
_>  x:
_>  {$ifdef Win32} 
_>    Cardinal 
_>  {$else}
_>    int64
_>  {$endif}
_>


Это явно не то, мне не надо чтобы перед каждой компиляцией требовалось отдельно задавать настройки проекта.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Макросы
От: Wolverrum Ниоткуда  
Дата: 07.11.18 07:55
Оценка: 4 (1)
Здравствуйте, Khimik, Вы писали:

Шаблоны в дельфях зовутся "дженериками"

K>Я немного почитал про шаблоны в Delphi — это .inc? Я пока ещё не очень въехал, можете на моём примере написать как реализовать что мне нужно (избежать дублирования кода для двух похожих классов)?


http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Overview_of_Generics
Отредактировано 07.11.2018 7:55 Wolverrum . Предыдущая версия .
Re: Макросы
От: ArtDenis Россия  
Дата: 09.11.18 15:25
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Вот мне в Delphi очень не хватает чего-то такого. У меня есть, например, класс TIntArray: это динамический массив из интегеров, со всевозможными функциями типа поиска или сортировки. А если мне надо, чтобы этот массив поддерживал другой тип данных – например, double – мне приходится создавать ещё один такой класс, например TDoubleArray, и дублировать весь базовый код.


http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Overview_of_Generics
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[4]: Макросы
От: Khimik  
Дата: 09.11.18 16:31
Оценка:
Здравствуйте, Wolverrum, Вы писали:

W>Здравствуйте, Khimik, Вы писали:


W>Шаблоны в дельфях зовутся "дженериками"


K>>Я немного почитал про шаблоны в Delphi — это .inc? Я пока ещё не очень въехал, можете на моём примере написать как реализовать что мне нужно (избежать дублирования кода для двух похожих классов)?


W>http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Overview_of_Generics


1) Если я правильно понимаю, этими дженериками нельзя реализовать, например, инлайновые функции?
2) Можно ли всё-таки реализовать инлайновые функции модулями .inc?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[2]: Макросы
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 09.11.18 19:31
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Различают текстовые макросы и синтаксические макросы.


А еще бывают макрогенераторы — например, как в ассемблере System/360. Там фактически язык внутри языка — черта лысого можно нагенерить, по любым мыслимым алгоритмам. После такого стандартный сишный препроцессор видится крайним убожеством, а плюсовые шаблоны — извращенной заумью.
Re[5]: Макросы
От: Wolverrum Ниоткуда  
Дата: 09.11.18 22:28
Оценка: 4 (1)
Здравствуйте, 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
Отредактировано 09.11.2018 22:32 Wolverrum . Предыдущая версия .
Re[3]: Макросы
От: LaptevVV Россия  
Дата: 11.11.18 19:35
Оценка:
ЕМ>А еще бывают макрогенераторы — например, как в ассемблере System/360. Там фактически язык внутри языка — черта лысого можно нагенерить, по любым мыслимым алгоритмам. После такого стандартный сишный препроцессор видится крайним убожеством, а плюсовые шаблоны — извращенной заумью.
Евгений, препроцессор С++ — это простейший текстовый макропроцессор.
А макросы на ассемблере я писал еще в 1974 году...
Еще даже не на ЕС, а на БЭСМ-6.
Рекомендую почитать основополагающий труд по макросам: http://ru.b-ok.xyz/book/3370738/221bb6
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Макросы
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.11.18 20:41
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>препроцессор С++ — это простейший текстовый макропроцессор.


Оттого и грустно.

LVV>А макросы на ассемблере я писал еще в 1974 году...

LVV>Еще даже не на ЕС, а на БЭСМ-6.

Кстати, макропроцессор автокода БЕМШ — почти точная копия с System/360.
Re[5]: Макросы
От: LaptevVV Россия  
Дата: 13.11.18 11:18
Оценка:
LVV>>А макросы на ассемблере я писал еще в 1974 году...
LVV>>Еще даже не на ЕС, а на БЭСМ-6.
ЕМ>Кстати, макропроцессор автокода БЕМШ — почти точная копия с System/360.
Возможно.
Хотя сама машина — абсолютно не похожа.
Да и оси были разные. Дубна и Диспак — это "две большие разницы"...
Я, естественно, писал на БЭМШ под Диспак.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Макросы
От: Erop Россия  
Дата: 20.11.18 11:39
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Ну в общем как-то так, я полагаю все поняли мою мысль. В других языках такое есть?


Посмотри в сторону языка Ада...


Ну и наверное уже написали, что препроцессор С можно запускать просто как прекомпилятор...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Макросы
От: Erop Россия  
Дата: 20.11.18 11:40
Оценка:
Здравствуйте, anonymouse2, Вы писали:

A>То что ты описал — это шаблоны (С++), которые можно назвать частным случаем синтаксических макросов с параметризацией только типами и целочисленными константами.


Забыл указатели на глобальные объекты и специализации...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.