2017-01-08 40 views
9

Birkaç anahtar alan bir komut satırı programının bir Perl 6 uygulamasıyla uğraşıyordum. MAIN imzası oldukça ilgiliydi ve biraz dağınıktı.Perl 6'da imza olarak bağımsız bir İmza kullanabilir miyim?

# possibly big and messy signature 
my $sig; 
BEGIN { $sig = :(Int $n, Int $m) }; 

multi MAIN ($sig) { 
    put "Got $n and $m"; 
    } 
imza MAIN önce ayarlanmış olsa imza değişkenleri görmez MAIN derler

:

kullanmak ne altyordamını başka bir yere imza tanımlamak ve anlamanın bir yolu olup olmadığını merak
===SORRY!=== Error while compiling /Users/brian/Desktop/signature.p6 
Variable '$n' is not declared 
at /Users/brian/Desktop/signature.p6:7 

Bu tür bir şeyin, derleme zamanından sonra çeşitli yöntemler oluşturmak ve çeşitli etkenlere dayalı imzaları seçmek için kullanışlı olabileceğini düşündüm.

+0

', sen bağlı bir imzayla (muhtemelen anonim) rutinleri yeniden olmalı ve örneğin, istediğiniz ismi ile yüklediği İmza, bu asla işe yaramayacak. Bunu yapmanın yolu düşük seviyeli ve uygulamaya özgü olacaktır. Bunu genel bir imzaya sahip olmaya çalışacağım ve ayrıştırıldıktan sonra imzayı zorla değiştireceğim. Bu, çoklu dağıtıcıyı değiştirmek için teçhizatı görmezden geliyor. –

+0

İşlev içindeki değişkenlerin "değişken bildirilmemiş" hatalarını atmaması için, bunun bir makro gibi bir derleme zamanında yapılması gerekir. Ne yazık ki, Perl 6 için planlanan makro/argo işlevselliği henüz gerçekleşmemiştir. – smls

+0

Bir yan not: Üst düzey kapsamda bir değişken bildirebilir ve BEGIN fazörünün bloksuz biçimini kullanarak bir ifadede BEGIN zamanında başlatabilirsiniz: 'BEGIN my $ foo = ...;' – smls

cevap

7

Kısa cevap: Hayır

Uzun cevap: Hala hayır. Ve eğer yapabiliyor olsaydınız, her türlü belaya girerdiniz, çünkü örneğinizde sadece bir değişken $n var. İmzayı birden çok kez kullanırsanız (veya yalnızca bir kez kullanın ve eklediğiniz alt yordamda yineleyin), her imza bağlaması, bu değişkendeki önceki değerin üzerine yazarak, uzaktaki bazı korkunç eylemlere neden olur. Serbest yüzen bir imzada yer alan değişkenleri klonlamak için bir mekanizma yoktur.

Çözümler, gerçek rutinde tümüyle bir imza kullanmanın ardından geçici olarak bu aynı kusuru olan imzayı ele geçirmek için bunu kullanırlar ve bu nedenle IMHO sorun olmayacaktır.

Belki de ileride, bazı çok gelişmiş Makro özelliği imzaları nakletmenize izin verebilir, ancak şu anda makro geliştirme bölümünün yol haritanızda olduğunu sanmıyorum. Bunun yerine çıplak imzaları tekrar kullanmanın

`in (...) ne olursa olsun
sub f(Int $n, Int $m) { 
    # do something sensible here with $n and $m 
} 
constant &MAIN = &f; 
# reuse &f for more 
+0

O zaman herhangi bir yerde kullanılamazlarsa, bağımsız imzalar ilan etme amacı nedir? – jjmerelo

+1

Buradaki nokta, sanırım, bir "Block" imzası ile verilen bir "Signature" kelimesini akıllı olarak eşleştirebiliyorsunuz, örn. 'sub a ($ a) {}; dd & a.signature ~~: ($ b) ' –