ทำไมไม่มีวิธี“ แต่ละ” ในลำดับ Perl6


14

บางครั้งฉันจะเริ่มเขียนการเรียกใช้เมธอดที่ Perl 6 REPL เช่น:

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

... และจากนั้นฉันก็ตระหนักว่าสิ่งที่ฉันต้องการจะทำกับรายการสุดท้ายคือการพิมพ์องค์ประกอบทุกอย่างในบรรทัดของตัวเอง ฉันคาดหวังว่าลำดับจะมีบางอย่างเช่นeachวิธีการเพื่อให้ฉันสามารถจบห่วงโซ่ด้วย.each(*.say)แต่ไม่มีวิธีเช่นที่ฉันสามารถหา .say forแต่ผมต้องกลับไปที่จุดเริ่มต้นของบรรทัดและย่อหน้าที่ มันรู้สึกเหมือนมันทำให้ความคิดของฉันแตกสลาย

มันเป็นเรื่องน่ารำคาญเล็กน้อย แต่มันก็ทำให้ฉันรู้สึกเหมือนว่าฉันไม่สนใจอะไรเลย สิ่งเดียวที่ฉันนึกได้คือ».sayและ.join("\n").sayแต่ก่อนหน้านี้สามารถใช้งานองค์ประกอบต่าง ๆ ตามลำดับได้ (ถ้าฉันเข้าใจถูกต้อง) และโครงสร้างหลังจะสร้างสตริงเดี่ยวซึ่งอาจมีปัญหาใหญ่ขึ้นอยู่กับรายการอินพุต

คำตอบ:


8

ตามที่คุณเขียนไว้ในความคิดเห็นมีเพียงคนอื่นเท่านั้นที่.map(*.say)สร้างบรรทัดที่มีค่า True เมื่อใช้ REPL คุณสามารถลองใช้.sinkวิธีการโทรหลังจากคำสั่งแผนที่ล่าสุด

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink

ฉันคิดว่า ... แต่แล้ว REPL จะคายรายการTrueค่าที่มีความยาวเท่ากับรายการอินพุต ไม่เหมาะ
ฌอน

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}จะทำแบบเดียวกัน แต่พูดถึงรายการที่ว่างเปล่าใน REPL
Elizabeth Mattijsen

ฉันเชื่อว่า REPL หมายถึงไม่ส่งออกผลลัพธ์ของบรรทัดหากมีการส่งออก; มันทำได้โดยการเรียกtellใช้ filehandle ก่อนและหลังคำสั่งและเปรียบเทียบพวกเขาฉันคิดว่า? ดังนั้นบางสิ่งอาจผิดไปจากตรรกะนั้น
timotimo

11

คุณสามารถม้วนของคุณเอง

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

หากคุณชอบสิ่งนี้โอกาสCPAN โมดูลแรกของคุณจะอยู่ที่นั่น


1
คำตอบและแนวคิดที่ยอดเยี่ยมสำหรับโมดูล CPAN คุณอาจพิจารณาถึงว่ามันสามารถทำให้เป็นย่อยทั่วไปและเรียกด้วย.&each()ในกรณีที่พวกเขาไม่ต้องการที่จะงุนงงกับ augmenting
user0721090601

การใช้.&each()รูปแบบมาพร้อมกับข้อเสียเช่นจำเป็นต้องติดกับบรรทัดเดียว (หรือใช้ค่อนข้าง\ ทั่วสถานที่)
Tyil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.