2016-01-09 6 views
5

Manchmal möchte ich keine mehrfachen Dateien, besonders wenn ich mit einer Idee herumspiele, dass ich eine nette Struktur behalten möchte, die später etwas werden kann. Ich möchte so etwas wie dies tun:Wie kann ich ein Perl 6-Modul in derselben Datei wie das Programm deklarieren und verwenden?

module Foo { 
    sub foo (Int:D $number) is export { 
     say "In Foo"; 
     } 
    } 

foo(137); 

das Lauf, erhalte ich einen Kompilierungsfehler (was meiner Meinung nach ein wenig seltsam für eine dynamische Sprache ist):

===SORRY!=== Error while compiling /Users/brian/Desktop/multi.pl 
Undeclared routine: 
    foo used at line 9 

the Perl 6 "Modules" documentation Lesen, I sehe keine Möglichkeit, dies zu tun, da die verschiedenen Verben in einer bestimmten Datei suchen wollen.

+0

> ich einen Kompilierungsfehler (was meiner Meinung nach ein wenig für eine dynamische Sprache ungerade ist) Haben Sie durch jnthn ausgezeichneten PDF warf einen Blick [über statische Erste vs. dynamische] (http://www.jnthn.net /papers/2015-fosdem-static-dynamic.pdf)? (jnthn war zu der Zeit krank und es gibt noch andere kleinere Probleme so [seine Live-Präsentation] (https://www.youtube.com/watch?v=id4pDstMu1s&index=19&list=PLRuESFRW2Fa77XObvk7-BYVFwobZHdXdK) ist nicht groß, aber es ist OK.) – raiph

+0

@raiph Ich habe das vor einer langen Zeit gelesen, aber ich denke, du wirst mehr sagen müssen, um etwas klarzustellen. –

+0

Aiui Perl 6 ist teilweise eine statische Sprache, z. B. in der Lage zu sein type Checking und Versandauflösung für Multisubs (z. B. Operatoren) und private Methoden zur Kompilierzeit in der Regel zu tun. Ich habe deinen "seltsamen" Kommentar genommen, um zu sagen, dass du die Dinge nicht so gesehen hast und dich gefragt hast, ob du Jnthns Präsentation gesehen hast. – raiph

Antwort

7

Unterprogramm-Deklarationen sind lexikalisch, so dass &foo außerhalb des Modulkörpers unsichtbar ist. Sie benötigen eine Import-Anweisung zu der Hauptstrecke Code hinzufügen, um es sichtbar zu machen:

module Foo { 
    sub foo (Int:D $number) is export { ... } 
} 

import Foo; 
foo(137); 

Nur für das Protokoll, können Sie auch manuell eine &foo Variable in der Hauptstrecke erklären und dass aus dem Modul zugeordnet werden:

my &foo; 

module Foo { 
    sub foo (Int:D $number) { ... } # no export necessary 

    &OUTER::foo = &foo; 
} 

foo(137); 
+1

Der 'Import' ist, was ich suche. Wo ist das dokumentiert? –

+2

gibt es die [Design-Dokumentation] (http://design.perl6.org/S11.html#Importing_without_loading) und die [Benutzerdokumentation] (http://doc.perl6.org/language/modules); Für diesen speziellen Fall sind die Designdokumente klarer – Christoph

+3

Beachten Sie, dass die Designdokumente nicht der Realität von 6.c entsprechen: 'import' unterstützt keine positionalen Symbolnamen ohne ein explizites '& EXPORT' Sub, nur Tags über' '' : Adverbien – Christoph

Verwandte Themen