Mengapa tidak ada "masing-masing" metode pada urutan Perl6?

14

Terkadang saya akan mulai menulis serangkaian panggilan metode di Perl 6 REPL, seperti:

".".IO.dir.grep(...).map(...).

... dan kemudian saya menyadari bahwa apa yang ingin saya lakukan dengan daftar terakhir adalah mencetak setiap elemen pada barisnya sendiri. Saya berharap urutan memiliki sesuatu seperti eachmetode sehingga saya bisa mengakhiri rantai dengan .each(*.say), tetapi tidak ada metode seperti itu yang bisa saya temukan. Sebaliknya saya harus kembali ke awal baris dan menambahkan .say for. Rasanya seperti menghancurkan aliran pikiranku.

Ini gangguan kecil, tapi menurut saya kelalaian yang mencolok sehingga saya bertanya-tanya apakah saya kehilangan beberapa alternatif mudah. Satu-satunya yang dapat saya pikirkan adalah ».saydan .join("\n").say, tetapi yang pertama dapat beroperasi pada elemen-elemen yang tidak berurutan (jika saya mengerti dengan benar) dan yang terakhir membangun sebuah string tunggal yang bisa menjadi masalah besar, tergantung pada daftar input.

Sean
sumber

Jawaban:

8

Seperti yang Anda tulis dalam komentar, hanya yang lain yang .map(*.say)juga membuat garis dengan nilai True saat menggunakan REPL. Anda dapat mencoba memanggil .sinkmetode setelah pernyataan peta terakhir.

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink
Valle Lukas
sumber
Saya kira ... tapi kemudian REPL akan mengeluarkan daftar Truenilai dengan panjang yang sama dengan daftar input. Tidak ideal
Sean
".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}akan melakukan hal yang sama, tetapi hanya menyebutkan daftar kosong di REPL
Elizabeth Mattijsen
Saya percaya REPL dimaksudkan untuk tidak menampilkan hasil garis jika telah ada keluaran; apakah itu dengan memanggil tellfilehandle sebelum dan sesudah perintah dan membandingkannya, saya pikir? jadi ada yang salah dengan logika itu.
timotimo
11

Anda bisa menggulung sendiri.

use MONKEY;

augment class Any 
{ 
    method each( &block )
    {
        for self -> $value { 
            &block( $value );
        }
    }
};

List.^compose;
Seq.^compose;

(1, 2).each({ .say });
(2, 3).map(* + 1).each({ .say });

# 1
# 2
# 3
# 4

Jika Anda suka ini, ada peluang modul CPAN Pertama Anda di sana.

Holli
sumber
1
Jawaban dan ide bagus untuk modul CPAN. Anda dapat mempertimbangkan menyebutkannya dapat dibuat menjadi sub reguler dan dipanggil dengan .&each(), jika mereka tidak ingin berkutat dengan menambah.
user0721090601
Menggunakan .&each()format datang dengan kelemahan, seperti diminta untuk tetap pada satu baris (atau menggunakan agak sulit di \ semua tempat).
Tyil