2016-01-09 11 views
5

A volte non voglio i file multipli, specialmente se sto giocando con l'idea che voglio mantenere una bella struttura che può trasformarsi in qualcosa in seguito. Mi piacerebbe fare qualcosa di simile:Come posso dichiarare e utilizzare un modulo Perl 6 nello stesso file del programma?

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

foo(137); 

L'esecuzione di questo, ottengo un errore di compilazione (che credo sia un po 'strano per un linguaggio dinamico):

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

lettura the Perl 6 "Modules" documentation, ho non vedo alcun modo per farlo poiché i vari verbi vogliono guardare in un particolare file.

+0

> ottengo un errore di compilazione (che credo sia un po 'strano per un linguaggio dinamico) vi siete guardò attraverso eccellente PDF jnthn [Andare oltre statico vs. dinamico] (http://www.jnthn.net /papers/2015-fosdem-static-dynamic.pdf)? (jnthn era malato al momento e ci sono altri problemi minori quindi [la sua presentazione dal vivo] (https://www.youtube.com/watch?v=id4pDstMu1s&index=19&list=PLRuESFRW2Fa77XObvk7-BYVFwobZHdXdK) non è grandiosa ma è OK.) – raiph

+0

@raiph L'ho letto molto tempo fa, ma penso che dovrai dire di più per esprimere un punto. –

+0

Aiui Perl 6 è in parte un linguaggio statico, ad esempio è generalmente in grado di eseguire la verifica del tipo e la risoluzione di invio per multisub (ad esempio operatori) e metodi privati ​​in fase di compilazione. Ho preso il tuo commento "strano" per significare che non hai visto le cose in quel modo e ti sei chiesto se avessi visto la presentazione di jnthn. – raiph

risposta

7

Le dichiarazioni di subroutine sono lessicali, pertanto &foo non è visibile al di fuori del corpo del modulo. È necessario aggiungere un'istruzione import al codice linea principale per renderlo visibile:

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

import Foo; 
foo(137); 

Solo per la cronaca, si potrebbe anche dichiarare manualmente una variabile &foo nella linea principale e assegnare a che dall'interno del modulo:

my &foo; 

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

    &OUTER::foo = &foo; 
} 

foo(137); 
+1

L'importazione è ciò che sto cercando. Dove è documentato? –

+2

ci sono i [documenti di progettazione] (http://design.perl6.org/S11.html#Importing_without_loading) e la [documentazione utente] (http://doc.perl6.org/language/modules); per questo caso specifico, i documenti di progettazione sono più chiari – Christoph

+3

nota che i documenti di progettazione non corrispondono alla realtà di 6.c: 'import' non supporta i nomi di simboli posizionali senza un sottolivello esplicito' & EXPORT', solo tag via named' : adverbs' – Christoph

Problemi correlati