Skip Menu |
Report information
Id: 131910
Status: open
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: mauke- <l.mai [at] web.de>
Cc:
AdminCc:

Operating System: (no value)
PatchStatus: (no value)
Severity: Wishlist
Type: core
Perl Version: 5.26.0
Fixed In: (no value)



Date: Wed, 16 Aug 2017 20:05:53 +0200
To: perlbug [...] perl.org
From: l.mai [...] web.de
Subject: feature to interpolate method calls in double-quotish strings
Download (untitled) / with headers
text/plain 3.6k
This is a bug report for perl from l.mai@web.de, generated with the help of perlbug 1.40 running under perl 5.26.0. ----------------------------------------------------------------- [Please describe your issue here] I'd like to be able to interpolate method calls in double-quotish contexts. Method calls have become increasingly common in e.g. Moo/Moose based classes where you get an accessor for every attribute. The current workarounds ("$foo " . $obj->bar . " baz", "$foo ${\$obj->bar} baz") are unnecessarily ugly. (Maybe coderef calls via ->( ) should also be interpolated. This would mean any use of "$foo->..." gets interpolated, no matter whether '...' is [ X ], { X }, ( X ), or an identifier.) This is not backwards compatible so I'd hide it behind a feature flag (which could be enabled by default after e.g. 'use v5.28' or 'use v5.30'). [Please do not change anything below this line] ----------------------------------------------------------------- --- Flags: category=core severity=wishlist --- Site configuration information for perl 5.26.0: Configured by mauke at Tue May 30 23:06:36 CEST 2017. Summary of my perl5 (revision 5 version 26 subversion 0) configuration: Platform: osname=linux osvers=4.10.11-1-arch archname=i686-linux uname='linux simplicio 4.10.11-1-arch #1 smp preempt tue apr 18 09:00:04 cest 2017 i686 gnulinux ' config_args='' hint=recommended useposix=true d_sigaction=define useithreads=undef usemultiplicity=undef use64bitint=undef use64bitall=undef uselongdouble=undef usemymalloc=n default_inc_excludes_dot=define bincompat5005=undef Compiler: cc='cc' ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' optimize='-O2 -march=native' cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include' ccversion='' gccversion='7.1.1 20170516' gccosandvers='' intsize=4 longsize=4 ptrsize=4 doublesize=8 byteorder=1234 doublekind=3 d_longlong=define longlongsize=8 d_longdbl=define longdblsize=12 longdblkind=3 ivtype='long' ivsize=4 nvtype='double' nvsize=8 Off_t='off_t' lseeksize=8 alignbytes=4 prototype=define Linker and Libraries: ld='cc' ldflags ='-fstack-protector-strong -L/usr/local/lib' libpth=/usr/local/lib /usr/lib/gcc/i686-pc-linux-gnu/7.1.1/include-fixed /usr/lib /lib libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc libc=libc-2.25.so so=so useshrplib=false libperl=libperl.a gnulibc_version='2.25' Dynamic Linking: dlsrc=dl_dlopen.xs dlext=so d_dlsymun=undef ccdlflags='-Wl,-E' cccdlflags='-fPIC' lddlflags='-shared -O2 -march=native -L/usr/local/lib -fstack-protector-strong' --- @INC for perl 5.26.0: /home/mauke/usr/lib/perl5/site_perl/5.26.0/i686-linux /home/mauke/usr/lib/perl5/site_perl/5.26.0 /home/mauke/usr/lib/perl5/5.26.0/i686-linux /home/mauke/usr/lib/perl5/5.26.0 --- Environment for perl 5.26.0: HOME=/home/mauke LANG=en_US.UTF-8 LANGUAGE=en_US LC_COLLATE=C LC_MONETARY=de_DE.UTF-8 LC_TIME=de_DE.UTF-8 LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/home/mauke/perl5/perlbrew/bin:/home/mauke/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl PERLBREW_BASHRC_VERSION=0.73 PERLBREW_HOME=/home/mauke/.perlbrew PERLBREW_ROOT=/home/mauke/perl5/perlbrew PERL_BADLANG (unset) PERL_UNICODE=SAL SHELL=/bin/bash
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 906b
On Wed, 16 Aug 2017 11:06:13 -0700, mauke- wrote: ----------------------------------------------------------------- Show quoted text
> [Please describe your issue here] > > I'd like to be able to interpolate method calls in double-quotish > contexts. > Method calls have become increasingly common in e.g. Moo/Moose based > classes > where you get an accessor for every attribute. The current workarounds > ("$foo " > . $obj->bar . " baz", "$foo ${\$obj->bar} baz") are unnecessarily > ugly. > > (Maybe coderef calls via ->( ) should also be interpolated. This would > mean any > use of "$foo->..." gets interpolated, no matter whether '...' is [ X > ], { X }, > ( X ), or an identifier.) > > This is not backwards compatible so I'd hide it behind a feature flag > (which > could be enabled by default after e.g. 'use v5.28' or 'use v5.30').
List interpolation is probably easier to use: "$foo @{[$obj->bar]} baz"
From: "Paul \"LeoNerd\" Evans" <leonerd [...] leonerd.org.uk>
Subject: Re: [perl #131910] feature to interpolate method calls in double-quotish strings
Date: Wed, 23 Aug 2017 12:59:20 +0100
To: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 960b
On Wed, 16 Aug 2017 11:06:14 -0700 l.mai@web.de (via RT) <perlbug-followup@perl.org> wrote: Show quoted text
> I'd like to be able to interpolate method calls in double-quotish > contexts. Method calls have become increasingly common in e.g. > Moo/Moose based classes where you get an accessor for every > attribute. The current workarounds ("$foo " . $obj->bar . " baz", > "$foo ${\$obj->bar} baz") are unnecessarily ugly. > > (Maybe coderef calls via ->( ) should also be interpolated. This > would mean any use of "$foo->..." gets interpolated, no matter > whether '...' is [ X ], { X }, ( X ), or an identifier.) > > This is not backwards compatible so I'd hide it behind a feature flag > (which could be enabled by default after e.g. 'use v5.28' or 'use > v5.30').
+1 to that. Would dearly love that one. -- Paul "LeoNerd" Evans leonerd@leonerd.org.uk | https://metacpan.org/author/PEVANS http://www.leonerd.org.uk/ | https://www.tindie.com/stores/leonerd/
Download (untitled)
application/pgp-signature 195b

Message body not shown because it is not plain text.

From: Zefram <zefram [...] fysh.org>
Subject: Re: [perl #131910] feature to interpolate method calls in double-quotish strings
To: perl5-porters [...] perl.org
Date: Wed, 23 Aug 2017 13:24:24 +0100
Download (untitled) / with headers
text/plain 1.7k
The payoff of being able to interpolate another specific kind of expression without bracketing doesn't seem worth the cost of maintaining the feature flag, the difficulty that the variable syntax adds to maintaining Perl code, and the additional complexity of the tokeniser. Especially so when we consider how this request can reasonably be repeated for N other specific kinds of expression. That way madness lies. If we're to make any change to interpolation in the core, it should be a single feature that makes interpolation nicer for all expressions. Concretely, there's an obvious model for this: the brace interpolation syntax of Perl 6. This doesn't get rid of bracketing for any expression type, but does reduce the bracketing (and make it less ugly) for all expressions. In making a change like this we'd also have the opportunity to switch to proper nested parsing of interpolated expressions (also like Perl 6), from the current arrangement that resolves the quote delimitation prematurely. Putting those two changes together, perhaps with some other tweaks to make interpolation less prone to surprise, would make a feature that *is* worth the flag bother and tokeniser complication. The feature that I propose can also be implemented as a CPAN module providing a new quoting construct, though without the "" spelling. This kind of implementation would be useful as a prototype to work out the details of the interpolation rules, and generally to work out exactly what we want to put in core. It's also potentially a permanent solution for the people wanting changes to interpolation, without requiring any core changes. I've been pointed at Quote::Code as an existing CPAN module along these lines, but I haven't examined it enough to render an opinion on it. -zefram


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org