Raku / old-issue-tracker

Tickets from RT
https://github.com/Raku/old-issue-tracker/issues
2 stars 1 forks source link

.splice loses containerization on replacement value #6194

Open p6rt opened 7 years ago

p6rt commented 7 years ago

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

Searchable as RT131162$

p6rt commented 7 years ago

From @lizmat

Actually reported as a SO question by brian d foy​:

  http://stackoverflow.com/questions/43437664/how-can-i-get-around-a-slurpy-parameter-in-the-perl-6-signature

\ m​: my @​a = [1,1],[2,2],[3,3]; dd @​a; @​a.splice​: 0, 2, $[4,4]; dd @​a # feels like a bug that the containerization of [4,4] is being ignored \<+camelia> rakudo-moar 188711​: OUTPUT​: «Array @​a = [[1, 1], [2, 2], [3, 3]]␤Array @​a = [4, 4, [3, 3]]␤» \ lizmat​: Yeah, it's because there's a candidate with @​new at the end that it binds to, decontainerizing it in the process. \ So it's not actually hitting the slurpy at all \ so you agree it's wrong atm \ The slurpy is **@​foo \ So in fact if it *was* hitting the slurpy it would be behaving right :) \ Yeah, it's wrong to discard the itemization \ ok, so we are in agreement \ I wonder if it was untested and then accidentally regressed when splice was optimized by breaking it out into a bunch of candidates \ will file a rakudobug \ Since I seem to recall splice getting at least something of a look during the GLR \ And I can't imagine we settled on "it ignores itemization" :) \ bisectable6​: my @​a = [1,1],[2,2],[3,3]; @​a.splice​: 0, 2, $[4,4]; dd @​a \<+bisectable6> jnthn, On both starting points (old=2015.12 new=1887114) the exit code is 0 and the output is identical as well \<+bisectable6> jnthn, Output on both points​: «Array @​a = [4, 4, [3, 3]]» \ Hm, nope \ It's been like that since Christmas \ ok, doesn't make it right, though :-) \ Indeed \ but will wait for the release to look at fixing it \ *nod*

p6rt commented 6 years ago

From tomentiruran@gmail.com

my @​h [] @​h.splice​: 0, 0, 1.Seq [] @​h[0].VAR.WHAT (Int) @​h[0] = 5 Cannot modify an immutable Int (1)   in block \ at \ line 1

I got hit by this with​: @​a.splice​: 0, 0, Any xx 2


perl6 -v This is Rakudo version 2017.07 built on MoarVM version 2017.07 implementing Perl 6.c. perl6 -V distro​::auth=Apple Computer, Inc. distro​::desc=2017-09-09T09​:21​:56.148447+08​:00 distro​::is-win=False distro​::name=macosx distro​::path-sep=​: distro​::release=16G29 distro​::signature= distro​::version=10.12.6 kernel​::arch=i386 kernel​::archname=x86_64-darwin kernel​::auth=unknown kernel​::bits=64 kernel​::desc= kernel​::hardware=x86_64 kernel​::name=darwin kernel​::release=Darwin Kernel Version 16.7.0​: Thu Jun 15 17​:36​:27 PDT 2017; root​:xnu-3789.70.16~2/RELEASE_X86_64 kernel​::signature= kernel​::version=16.7.0 moar​::ar=ar moar​::arflags=rcs moar​::arout= moar​::asm=.s moar​::asmout=-o moar​::asmswitch=-S moar​::auxclean=@​​: moar​::be=0 moar​::bindir=/Applications/Rakudo/bin moar​::booltype=_Bool moar​::can_unaligned_int32=1 moar​::can_unaligned_int64=1 moar​::can_unaligned_num64=1 moar​::cancgoto=1 moar​::canrdtscp=1 moar​::cat=cat moar​::cc=clang moar​::cc_covflags=-fprofile-instr-generate -fcoverage-mapping moar​::ccdebugflags=-g3 moar​::ccdef=-D moar​::ccdefflags=-D_DARWIN_USE_64_BIT_INODE=1 moar​::ccinc=-I moar​::ccinstflags=-fsanitize=address moar​::ccmiscflags=-fno-omit-frame-pointer -fno-optimize-sibling-calls moar​::ccoptiflags=-O3 -DNDEBUG moar​::ccout=-o moar​::ccshared= moar​::ccswitch=-c moar​::ccwarnflags=-Wno-logical-op-parentheses moar​::cflags=-fno-omit-frame-pointer -fno-optimize-sibling-calls -O3 -DNDEBUG -Wno-logical-op-parentheses -D_DARWIN_USE_64_BIT_INODE=1 moar​::cincludes= -I3rdparty/libuv/include -I3rdparty/libuv/src -I3rdparty/libatomic_ops/src -I3rdparty/libtommath -I3rdparty/dynasm -I3rdparty/dyncall/dynload -I3rdparty/dyncall/dyncall -I3rdparty/dyncall/dyncallback moar​::config=--optimize --prefix=/Applications/Rakudo --make-install moar​::cppout=> moar​::cppswitch=-E moar​::crossconf= moar​::dcbclean=$(RM) 3rdparty/dyncall/dyncallback/libdyncallback_s.a moar​::dcblib=3rdparty/dyncall/dyncallback/libdyncallback_s.a moar​::dcbobjects= moar​::dcbrule=@​​: moar​::dcclean=cd 3rdparty/dyncall && $(MAKE) -f Makefile clean moar​::dclib=3rdparty/dyncall/dyncall/libdyncall_s.a moar​::dcobjects= moar​::dcrule=cd 3rdparty/dyncall && ./configure && CC='$(CC)' CFLAGS='-fPIC' $(MAKE) -f Makefile moar​::defs[0]=_DARWIN_USE_64_BIT_INODE=1 moar​::dlclean=$(RM) 3rdparty/dyncall/dynload/libdynload_s.a moar​::dll=lib%s.dylib moar​::dllexport=__attribute__ ((visibility ("default"))) moar​::dllib=3rdparty/dyncall/dynload/libdynload_s.a moar​::dllimport=__attribute__ ((visibility ("default"))) moar​::dlllocal=__attribute__ ((visibility ("hidden"))) moar​::dlobjects= moar​::dlrule=@​​: moar​::dynasmlua=./3rdparty/dynasm/dynasm.lua moar​::exe= moar​::formatattribute=__attribute__((format(X, Y, Z))) moar​::has_pthread_yield=0 moar​::havebooltype=1 moar​::impinst=libmoar.dylib moar​::install= $(MKPATH) $(DESTDIR)$(PREFIX)/include/libuv $(CP) 3rdparty/libuv/include/*.h $(DESTDIR)$(PREFIX)/include/libuv $(MKPATH) $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/armcc $(MKPATH) $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/gcc $(MKPATH) $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/hpc $(MKPATH) $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/ibmc $(MKPATH) $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/icc $(MKPATH) $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/loadstore $(MKPATH) $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/msftc $(MKPATH) $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/sunc $(CP) 3rdparty/libatomic_ops/src/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops $(CP) 3rdparty/libatomic_ops/src/atomic_ops/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/armcc/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/armcc $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/gcc $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/hpc $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ibmc/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/ibmc $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/icc/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/icc $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/loadstore $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/msftc $(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/*.h $(DESTDIR)$(PREFIX)/include/libatomic_ops/atomic_ops/sysdeps/sunc $(MKPATH) $(DESTDIR)$(PREFIX)/include/libtommath $(CP) 3rdparty/libtommath/*.h $(DESTDIR)$(PREFIX)/include/libtommath $(MKPATH) $(DESTDIR)$(PREFIX)/include/dyncall $(CP) 3rdparty/dyncall/dynload/*.h $(DESTDIR)$(PREFIX)/include/dyncall $(CP) 3rdparty/dyncall/dyncall/*.h $(DESTDIR)$(PREFIX)/include/dyncall $(CP) 3rdparty/dyncall/dyncallback/*.h $(DESTDIR)$(PREFIX)/include/dyncall moar​::jit=$(JIT_POSIX_X64) moar​::laoclean=cd 3rdparty/libatomic_ops/src && $(MAKE) distclean moar​::laolib=3rdparty/libatomic_ops/src/libatomic_ops.a moar​::laoobjects= moar​::laorule=cd 3rdparty/libatomic_ops && CC='$(CC)' CFLAGS='$(CFLAGS)' ./configure && cd src && $(MAKE) && cd .. moar​::ld=clang moar​::ld_covflags=-fprofile-instr-generate -fcoverage-mapping moar​::lddebugflags=-g3 moar​::lddir=-L moar​::ldflags= -O3 -DNDEBUG -Wl,-rpath,"//Applications/Rakudo/lib" moar​::ldimp= moar​::ldinstflags=-fsanitize=address moar​::ldlibs=-lpthread moar​::ldmiscflags= moar​::ldoptiflags=-O3 -DNDEBUG moar​::ldout=-o moar​::ldrpath=-Wl,-rpath,"//Applications/Rakudo/lib" moar​::ldshared=-dynamiclib moar​::ldsys=-l%s moar​::ldusr=-l%s moar​::lib=lib%s.a moar​::libdir=/Applications/Rakudo/lib moar​::lua=./3rdparty/dynasm/minilua moar​::mainflags=-DMVM_SHARED moar​::mainlibs=-L. -lmoar moar​::make=make moar​::mastdir=/Applications/Rakudo/share/nqp/lib/MAST moar​::mkflags= moar​::mknoisy=ifneq ($(NOISY), 1)MSG = @​echoCMD = @​NOOUT = > /dev/nullNOERR = 2> /dev/nullendif moar​::moar=libmoar.dylib moar​::moardll=libmoar.dylib moar​::moarlib=libmoar.a moar​::moarshared=-install_name "/Applications/Rakudo/lib/libmoar.dylib" moar​::mtclean=$(RM) 3rdparty/tinymt/libtinymt.a 3rdparty/tinymt/*.o moar​::mtlib=3rdparty/tinymt/libtinymt.a moar​::mtobjects=3rdparty/tinymt/tinymt64.o moar​::mtrule=$(AR) $(ARFLAGS) $@​ 3rdparty/tinymt/*.o moar​::name=moar moar​::nativecall_backend=dyncall moar​::noreturnattribute=__attribute__((noreturn)) moar​::noreturnspecifier= moar​::nul=/dev/null moar​::obj=.o moar​::objflags=-DMVM_BUILD_SHARED moar​::os=darwin moar​::osname=darwin moar​::osvers=14.3.0 moar​::perl=/Users/steve/perl5/perlbrew/perls/perl-5.22.0/bin/perl moar​::pkgconfig=/usr/bin/pkg-config moar​::platform=$(PLATFORM_POSIX) moar​::prefix=/Applications/Rakudo moar​::ptr_size=8 moar​::rm=rm -f moar​::sh=/bin/sh moar​::shaclean=$(RM) 3rdparty/sha1/libsha1.a 3rdparty/sha1/*.o moar​::shaincludedir=3rdparty/sha1 moar​::shalib=3rdparty/sha1/libsha1.a moar​::shaobjects=3rdparty/sha1/sha1.o moar​::sharedlib=libmoar.dylib moar​::sharule=$(AR) $(ARFLAGS) $@​ 3rdparty/sha1/*.o moar​::static_inline=static __inline__ moar​::staticlib= moar​::thirdpartylibs=3rdparty/dyncall/dyncall/libdyncall_s.a 3rdparty/dyncall/dyncallback/libdyncallback_s.a 3rdparty/dyncall/dynload/libdynload_s.a 3rdparty/libatomic_ops/src/libatomic_ops.a 3rdparty/tinymt/libtinymt.a 3rdparty/sha1/libsha1.a 3rdparty/libtommath/libtommath.a 3rdparty/libuv/libuv.a moar​::tomclean=$(RM) 3rdparty/libtommath/libtommath.a 3rdparty/libtommath/*.o moar​::tomlib=3rdparty/libtommath/libtommath.a moar​::tomobjects=3rdparty/libtommath/bn_error.o 3rdparty/libtommath/bn_fast_mp_invmod.o 3rdparty/libtommath/bn_fast_mp_montgomery_reduce.o 3rdparty/libtommath/bn_fast_s_mp_mul_digs.o 3rdparty/libtommath/bn_fast_s_mp_mul_high_digs.o 3rdparty/libtommath/bn_fast_s_mp_sqr.o 3rdparty/libtommath/bn_mp_2expt.o 3rdparty/libtommath/bn_mp_abs.o 3rdparty/libtommath/bn_mp_add.o 3rdparty/libtommath/bn_mp_add_d.o 3rdparty/libtommath/bn_mp_addmod.o 3rdparty/libtommath/bn_mp_and.o 3rdparty/libtommath/bn_mp_clamp.o 3rdparty/libtommath/bn_mp_clear.o 3rdparty/libtommath/bn_mp_clear_multi.o 3rdparty/libtommath/bn_mp_cmp.o 3rdparty/libtommath/bn_mp_cmp_d.o 3rdparty/libtommath/bn_mp_cmp_mag.o 3rdparty/libtommath/bn_mp_cnt_lsb.o 3rdparty/libtommath/bn_mp_copy.o 3rdparty/libtommath/bn_mp_count_bits.o 3rdparty/libtommath/bn_mp_div.o 3rdparty/libtommath/bn_mp_div_2.o 3rdparty/libtommath/bn_mp_div_2d.o 3rdparty/libtommath/bn_mp_div_3.o 3rdparty/libtommath/bn_mp_div_d.o 3rdparty/libtommath/bn_mp_dr_is_modulus.o 3rdparty/libtommath/bn_mp_dr_reduce.o 3rdparty/libtommath/bn_mp_dr_setup.o 3rdparty/libtommath/bn_mp_exch.o 3rdparty/libtommath/bn_mp_export.o 3rdparty/libtommath/bn_mp_expt_d.o 3rdparty/libtommath/bn_mp_expt_d_ex.o 3rdparty/libtommath/bn_mp_exptmod.o 3rdparty/libtommath/bn_mp_exptmod_fast.o 3rdparty/libtommath/bn_mp_exteuclid.o 3rdparty/libtommath/bn_mp_fread.o 3rdparty/libtommath/bn_mp_fwrite.o 3rdparty/libtommath/bn_mp_gcd.o 3rdparty/libtommath/bn_mp_get_int.o 3rdparty/libtommath/bn_mp_get_long.o 3rdparty/libtommath/bn_mp_get_long_long.o 3rdparty/libtommath/bn_mp_grow.o 3rdparty/libtommath/bn_mp_import.o 3rdparty/libtommath/bn_mp_init.o 3rdparty/libtommath/bn_mp_init_copy.o 3rdparty/libtommath/bn_mp_init_multi.o 3rdparty/libtommath/bn_mp_init_set.o 3rdparty/libtommath/bn_mp_init_set_int.o 3rdparty/libtommath/bn_mp_init_size.o 3rdparty/libtommath/bn_mp_invmod.o 3rdparty/libtommath/bn_mp_invmod_slow.o 3rdparty/libtommath/bn_mp_is_square.o 3rdparty/libtommath/bn_mp_jacobi.o 3rdparty/libtommath/bn_mp_karatsuba_mul.o 3rdparty/libtommath/bn_mp_karatsuba_sqr.o 3rdparty/libtommath/bn_mp_lcm.o 3rdparty/libtommath/bn_mp_lshd.o 3rdparty/libtommath/bn_mp_mod.o 3rdparty/libtommath/bn_mp_mod_2d.o 3rdparty/libtommath/bn_mp_mod_d.o 3rdparty/libtommath/bn_mp_montgomery_calc_normalization.o 3rdparty/libtommath/bn_mp_montgomery_reduce.o 3rdparty/libtommath/bn_mp_montgomery_setup.o 3rdparty/libtommath/bn_mp_mul.o 3rdparty/libtommath/bn_mp_mul_2.o 3rdparty/libtommath/bn_mp_mul_2d.o 3rdparty/libtommath/bn_mp_mul_d.o 3rdparty/libtommath/bn_mp_mulmod.o 3rdparty/libtommath/bn_mp_n_root.o 3rdparty/libtommath/bn_mp_n_root_ex.o 3rdparty/libtommath/bn_mp_neg.o 3rdparty/libtommath/bn_mp_or.o 3rdparty/libtommath/bn_mp_prime_fermat.o 3rdparty/libtommath/bn_mp_prime_is_divisible.o 3rdparty/libtommath/bn_mp_prime_is_prime.o 3rdparty/libtommath/bn_mp_prime_miller_rabin.o 3rdparty/libtommath/bn_mp_prime_next_prime.o 3rdparty/libtommath/bn_mp_prime_rabin_miller_trials.o 3rdparty/libtommath/bn_mp_prime_random_ex.o 3rdparty/libtommath/bn_mp_radix_size.o 3rdparty/libtommath/bn_mp_radix_smap.o 3rdparty/libtommath/bn_mp_rand.o 3rdparty/libtommath/bn_mp_read_radix.o 3rdparty/libtommath/bn_mp_read_signed_bin.o 3rdparty/libtommath/bn_mp_read_unsigned_bin.o 3rdparty/libtommath/bn_mp_reduce.o 3rdparty/libtommath/bn_mp_reduce_2k.o 3rdparty/libtommath/bn_mp_reduce_2k_l.o 3rdparty/libtommath/bn_mp_reduce_2k_setup.o 3rdparty/libtommath/bn_mp_reduce_2k_setup_l.o 3rdparty/libtommath/bn_mp_reduce_is_2k.o 3rdparty/libtommath/bn_mp_reduce_is_2k_l.o 3rdparty/libtommath/bn_mp_reduce_setup.o 3rdparty/libtommath/bn_mp_rshd.o 3rdparty/libtommath/bn_mp_set.o 3rdparty/libtommath/bn_mp_set_int.o 3rdparty/libtommath/bn_mp_set_long.o 3rdparty/libtommath/bn_mp_set_long_long.o 3rdparty/libtommath/bn_mp_shrink.o 3rdparty/libtommath/bn_mp_signed_bin_size.o 3rdparty/libtommath/bn_mp_sqr.o 3rdparty/libtommath/bn_mp_sqrmod.o 3rdparty/libtommath/bn_mp_sqrt.o 3rdparty/libtommath/bn_mp_sqrtmod_prime.o 3rdparty/libtommath/bn_mp_sub.o 3rdparty/libtommath/bn_mp_sub_d.o 3rdparty/libtommath/bn_mp_submod.o 3rdparty/libtommath/bn_mp_to_signed_bin.o 3rdparty/libtommath/bn_mp_to_signed_bin_n.o 3rdparty/libtommath/bn_mp_to_unsigned_bin.o 3rdparty/libtommath/bn_mp_to_unsigned_bin_n.o 3rdparty/libtommath/bn_mp_toom_mul.o 3rdparty/libtommath/bn_mp_toom_sqr.o 3rdparty/libtommath/bn_mp_toradix.o 3rdparty/libtommath/bn_mp_toradix_n.o 3rdparty/libtommath/bn_mp_unsigned_bin_size.o 3rdparty/libtommath/bn_mp_xor.o 3rdparty/libtommath/bn_mp_zero.o 3rdparty/libtommath/bn_prime_tab.o 3rdparty/libtommath/bn_reverse.o 3rdparty/libtommath/bn_s_mp_add.o 3rdparty/libtommath/bn_s_mp_exptmod.o 3rdparty/libtommath/bn_s_mp_mul_digs.o 3rdparty/libtommath/bn_s_mp_mul_high_digs.o 3rdparty/libtommath/bn_s_mp_sqr.o 3rdparty/libtommath/bn_s_mp_sub.o 3rdparty/libtommath/bncore.o moar​::tomrule=$(AR) $(ARFLAGS) $@​ 3rdparty/libtommath/*.o moar​::translate_newline_output=0 moar​::usrlibs[0]=pthread moar​::uvclean=$(RM) 3rdparty/libuv/libuv.a $(UV_DARWIN) moar​::uvlib=3rdparty/libuv/libuv.a moar​::uvobjects=$(UV_DARWIN) moar​::uvrule=$(AR) $(ARFLAGS) $@​ $(UV_DARWIN) moar​::version=2017.07 moar​::versionmajor=2017 moar​::versionminor=07 moar​::versionpatch=0 perl6​::build-date=2017-07-24T19​:31​:35Z perl6​::codename= perl6​::implementation=Rakudo perl6​::language_version=6.c perl6​::prefix=/Applications/Rakudo perl6​::release-number= perl6​::version=2017.07 repo​::chain=file#/Users/andrewbuchanan/Library/usr/lib/perl6 inst#/Users/andrewbuchanan/.perl6 inst#/Applications/Rakudo/share/perl6/site inst#/Applications/Rakudo/share/perl6/vendor inst#/Applications/Rakudo/share/perl6 CompUnit​::Repository​::AbsolutePath.new(next-repo => CompUnit​::Repository​::NQP.new(next-repo => CompUnit​::Repository​::Perl5.new(next-repo => CompUnit​::Repository))) CompUnit​::Repository​::NQP.new(next-repo => CompUnit​::Repository​::Perl5.new(next-repo => CompUnit​::Repository)) CompUnit​::Repository​::Perl5.new(next-repo => CompUnit​::Repository)

p6rt commented 6 years ago

From @smls

On Fri, 08 Sep 2017 18​:37​:50 -0700, tomentiruran@​gmail.com wrote​:

my @​h [] @​h.splice​: 0, 0, 1.Seq [] @​h[0].VAR.WHAT (Int) @​h[0] = 5 Cannot modify an immutable Int (1) in block \ at \ line 1

I got hit by this with​: @​a.splice​: 0, 0, Any xx 2

Good find.

It's also not specific to `Seq` - it looks like it happens whenever the replacement elements are passed to `splice` as a nested structure rather than as flat arguments​:

  my @​h;   @​h.splice​: 0, 0, 'a';   @​h.splice​: 1, 0, ('b',);

  dd @​h; # Array @​h = ["a", "b"]   say @​h[0].VAR.^name; # Scalar   say @​h[1].VAR.^name; # Str

Conceptually¹⁺², the `splice` routine takes the replacements as a `*@​` slurpy, so whether they're passed in nested or flat form should not matter.

But Rakudo currently implements the routine with a `| is raw` signature​:

  say Array.^find_method("splice").signature; # (Mu $​: | is raw)

...and apparently does the parameter flattening manually, in a way that introduces this bug.

Until it is fixed, a work-around is to flatten the replacement elements into the argument list of `splice` using `|`​:

  @​a.splice​: 0, 0, |(Any xx 2);


[1] https://docs.perl6.org/routine/splice [2] https://design.perl6.org/S32/Containers.html#splice

p6rt commented 6 years ago

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

p6rt commented 6 years ago

From @skids

On Sun, 16 Apr 2017 12​:56​:58 -0700, elizabeth wrote​:

Actually reported as a SO question by brian d foy​:

http://stackoverflow.com/questions/43437664/how-can-i-get-around-a- slurpy-parameter-in-the-perl-6-signature

\ m​: my @​a = [1,1],[2,2],[3,3]; dd @​a; @​a.splice​: 0, 2, $[4,4]; dd @​a # feels like a bug that the containerization of [4,4] is being ignored \<+camelia> rakudo-moar 188711​: OUTPUT​: «Array @​a = [[1, 1], [2, 2], [3, 3]]␤Array @​a = [4, 4, [3, 3]]␤» \ lizmat​: Yeah, it's because there's a candidate with @​new at the end that it binds to, decontainerizing it in the process. \ So it's not actually hitting the slurpy at all \ so you agree it's wrong atm \ The slurpy is **@​foo \ So in fact if it *was* hitting the slurpy it would be behaving right :) \ Yeah, it's wrong to discard the itemization \ ok, so we are in agreement \ I wonder if it was untested and then accidentally regressed when splice was optimized by breaking it out into a bunch of candidates \ will file a rakudobug \ Since I seem to recall splice getting at least something of a look during the GLR \ And I can't imagine we settled on "it ignores itemization" :) \ bisectable6​: my @​a = [1,1],[2,2],[3,3]; @​a.splice​: 0, 2, $[4,4]; dd @​a \<+bisectable6> jnthn, On both starting points (old=2015.12 new=1887114) the exit code is 0 and the output is identical as well \<+bisectable6> jnthn, Output on both points​: «Array @​a = [4, 4, [3, 3]]» \ Hm, nope \ It's been like that since Christmas \ ok, doesn't make it right, though :-) \ Indeed \ but will wait for the release to look at fixing it \ *nod*

This ticket and RT#​132047 may be merged.

Please find an experimental tree at​: https://github.com/skids/rakudo/tree/rt131162

commit 998738620d1ca327e1b2d7727b7a0f28b9bce542 Author​: skids \bri@&#8203;abrij\.org Date​: Fri Sep 15 21​:01​:48 2017 -0400

  GLR-ize splice's @​replacement argument

  Collapse **@​ and @​ candidates into +@​ candidates.   This is a spec/doc change. Will need to be reconciled.   May need to figure out how to make this 6.d-only (or later)   Amazingly, passes all spectests.   Fixes RT#​131162 and RT#​132047   Needs ecosystem-wide testing for fallout

(I also tried **@​ and it did not fair very well. There are many specttests that assume single-argument-rule behavior on single arguments.)

splice's prototype never got touched during GLR, if you look at git blame in specs. It just got missed, I guess. Probably not the only one.

If someone who is tooled to do an ecosystem-wide/multiplatform test could try this tree we could get an idea how disruptive it would be.

Figuring out where this sits WRT 6.d, both feature-wise and technically as to how we best replace 6.c's Array candidates or dispatcher.

No performance tests have been done on this. I notice we still keep some core code doing +@​ by hand but don't know if that is due to performance or just because they were implemented before we had that slurpy modifier, or due to a needed behavioral quirk.

p6rt commented 6 years ago

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