Bir operatörü bir işlev gibi geçirin

Oct 13 2020

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

19 ScimonProctor Oct 13 2020 at 16:59

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

12 jakar Oct 13 2020 at 17:12

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