Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature to interpolate method calls in double-quotish strings #16116

Open
p5pRT opened this issue Aug 16, 2017 · 5 comments
Open

feature to interpolate method calls in double-quotish strings #16116

p5pRT opened this issue Aug 16, 2017 · 5 comments

Comments

@p5pRT
Copy link

p5pRT commented Aug 16, 2017

Migrated from rt.perl.org#131910 (status was 'open')

Searchable as RT131910$

@p5pRT
Copy link
Author

p5pRT commented Aug 16, 2017

From @mauke

Created by @mauke

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').

Perl Info

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

@p5pRT
Copy link
Author

p5pRT commented Aug 22, 2017

From justincase@yopmail.com

On Wed, 16 Aug 2017 11​:06​:13 -0700, mauke- wrote​:


[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"

@p5pRT
Copy link
Author

p5pRT commented Aug 22, 2017

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Aug 23, 2017

From @leonerd

On Wed, 16 Aug 2017 11​:06​:14 -0700
l.mai@​web.de (via RT) <perlbug-followup@​perl.org> wrote​:

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/

@p5pRT
Copy link
Author

p5pRT commented Aug 23, 2017

From zefram@fysh.org

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants