Transpile diese ES6 Pfeilfunktionen!

8

Der ECMAScript 6-Standard fügte der JavaScript-Sprache viele neue Funktionen hinzu, einschließlich einer neuen Pfeilfunktionsnotation .

Ihre Aufgabe ist es, einen grundlegenden ES6-zu-ES5-Transpiler zu schreiben. Wenn nur ein ES6-Pfeil als Eingabe fungiert, geben Sie das ES5-kompatible Gegenstück aus.

Es ist ! Möge das kürzeste Programm in Bytes gewinnen!


Die Grundlagen

Eine Pfeilfunktion sieht folgendermaßen aus:

(a, b, c) => { return a + b - c }

Und sein äquivalenter ES5-Funktionsausdruck sieht folgendermaßen aus:

function(a, b, c) { return a + b - c }

Im Allgemeinen können Sie den Hauptteil der Funktion (alles zwischen den geschweiften Klammern) wörtlich kopieren.


Implizite Rückgabeerklärung

Anstelle eines Körpers mit geschweiften Klammern kann ein einzelner Ausdruck verwendet werden. Das Ergebnis dieses Ausdrucks wird dann zurückgegeben.

(a, b, c) => a + b - c

function(a, b, c) { return a + b - c }

Ein anderes Beispiel:

(a, b, c) => (a + 1, b - 2 * c / 3)

function(a, b, c) { return (a + 1, b - 2 * c / 3) }

Auch hier können Sie den Ausdruck einfach wörtlich kopieren - ABER achten Sie darauf, dass Sie keinen Zeilenumbruch zwischen ihm und dem returnSchlüsselwort ausgeben , um ein automatisches Einfügen von Semikolons zu vermeiden!


Ein Argument

Klammern sind optional, wenn ein Argument angegeben wird.

foo => { return foo + 'bar' }

function(foo) { return foo + 'bar' }

Leerzeichen

Schließlich müssen Sie in der Lage sein, eine beliebige Anzahl von Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche) vor oder nach Klammern, Variablen, Kommas, geschweiften Klammern und dem Pfeil * zu berücksichtigen.

 ( o   ,  O
     , _    )=>{

    return                                     "Please don't write code like this."
}

Es liegt an Ihnen, ob Sie Leerzeichen in der Ausgabe beibehalten oder nicht. Behalten Sie sie, entfernen Sie sie oder fügen Sie Ihre eigenen hinzu - stellen Sie einfach sicher, dass es sich um einen gültigen Code handelt!

* Es ist technisch illegal, dass ein Pfeil unmittelbar nach einem Zeilenumbruch kommt, aber ich bezweifle, dass diese Tatsache Ihnen helfen würde. :) :)


Ein schneller Weg, um Ihre Ausgabe zu validieren:

Geben Sie var foo = <your output>; foo()in Ihre Browserkonsole ein. Wenn es sich nicht beschwert, sind Sie wahrscheinlich auf dem richtigen Weg.


Weitere Regeln für die Assistenten:

  • Die Eingabe ist eine syntaktisch gültige ES6-Pfeilfunktion.
  • Es sei angenommen , um den Körper der Funktion ist ES5-kompatibel (und nicht Referenz this, super, argumentsusw.). Dies bedeutet auch, dass die Funktion niemals eine andere Pfeilfunktion enthält (Sie können jedoch nicht davon ausgehen, dass "=>" niemals im Körper auftreten wird).
  • Variablennamen bestehen nur aus lateinischen Grundbuchstaben $und _.
  • Sie müssen keine ES6-Funktionen transpilieren, die oben nicht aufgeführt sind (Standardparameter, Ruheoperator, Destrukturierung usw.).
  • Der Raum nach einer returnAnweisung ist optional , wenn gefolgt von (, [oder {.
  • Es ist nicht unbedingt erforderlich, meine Testfälle genau abzugleichen. Sie können den Code beliebig ändern, um die Anzahl der Bytes zu senken. Wirklich, solange Sie einen syntaktisch gültigen, funktional äquivalenten ES5-Funktionsausdruck erzeugen, sind Sie golden!
darrylyeo
quelle
Dürfen wir annehmen, dass die Eingabe eine syntaktisch gültige Pfeilfunktion ist und sonst nichts?
ETHproductions
Ein Randfall wäre a =>\na, wo function(a){ return\na }tatsächlich zurückgegeben würde , undefinedegal was der Wert von aist. Müssen wir damit umgehen?
ETHproductions
@ETHproductions Liebst du nicht einfach diese automagischen Semikolons?
Neil
Werden wir verschachtelte ES6-Funktionen erhalten?
user41805
Können wir davon ausgehen, dass die Eingabe nur eine einzige enthält =>?
Mathe-Junkie

Antworten:

5

JavaScript (ES6), 123 110 100 97 Byte

3 Bytes dank @Neil gespeichert

s=>s.replace(/\(?(.*?)\)?\s*=>\s*([^]*)/,(_,a,b)=>`function(${a})${b[0]=='{'?b:`{return ${b}}`}`)

Angenommen, die Eingabe ist eine syntaktisch gültige Pfeilfunktion und sonst nichts. Behandelt den Fall korrekt a =>\na, obwohl die Nichtbearbeitung nicht kürzer ist, soweit ich das beurteilen kann.

Ausgabe, wenn der Code durch sich selbst ausgeführt wird:

function(s){return s.replace(/\(?(.*?)\)?\s*=>\s*([^]*)/,(_,a,b)=>`function(${a})${b[0]=='{'?b:`{return ${b}}`}`)}

Ich kann 9 Bytes mit einem möglicherweise ungültigen Format speichern:

s=>s.replace(/\(?(.*?)\)?\s*=>\s*({?)([^]*?)}?$/,(_,a,z,b)=>Function(a,z?b:'return '+b))

Ausgabe für sich selbst:

function anonymous(s) {
return s.replace(/\(?([^=)]*)\)?\s*=>\s*({?)([^]*?)}?$/,(_,a,z,b)=>Function(a,z?b:'return '+b))
}

(Insbesondere ist das, function anonymousworüber ich mir Sorgen mache.)

ETH-Produktionen
quelle
Schade, dass Ihre Funktion selbst eine weitere Pfeilfunktion enthält, sodass sie beim Durchlaufen nicht vollständig transpiliert ist.
Neil
Ich denke \(?(.*?)\)?\s*=>, Sie könnten 3 Bytes sparen.
Neil
2

Retina, 86 80 79 Bytes

^ ([^ (] *?) =
($ 1) =
s (`\ s * $

> \ s * (. * [^}]) $
> {$ 1 zurückgeben}
) `(. *?) => (. *)
Funktion $ 1 $ 2

Probieren Sie es online aus!

Dank Neil ein Byte gespeichert

6 Bytes mit Hilfe von ETHproductions gespeichert

Bearbeiten: Behoben für die Möglichkeit von Zeilenumbrüchen im Funktionskörper.

75-Byte-Lösung unter der Annahme, dass die Eingabe nicht enthält §: Probieren Sie es online aus!

Mathe-Junkie
quelle
1
Sie können einen Pilcrow verwenden, anstatt \nein Byte zu speichern.
Neil
1
Dies scheint Zeilenumbrüche innerhalb des Funktionskörpers zu entfernen, die die Funktionalität verändern können.
Darrylyeo
Ich denke \sschließt ein , also kann Zeile drei sein \s*$, um 4 Bytes zu sparen.
ETHproductions
@ETHproductions Es scheint \snur übereinzustimmen , wenn die sKonfigurationsoption hinzugefügt wird. Trotzdem hat es mir ein paar Bytes erspart
Mathe-Junkie
0

PHP, 112 Bytes

preg_match("#\(??(.*)\)?=>(\{?)(.*$)#U",$argn,$m);echo"function($m[1])",trim($b=$m[3])[0]=="{"?$b:"{return $b}";

nimmt Eingaben von STDIN entgegen; laufen mit-R

Titus
quelle