Why higher-order macros ? if you know a bit about Brainfunct, you know how to add two numbers (say from a [b] you want to get [a+b] 0 where [] indicates the BF data pointer position.) You do this: [-<+>]< This is nicely put into a macro 'add': & add = [-<+>]< ; But what if the numbers to add are separated by a longer distance ? you'll want for instance: & add2 = [-<<+>>]<< ; & add3 = [-<<<+>>>]<<< ; now, you'd like to use the distance as _parameter_ of your macro. The first idea is to provide under the form of <<< and >>>: & add_n ( go_left | go_right ) = [ - go_left + go_right ] go_left ; so now, instead of [-<<<+>>>]<<< you can write add_n(<<<|>>>) but this has two drawbacks: first you have to put all these '<' and '>' in your call (even if that is already a big improvement, in cases more complicated than add); second, there are two parameters to represent your morally unique parameter 'distance': this is not clean, and is error-prone. It would be nice if you could pass the distance itself to the macro: add_N(3) No problem ! Imagine 3 is a macro that triples its argument: &3(x)=x x x; then you can write: & add_N ( distance ) = [ - distance(<) + distance(>) ] distance(<) ; where 'distance' is now a _macro_ parameter that you call in add_N's code. add_N's code is a bit long, but you can make it shorter (and easier to understand) using locally defined macros: & add_N ( distance ) = &go_left= distance(<); &go_right = distance(>); [ - go_left + go_right ] go_left ; err... actually quite a bit longer, but you get the picture, don't you ? ;-) -