Как я могу вернуть контекстно-зависимые возвращаемые значения в Perl 6? - PullRequest
13 голосов
/ 19 октября 2010

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

wantarray () исчезла

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

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

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

Ответы [ 2 ]

4 голосов
/ 19 октября 2010

Я думаю, 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» на общее «want»: Перегрузка основанного на контексте метода RFC 98 (v1), около 2000 , также в http://dev.perl.org/perl6/rfc/21.html , Я не уверен, почему / когда было сделано изменение.

3 голосов
/ 19 октября 2010

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

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';
}
...