Bir operatörü bir işlev gibi geçirin
Raku öğrenirken, daha yüksek mertebe işlevi ve sıralama işlevi noktasına geliyorum.
Bu örneğe sahibim:
> sort <4 6 2 9 1 5 11>
(1 2 4 5 6 9 11)
Sonra rutin dokümanı şunu söylüyor:
Sorts the list, smallest element first. By default infix:<cmp> is used for
comparing list elements.
Ve bölüm 9.2'deki "Piensa en raku" kitabını takip ettiğim kitap, sayısal sıralama ile sözlüksel sıralama arasında bir karşılaştırma yapıyor.
Aşağıdakileri denedim:
> sort &le, <4 6 2 9 1 5 11>;
===SORRY!=== Error while compiling:
Undeclared routine:
le used at line 1. Did you mean 'lc'?
Ancak, sözlükbilimsel olarak sıralı sıralı liste yerine bu sorunu elde etmek. Belki bunu anlamak için çok erken olabilir, ancak Raku'da bir işleci bir işlev gibi geçirmek mümkün olmalı, çünkü dokümantasyon da onun bir infix kullandığını söylüyor: veya böyle bir şey yapmam gerekiyor, belki ben ' karıştırıcı operatörler ve alt programlar:
sub my-le($a,$b) {
$a le $b;
}
sort &my-le, <4 6 2 9 1 5 11>;
veya bu:
sort { $^b le $^a }, <4 6 2 9 1 5 11>;
Bu yüzden, infix operatörünün ve bir alt yordamın farklı kullanımıyla ilgili sorum var, belki bu farkla ilgili sorun, işlenenlerin sırasının bazı işlemlerin sonucunu etkilemesidir. bu nedenle, onu bir işlev veya bir parametre veya değişken olarak bu kadar hafife alamazsınız.
> sort { $^a le $^b }, <4 6 2 9 1 5 11>
(9 6 5 4 2 11 1)
> sort { $^b le $^a }, <4 6 2 9 1 5 11>
(1 11 2 4 5 6 9)
Umarım bu soruna dair şüphelerimi açıklayabilirim.
Yanıtlar
leOperatör böyle bir şey tanımlanır:
sub infix:<le> { ... }
infix:Önek bir infix operatör var dili söyler. Yani, arama yapmak istiyorsanız, abonelik olarak &infix:<le>(1,2)veya sizin sıralamanız için:
sort &infix:<le>, <4 6 2 9 1 5 11>;
(9 6 5 4 2 11 1)
Bu yardımcı olabilir https://docs.raku.org/language/optut
Scimon'un cevabına ek olarak ve daha "net" bir sunum istiyorsanız, aşağıdaki yapı ne olursa olsun kullanabilirsiniz:
sort *le*, <4 6 2 9 1 5 11>;
Önceki kod, herhangi bir yapıdır (kod nesnesi).
Her ne yapı olursa olsun, birçok argümana sahip kod blokları (anonim alt yordamlar) oluşturmak için birden çok * kullanır:
my $c = * + *; # same as -> $a, $b { $a + $b }
Bu, hesaplamada kullanılan iki (veya daha fazla) parametreyi belirtmek için kullanılan işaretin (*) olduğu anlamına gelir.
Aynısı bizim durumumuz için de geçerli:
sort *le*, <4 6 2 9 1 5 11>;
aynıdır :
sort * le *, <4 6 2 9 1 5 11>; # adding space between operator and the whatever sign (*)
ve bu sırayla şununla aynıdır:
sort -> $a, $b { $a le $b }, <4 6 2 9 1 5 11>; # anonymous subroutine
veya
sort { $^a le $^b }, <4 6 2 9 1 5 11>;
ya da
sub le {
$^a le $^b
}
sort &le, <4 6 2 9 1 5 11>;
Referanslar:
https://docs.raku.org/type/Whatever
https://docs.raku.org/type/Block