Подтвердить что ты не робот

Как вернуть возвращаемые значения чувствительности к контексту в Perl 6?

В сводке differences между Perl 5 и Perl 6 отмечается, что функция wantarray отсутствует:

wantarray() отсутствует

wantarray ушел. В Perl 6 контекст выходит наружу, что означает, что подпрограмма не знает, в каком контексте она находится в.

Вместо этого вы должны возвращать объекты, которые делать правильные вещи в каждом контексте.

Может ли кто-нибудь указать пример создания такого объекта?

4b9b3361

Ответ 1

Я думаю, что 2 примера могут быть:


http://perlcabal.org/syn/S13.html#Type_Casting

Класс может определять методы, которые позволяют ему реагировать так, как если бы это была процедура, массив или хеш. Длинные формы заключаются в следующем:

method postcircumfix:<( )> ($capture) {...}
method postcircumfix:<[ ]> (**@slice) {...}
method postcircumfix:<{ }> (**@slice) {...}

Это немного громоздки, поэтому вы также можете использовать эти короткие формы:

method &.( $capture ) {...}
method @.[ **@slice ] {...}
method %.{ **@slice } {...}

Кроме того, я думаю, что это может быть актуальным, хотя и менее: http://perlcabal.org/syn/S12.html

Искать:

Вы можете написать свои собственные аксессоры для переопределения всех или всех автогенерированных.

Итак, вы возвращаете объект, который имеет несколько контекстно-зависимых аксессуаров.


Интересно, что это началось с того, что Perl6 заменил "wantarray" на общий "хочу": RFC 98 (v1) перегрузка на основе контекста, около 2000, также на http://dev.perl.org/perl6/rfc/21.html. Я не уверен, почему и когда было сделано изменение.

Ответ 2

Этот comment в Reddit о сообщении в блоге Неизменяемый Sigils and Context дает следующие примеры:

class GeoLocation is Array {
    method Str { 'middle of nowhere' }
}

sub remote_location {
    return GeoLocation.new(1e6 xx 3);
}

# or even easier:

sub remote_location {
    return (1e6 xx 3) but 'middle of nowhere';
}