2017-07-14 2 views
4

Il semble y avoir quelques incohérences dans la syntaxe d'argument dans l'interpréteur. J'utilise le dernier Rakudo. S'il vous plaît voir la borne de sortie suivante:Perl 6 syntaxe d'argument de fonction dans l'interpréteur (REPL)

$ perl6 
To exit type 'exit' or '^D' 
> say: "foo" 
foo 
> say("foo") 
foo 
> say "foo" 
===SORRY!=== Error while compiling: 
Two terms in a row 
------> say⏏ "foo" 
    expecting any of: 
     infix 
     infix stopper 
     statement end 
     statement modifier 
     statement modifier loop 
> 
$ perl6 
To exit type 'exit' or '^D' 
> say "foo" 
foo 
> say("foo") 
foo 
> say: "foo" 
foo 
> say "foo" 
===SORRY!=== Error while compiling: 
Two terms in a row 
------> say⏏ "foo" 
    expecting any of: 
     infix 
     infix stopper 
     statement end 
     statement modifier 
     statement modifier loop 
> 
$ 

Il semble que, après avoir utilisé le « : » ou « () » pour fournir les arguments, vous ne pouvez pas revenir à utiliser « », à savoir, l'espace, de fournir arguments.

Ou ai-je raté quelque chose?

Merci !!!

lisprog

+0

J'ai fait une erreur similaire auparavant (voir [Utilisation de deux-points dans les appels de méthode et de fonction dans Perl 6] (https://stackoverflow.com/questions/30982697/use-of-colon-in-method-and-function -calls-in-perl-6)) –

Répondre

9

say: "foo"

Cette ligne ne pas appel du sous-programme say.

Au lieu de cela, il déclare statement label avec le nom say, puis exécute l'instruction "foo" (qui ne fait rien). La seule raison pour laquelle il a imprimé "foo" dans votre cas, c'est parce que vous l'avez entré dans le REPL, qui imprime automatiquement la valeur du dernier relevé de chaque ligne.

Si vous l'aviez utilisé dans un programme normal, il aurait effectivement lancé l'avertissement Useless use of constant string "foo" in sink context.

say "foo" ===SORRY!=== Error while compiling: Two terms in a row ------> say⏏ "foo" expecting any of: infix infix stopper statement end statement modifier statement modifier loop

Une fois que vous avez déclaré l'étiquette, le symbole say dans ce cadre ne fait plus référence au sous-programme intégré avec ce nom, mais plutôt à votre étiquette personnalisée, et il est erreur de syntaxe pour utiliser une étiquette comme ça.

Le message d'erreur devrait idéalement expliquer cela, cependant. J'ai submitted a Rakudo ticket pour cela.

+0

Je vois! Merci smls !! Toujours quelque chose – lisprogtor

+1

Désolé smls: juste une question de plus. Si say: "foo" crée une étiquette, alors que diriez-vous de cette syntaxe dans la documentation perl6, https://docs.perl6.org/routine/map, où vous voyez un ":" après la carte de la méthode ---> dire ('bonjour', 1, 22/7, 42, 'monde') map: {.WHAT.perl} # SORTIE: «(Str Int Rat Int Str) ␤»; J'essayais la même syntaxe que la carte. Comment distinguer ":" comme label de ":" comme moyen d'appeler un argument? Merci. – lisprogtor

+1

@lisprogtor: C'est seulement une déclaration d'étiquette quand il y a un mot suivi d'un deux-points ** directement au début d'une instruction ** (sans compter les espaces). – smls