There have been some relevant changes since this ticket was created:
1 postcircumfix:<{ }> is a sub now.
2 There was a change to the design documents and according to S02 the adverbial
forms :p, :kv, :k, :v "weed out non-existing entries if the adverb is true; if
not, they leave them in, just as an ordinary slice would" (cmp.
https://github.com/perl6/specs/commit/fd94c28225).
Taking these changes into account, now the mentioned commands run as expected.
First the :p(0) stuff:
$ perl6 -e 'my %h; %h<a>=1; say %h<a>:p'
"a" => 1
$ perl6 -e 'my %h; %h<a>=1; say %h<a>:p(0)' ## same result since key "a"
exists
"a" => 1
$ perl6 -e 'my %h; %h<a>=1; say %h<a>:!p' ## same thing
"a" => 1
$ perl6 -e 'my %h; %h<a>=1; say %h<b>:p' ## key "b" does not exist
$ perl6 -e 'my %h; %h<a>=1; say %h<b>:p(0)' ## pair not weeded out
"b" => Any
$ perl6 -e 'my %h; %h<a>=1; say %h<b>:!p' ## same thing
"b" => Any
The adverbs :delete and :exists also work as designed:
$ perl6 -e 'my %h; %h<a>=1; say %h<a>:delete; say %h'
1
$ perl6 -e 'my %h; %h<a>=1; say %h<a>:delete(0); say %h'
1
"a" => 1
$ perl6 -e 'my %h; %h<a>=1; say %h<a>:exists'
True
$ perl6 -e 'my %h; %h<a>=1; say %h<a>:exists(0)'
False
For :p(0) I added tests to S32-hash/pairs.t with commit
https://github.com/perl6/roast/commit/a543b07ab4
For :delete(0) and :exists(0) there are passing tests in
S32-hash/delete-adverb.t and S32-exists-adverb.t, respectively.
I'm closing this ticket now.