Print debugging statement: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
|||
Line 118: | Line 118: | ||
value: &main.point{x:2, y:3} |
value: &main.point{x:2, y:3} |
||
</pre> |
</pre> |
||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
Line 215: | Line 214: | ||
main::faddle(14) called at printf_debug.pl line 19 |
main::faddle(14) called at printf_debug.pl line 19 |
||
main::fiddle(7) called at printf_debug.pl line 15</pre> |
main::fiddle(7) called at printf_debug.pl line 15</pre> |
||
=={{header|Perl 6}}== |
|||
{{works with|Rakudo|2019.07.1}} |
|||
There isn't anything built-in to do this in Rakudo Perl 6, though it's pretty easy to cobble something together piggybacking off of the exception system. It would probably be better to instantiate a specific "DEBUG" exception to avoid interfering with other user instantiated ad-hoc exceptions, but for a quick-and-dirty demo, this should suffice. |
|||
This example will report any payload contents passed to the exception. If you want specific information, it will need to be passed in, though some of it may be determinable through introspection. Reports the file name and line number where the "debug" call originated and unwinds the call stack to trace through the subroutine calls leading up to it. Will follow the call chain into included files and modules, though calls to the CORE setting and dispatcher are filtered out here to reduce noise. |
|||
Comments with the files line numbers are added here to make it easier to match up the debug output with the file. Typically you would be editing the file in an editor that provides line numbering so that wouldn't be necessary/helpful. |
|||
<lang perl6>my &pdb = ¨ |
|||
CATCH { |
|||
when X::AdHoc { |
|||
my @frames = .backtrace[*]; |
|||
say .payload; |
|||
for @frames { |
|||
# Filter out exception handing and dispatcher frames |
|||
next if .file.contains: 'SETTING' or .subname.chars < 1; |
|||
printf "%sfrom file: %s,%s line: %s\n", |
|||
(' ' x $++), .file, |
|||
(my $s = .subname) eq '<unit>' ?? '' !! " sub: $s,", .line; |
|||
} |
|||
say ''; |
|||
.resume; |
|||
} |
|||
default {} |
|||
} |
|||
## Testing / demonstration |
|||
# helper subs #line 22 |
|||
sub alpha ($a) { #line 23 |
|||
pdb ('a =>', $a + 3); #line 24 |
|||
pdb 'string'; #line 25 |
|||
beta(7); #line 26 |
|||
} #line 27 |
|||
sub beta ($b) { pdb $b } #line 28 |
|||
sub gamma ($c) { beta $c } #line 29 |
|||
sub delta ($d) { gamma $d } #line 30 |
|||
#line 31 |
|||
my $a = 10; #line 32 |
|||
pdb (.VAR.name, $_) with $a; #line 33 |
|||
alpha($a); #line 34 |
|||
delta("Δ"); #line 35 |
|||
.&beta for ^3; #line 36</lang> |
|||
{{out}} |
|||
<pre>($a 10) |
|||
from file: debug.p6, line: 33 |
|||
(a => 13) |
|||
from file: debug.p6, sub: alpha, line: 24 |
|||
from file: debug.p6, line: 34 |
|||
string |
|||
from file: debug.p6, sub: alpha, line: 25 |
|||
from file: debug.p6, line: 34 |
|||
7 |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, sub: alpha, line: 26 |
|||
from file: debug.p6, line: 34 |
|||
Δ |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, sub: gamma, line: 29 |
|||
from file: debug.p6, sub: delta, line: 30 |
|||
from file: debug.p6, line: 35 |
|||
0 |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, line: 36 |
|||
1 |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, line: 36 |
|||
2 |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, line: 36</pre> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
Line 458: | Line 377: | ||
9 |
9 |
||
</pre> |
</pre> |
||
=={{header|Raku}}== |
|||
(formerly Perl 6) |
|||
{{works with|Rakudo|2019.07.1}} |
|||
There isn't anything built-in to do this in Rakudo Perl 6, though it's pretty easy to cobble something together piggybacking off of the exception system. It would probably be better to instantiate a specific "DEBUG" exception to avoid interfering with other user instantiated ad-hoc exceptions, but for a quick-and-dirty demo, this should suffice. |
|||
This example will report any payload contents passed to the exception. If you want specific information, it will need to be passed in, though some of it may be determinable through introspection. Reports the file name and line number where the "debug" call originated and unwinds the call stack to trace through the subroutine calls leading up to it. Will follow the call chain into included files and modules, though calls to the CORE setting and dispatcher are filtered out here to reduce noise. |
|||
Comments with the files line numbers are added here to make it easier to match up the debug output with the file. Typically you would be editing the file in an editor that provides line numbering so that wouldn't be necessary/helpful. |
|||
<lang perl6>my &pdb = ¨ |
|||
CATCH { |
|||
when X::AdHoc { |
|||
my @frames = .backtrace[*]; |
|||
say .payload; |
|||
for @frames { |
|||
# Filter out exception handing and dispatcher frames |
|||
next if .file.contains: 'SETTING' or .subname.chars < 1; |
|||
printf "%sfrom file: %s,%s line: %s\n", |
|||
(' ' x $++), .file, |
|||
(my $s = .subname) eq '<unit>' ?? '' !! " sub: $s,", .line; |
|||
} |
|||
say ''; |
|||
.resume; |
|||
} |
|||
default {} |
|||
} |
|||
## Testing / demonstration |
|||
# helper subs #line 22 |
|||
sub alpha ($a) { #line 23 |
|||
pdb ('a =>', $a + 3); #line 24 |
|||
pdb 'string'; #line 25 |
|||
beta(7); #line 26 |
|||
} #line 27 |
|||
sub beta ($b) { pdb $b } #line 28 |
|||
sub gamma ($c) { beta $c } #line 29 |
|||
sub delta ($d) { gamma $d } #line 30 |
|||
#line 31 |
|||
my $a = 10; #line 32 |
|||
pdb (.VAR.name, $_) with $a; #line 33 |
|||
alpha($a); #line 34 |
|||
delta("Δ"); #line 35 |
|||
.&beta for ^3; #line 36</lang> |
|||
{{out}} |
|||
<pre>($a 10) |
|||
from file: debug.p6, line: 33 |
|||
(a => 13) |
|||
from file: debug.p6, sub: alpha, line: 24 |
|||
from file: debug.p6, line: 34 |
|||
string |
|||
from file: debug.p6, sub: alpha, line: 25 |
|||
from file: debug.p6, line: 34 |
|||
7 |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, sub: alpha, line: 26 |
|||
from file: debug.p6, line: 34 |
|||
Δ |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, sub: gamma, line: 29 |
|||
from file: debug.p6, sub: delta, line: 30 |
|||
from file: debug.p6, line: 35 |
|||
0 |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, line: 36 |
|||
1 |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, line: 36 |
|||
2 |
|||
from file: debug.p6, sub: beta, line: 28 |
|||
from file: debug.p6, line: 36</pre> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |