I came across the goal() challenge this morning.
g()(‘al’) is a challenge whereby you need to write in as many languages as possible code which enables the code g()(‘al’) to return the string “goal”, the code g()()(‘al’) to return the string “gooal”, the code g()()()(‘al’) return the string “goooal”, etc.
Interestingly enough, the table of solutions for different languages lists my three least liked languages – Java, Ruby, and PHP – as the ones to be improbably used. These languages don’t support the necessary syntax to make it work.
Given that I spend most of my days around PHP developers, I decided to play around and see if I can figure out a way to do it in PHP. After all, the challenge allows breaking rules in a smart way. What exactly is smart – that’s not up to me.
My initial approach was to apply the technique I learned in my Perl days – using __DATA__ or __END__ special literals – to stop the processing of the script and adding more data to it. I’ve never tried that in PHP, but that turned out to be quite possible with the use of __halt_compiler() function. I’ve submitted the Pull Request, but it still felt like cheating.
So my second approach was completely different. If PHP doesn’t support the necessary syntax, why not just add it such support? A quick search for how write a lexer in PHP turned up with this handy article. I pretty much did a copy-paste of it and find-and-replace for the needs of the challenge. Hence the second Pull Request.
While both of the solutions aren’t exactly what the challenge was about, I think this was still useful as I’ve learned a thing or two.