Perl6 시퀀스에 "각"방법이없는 이유는 무엇입니까?


14

때로는 Perl 6 REPL에서 다음과 같은 메소드 호출 체인을 작성하기 시작합니다.

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

... 그리고 나는 최종 목록으로하고 싶은 것이 모든 요소를 ​​자체 행에 인쇄한다는 것을 알고 있습니다. 시퀀스에 each메소드 와 같은 것이 있기 때문에 체인을 끝낼 수는 .each(*.say)있지만 찾을 수있는 방법은 없습니다. 대신 나는 줄의 시작 부분으로 돌아가서 앞에 덧붙여 야한다 .say for. 내 생각의 흐름을 깨뜨리는 것 같아

그것은 약간의 성가심이지만, 쉬운 대안이 빠져 있는지 궁금해하는 눈부신 누락으로 나를 때립니다. 내가 생각할 수있는 유일한 것은 ».sayand .join("\n").say이지만 전자는 순서대로 요소를 올바르게 처리 할 수 ​​있으며 (정확하게 이해하면) 후자는 입력 목록에 따라 문제가 될 수있는 단일 문자열을 구성합니다.

답변:


8

주석에 썼 듯이 .map(*.say)REPL을 사용할 때 다른 사람 도 True 값을 가진 행을 만듭니다. .sink마지막 map 문 다음에 메소드 호출을 시도 할 수 있습니다 .

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

나는 가정하지만 REPL은 True입력 목록과 동일한 길이 의 값 목록을 뱉어냅니다 . 이상적이지 않습니다.
Sean

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}동일한 작업을 수행하지만, 단지 REPL에서 빈 목록을 언급 할 것이다
엘리자베스 Mattijsen

REPL은 출력이있는 경우 줄 결과를 출력하지 않아야한다고 생각합니다. tell명령 전후에 out 파일 핸들 을 호출 하고 비교 함으로써 그렇게합니다 . 그 논리에 문제가있을 수 있습니다.
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()그것들을 기능 보강과 혼동하고 싶지 않다면로 호출 할 수 있다고 언급 할 수도있다 .
user0721090601 1

.&each()형식을 사용하면 한 줄을 고수 해야하는 등 단점이 있습니다 (또는 \ 모든 곳에서 다루기가 쉽지 않습니다).
Tyil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.