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 Code-Golf ! 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 return
Schlü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
,arguments
usw.). 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
return
Anweisung 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!
a =>\na
, wofunction(a){ return\na }
tatsächlich zurückgegeben würde ,undefined
egal was der Wert vona
ist. Müssen wir damit umgehen?=>
?Antworten:
JavaScript (ES6),
12311010097 Byte3 Bytes dank @Neil gespeichert
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:
Ich kann 9 Bytes mit einem möglicherweise ungültigen Format speichern:
Ausgabe für sich selbst:
(Insbesondere ist das,
function anonymous
worüber ich mir Sorgen mache.)quelle
\(?(.*?)\)?\s*=>
, Sie könnten 3 Bytes sparen.Retina,
868079 BytesProbieren 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!quelle
\n
ein Byte zu speichern.\s
schließt ein¶
, also kann Zeile drei sein\s*$
, um 4 Bytes zu sparen.\s
nur übereinzustimmen ,¶
wenn dies
Konfigurationsoption hinzugefügt wird. Trotzdem hat es mir ein paar Bytes erspartPHP, 112 Bytes
nimmt Eingaben von STDIN entgegen; laufen mit
-R
quelle