2016-04-06 7 views
1

Ich versuche, ein kleines DSL zu schaffen, aber ich kämpfe mit sogar einfachen Sachen. Das folgende Skript gibt mir einen Fehler.Groovy Methode Namenskonvention oder Magie?

Aus irgendwelchen Gründen sind die Klammern um die Parameter nicht optional und ich erhalte einen Fehler. Dieses Skript läuft gut:

def dEMON(String input) { 
    ['a': input] 
} 
dEMON 'Hello thingy' a 

Hinweis: Der einzige Unterschied ist die Klein ersten Zeichen. Also, was ist hier los? Warum werden die Skripte interpretiert (kompiliert?)? Gibt es eine Art von Methoden-/Klassenbenennungsschemas, denen ich folgen muss?

Update: Die Fehlermeldung. Ich denke ein Syntaxfehler:

+0

ich wahrscheinlich nicht die Antwort sowieso, aber wenn über einen Fehler zu fragen, buchen Sie den Fehler. –

+0

@JB Nizet Entschuldigung, hinzugefügt. –

Antwort

2

Die groovy Syntax ist manchmal komplex, und der Compiler verwendet einige Regeln, um zu wählen, was es tun muss. Eine dieser Regeln ist einfach: Wenn ein Wort mit einem Großbuchstaben beginnt, ist es wahrscheinlich eine Klasse.

Beispiel: f String ist eine in groovy gültige Syntax, und der Compiler konvertiert sie in f(String.class).

Sie Klammern verwenden können, groovy verstehen zu helfen, Ihre DEMON keine Klasse, sondern eine Methode, DEMON('Hello thingy', a)

+0

Nun, ok. Also kann der Compiler DEMON nicht als eine Methode definieren, die auf der Definition basiert? Kann ich die Definition so ändern, dass ich den Großbuchstabennamen behalten kann und keine Klammern verwenden muss? –

+1

Ich glaube nicht, dass es möglich ist. Es versagt in der "Parsing" -Stufe: die erste AST-Stufe, in der die Semantik oder der Kontext nicht verwendet wird. Die Grammatik lehnt diese Konstruktion ab. –