Elizabeth Mattijsen via RT wrote: >There is a subtle difference between Str.perl and >Rakudo::Internals.PERLIFY-STR: The former puts double quotes around, the >latter doesn't.
Yes, hence the doubling when you call the former and also wrap the result in quotes. >I'm afraid we'll have to settle for poor factoring. What? You need to call .perl and *not* put an extra layer of quotes around the result. What's the difficulty? You managed to do it for $!SPEC in IO::Path.perl. multi method perl(CompUnit::Repository::Locally:D:) { "{$?CLASS.^name}.new({$!prefix.abspath.perl})" } multi method perl(IO::Local:D:) { "{$!abspath.perl}.IO" } multi method perl(IO::Path:D:) { $!is-absolute ?? "{$.abspath.perl}.IO(:SPEC({$!SPEC.perl}))" !! "{$.path.perl}.IO(:SPEC({$!SPEC.perl}),:CWD({$!CWD.perl}))" } Further factoring win is available by taking advanage of Pair.perl. Aside from just being less code, it also gets you potential future wins if Pair.perl later gets clever enough to use :foo<bar> syntax. I showed how to factor this in a previous message on [perl #126935]: multi method perl(IO::Path:D:) { $!is-absolute ?? "{$.abspath.perl}.IO({:$!SPEC.perl})" !! "{$.path.perl}.IO({:$!SPEC.perl},{:$!CWD.perl})" } The same should really be done with $?CLASS, in case class deparsing gets cleverer about name scoping in the future: multi method perl(CompUnit::Repository::Locally:D:) { "{$?CLASS.perl}.new({$!prefix.abspath.perl})" } When writing a pervasive value deparsing system, such as .perl is intended to be, a great convenience is that one of the tools available to you is a pervasive value deparsing system (for all types other than whichever one you're working on right now). So you don't have to do the whole deparsing job yourself, and in fact you get better results by doing less of the work yourself. -zefram