Perl Weekly Challenge 031
Perl Weekly Challenge has started to see "guest" entries in other languages. Of course, the focus of the challenges will always be Perl and Raku but I like the idea of entries in other languages being made. If nothing else, it's a good way to maintain a good perspective on how these ideas may be implemented elsewhere. In this spirit I have added some C++ entries this week. As my time allows I would like to maintain this as something I do going forward.
Part 1
Create a function to check divide by zero error without checking if the denominator is zero.
All solutions use some variant of try/catch in that they perform the division and then try to gracefully handle what happens. The C++ solution of catching a SIGFPE could have been implemented in all three but I chose to explore the variety of possibilities.
Perl
The traditional Perl way to do this to use an eval block and then test $@ to see if an error was thrown. Modules exist on can to allow for try/catch syntax if you'd prefer.
Sample Run
$ perl perl5/ch-1.pl
caught an error: Illegal division by zero at perl5/ch-1.pl line 7.
Raku
Raku has try/catch syntax built in.
Sample Run
$ perl6 raku/ch-1.rk
caught an error: X::Numeric::DivideByZero
C++
C++ has try/catch syntax however divide by zero is not one of the standard exceptions. To handle this error within your code you need to configure a signal handler to detect that a FPE (Floating Point Error) signal has been generated.
Sample Run
$ cxx/ch-1
caught an error
Part 2
Create a script to demonstrate creating dynamic variable name, assign a value to the variable and finally print the variable. The variable name would be passed as command line argument.
Somewhat surprisingly Raku and C++ are similar in that they either do not allow symbol table manipulation at runtime (Raku) or remove variable names at runtime and disallow symbol table manipulation at compile time (C++). The solutions in both cases are to dynamically generate some code. The C++ solution uses the pre-processor for this and Raku will generate a small module which is then required and subsequently deleted. Perl most easily allows this with symbolic references.
Perl
Sample Run
$ perl perl5/ch-2.pl pwc 31
The value of $pwc is 31.
Raku
Sample Run
$ perl6 raku/ch-2.rk pwc 31
The value of $pwc is 31.
C++
The pre-processor is able to convert a bare word to a quoted string using the # operator but only for macro parameters. This requires creating the QUOTE macro. An additional macro MAKE_NAME is required to make this work in order to get VARIABLE expanded properly. The "command line argument" is actually using -D to define a macro value for the pre-processor. This is admittedly a very contrived way of doing things but this is the only way we can somewhat claim to dynamically create a variable name in C++.
Sample Run
$ g++ -DVARIABLE="pwc" -DVALUE=31 -o cxx/ch-2 cxx/ch-2.cxx
$ cxx/ch-2
The value of pwc is 31.
Comments for this post were locked by the author