Skip to content

Instantly share code, notes, and snippets.

@peschwa
Created March 18, 2016 11:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save peschwa/e1212493006fdfe01f9e to your computer and use it in GitHub Desktop.
Save peschwa/e1212493006fdfe01f9e to your computer and use it in GitHub Desktop.
sub sprintf(Cool $format, *@args) {
CATCH {
when X::Cannot::Lazy {
X::Cannot::Lazy.new(:action('(s)printf')).throw
}
default {
my $vmex := nqp::getattr(nqp::decont($_), Exception, '$!ex');
my %payload := nqp::hllize(nqp::getpayload($vmex));
if +%payload.keys == 1 {
given %payload.keys[0] {
.say;
say X::.keys.grep('Str'); # prints (Str)
say X::Str::.keys; # dies with 'Could not find symbol'
when 'BAD_TYPE_FOR_DIRECTIVE' {
X::Str::Sprintf::Directives::BadType.new(
type => %payload{$_}<TYPE>,
directive => %payload{$_}<DIRECTIVE>
).throw
}
when 'BAD_DIRECTIVE' {
X::Str::Sprintf::Directives::Unsupported.new(
directive => %payload{$_}<DIRECTIVE>,
sequence => %payload{$_}<SEQUENCE>
).throw
}
when 'DIRECTIVES_COUNT' {
X::Str::Sprintf::Directives::Count.new(
args-have => %payload{$_}<ARGS_HAVE>,
args-used => %payload{$_}<ARGS_USED>
).throw
}
}
}
}
}
Rakudo::Internals.initialize-sprintf-handler;
@args.elems;
nqp::p6box_s(
nqp::sprintf(nqp::unbox_s($format.Stringy),
nqp::clone(nqp::getattr(@args, List, '$!reified'))
)
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment