2014-09-04 17 views
6

Po this post on perlgeek, daje przykład zmiękczania:Kiedy mogę użyć gwiazdki Any?

my &add_two := * + 2; 
say add_two(5); # 7 

sens. Ale jeśli mogę zamienić operatorowi + Infix dla operatora min Infix:

my &min_two := * min 2; 
say min_two(5); # Type check failed in binding; expected 'Callable' but got 'Int' 

Nawet próby wywołania + poprzez składni infix zawiedzie:

>> my &curry := &infix:<+>(2, *); 
Method 'Int' not found for invocant of class 'Whatever' 

Czy muszę zakwalifikować Cokolwiek jako wartość numeryczna , a jeśli tak, to w jaki sposób? Czy też całkowicie pomijam ten punkt?

[Edytowane z odpowiedziami od nowszego rakudo; Wersja łańcucha dla powyższego: perl6 version 2014.08 built on MoarVM version 2014.08]

Odpowiedz

3

Twoja wersja Rakudo jest nieco starożytna. Jeśli chcesz użyć nowszej wersji cygwin, prawdopodobnie będziesz musiał ją skompilować samodzielnie. Jeśli nie masz nic przeciwko wersji systemu Windows, możesz get a binary from rakudo.org.

Powiedział, że obecna wersja również nie przekształca * min 2 do lambda, ale z pobieżnego badania, wydaje się traktować * jak Inf. Mój Perl6-fu jest zbyt słaby, aby wiedzieć, czy jest to per spec, czy błąd.

Jako obejście, należy

my &min_two := { $_ min 2 }; 

Zauważ, że * tylko auto-curry (lub raczej 'Auto-liczb pierwszych' w Perl6-mów - patrz S02) z operatorów nie wywołań funkcji, tj 3rd przykład powinno być napisane jak

my &curry := &infix:<+>.assuming(2); 

to dlatego, że sens Whatever- * zależy od kontekstu: to ma DWIM.

W przypadku wywołań funkcji, jest przekazywana jako argument, aby umożliwić osobie wybierającej podjęcie decyzji, co chce z nią zrobić. Nawet operatorzy mogą sobie z tym poradzić Niezależnie od tego, co jawnie (np. 1..*) - ale jeśli nie, to dowolny operand przekształca operację w "zagruntowane" zamknięcie.

+0

cokolwiek gwiazda i min: ["wygląda na trochę buggy"] (http://irclog.perlgeek.de/perl6/2014-09-04#i_9298954). Re auto priming: 'm: sub foo ($ a, $ b) {say $ a + $ b}; my & bar = & foo.assuming (1); pasek 3' działa dobrze - tzn. działa dla dowolnych funkcji nie tylko operatorów. (W rzeczywistości operatory są po prostu funkcjami o zabawnych "długich" nazwach, np. Operator "+" infix jest również znany jako '& infix: <+>'.) – raiph

+0

@raiph: ale '*' tylko automatyczne wyrażenia operatora: '& infix: <+> (2, *) "przekazuje zamiast tego argument" Cokolwiek "; jawnie za pomocą 'założenia()' nie jest * auto * nic – Christoph

+0

Dodanie '{}' działa dla operatora, ale wywołanie za pomocą 'infix:' analizuje, ale kończy się niepowodzeniem, gdy jest wywoływane z argumentem numerycznym z 'Method 'Int' nie znaleziono dla zapraszający do klasy "Cokolwiek". Naprawdę nie rozumiem, dlaczego operatorzy i funkcje byłyby traktowane inaczej w przypadku curry. –