this post was submitted on 24 Feb 2024
13 points (76.0% liked)
Programming
17270 readers
39 users here now
Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!
Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.
Hope you enjoy the instance!
Rules
Rules
- Follow the programming.dev instance rules
- Keep content related to programming in some way
- If you're posting long videos try to add in some form of tldr for those who don't want to watch videos
Wormhole
Follow the wormhole through a path of communities [email protected]
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
So I am going to explain the concept of macro preprocessors to you
m5.awk is a macro preprocessor, so is m4 so is GPP so is C's CPP, so is my Ekipp and so is my AllocPP.pl. They all work like this:
1- Frank Frankis (hereby referred to as FF) creates a file called
my-file.randext
randext
here meaning that macro prerpcoessors work on all kind of files, be it a C code, a Python code, an HTML template, your tax files, your notes to your GF, your angry letter to your boss, etc;2- There are dozens and dozens of uses for a macro preprocessors, but let's say FF wants to obliterate two birds with one sniper shot, he wishes to write a manual for his new Car XAshtray (TM), in HTML and Markdown, but he wants it to be contained within one single file -- and he wishes to reuse certain fragments of text, certain HTML tags, certain Markdown syntaxes, to be 'reusable', just like a 'function' is reusable piece of code in an imperative language (but not a functional language!) or how a template works in C++, etc.
3- FF enters the file with his favorite text editor. He defines these 'functions', which are the 'macro' part of a macro preprocessor. Think what 'macro' means. It means 'big picture' basically. I think the better term here is 'meta'. These two words have a close relationship in the English language, don't they?
Now let's see what macro preprocessor FF uses. Since GPP is really similar in syntax to C's preprocessor (at least with default settings) let's use GPP. I would use my Ekipp here but I honestly have forgotten the syntax (believe it or not, creating a language does not mean you are good at it).
FF keeps defining these. Now comes writing the actual manual.
Keep in mind that GPP stands for 'Generic Preprocessor', it's a text macro prerpcoessor and not a language preprocessor like CPP (C's preprocessor) is. m4 and Ekipp are like that. My AllocPP.pl is a language preprocessor, it preprocesses C. So now, this means FF can now freely treat
my-file.randext
as a text file, with a 'language', the Macro Preprocessor language, defining the output (I'll talk about what I mean by 'output' soon).So he writes his manual:
Replace the last ellipse with rest of the text, the Car Ashtray manual.
Now, FF needs to 'preprocess' this text file. This is, well, the 'preprocessing' part of a macro preprocessor. It's like compiling a program with a compiler, except you are compiling text-to-text instead of text-to-binary.
gpp -DMyMacro=MyValue my-file.randext > my-manual.md
#! delimexec $ ''awk "{ print $1; }"'' | <== foo bar ==>
sudo apt-get install libreadline-dev libgc-dev libunistring-dev wget -qO- https://raw.githubusercontent.com/Chubek/Ekipp/master/install.sh | sudo sh
Thanks, I appreciate your effort a lot and I understand the usecase now!