これらのES6アロー関数をトランスパイルしてください!


8

ECMAScript 6標準は、新しいアロー関数表記を含む多くの新機能をJavaScript言語に追加しました。

あなたの仕事は、基本的なES6からES5へのトランスパイラーを作成することです。ES6の矢印関数のみを入力として、ES5互換の対応物を出力します。

それはです!バイトで最短のプログラムが勝ちますように!


基礎

アロー関数は次のようになります。

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

そして、同等のES5関数式は次のようになります。

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

一般に、関数の本文(中括弧内のすべて)をそのままコピーできます。


暗黙の戻りステートメント

中括弧の付いたボディの代わりに、単一の式を使用できます。次に、この式の結果が返されます。

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

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

もう一つの例:

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

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

繰り返しになりますが、式をそのままコピーすることもできますreturn。ただし、セミコロンの自動挿入を避けるために、式とキーワードの間に改行を出力しないように注意してください。


1つの引数

引数を1つ指定する場合、括弧はオプションです。

foo => { return foo + 'bar' }

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

空白

最後に、括弧、変数、コンマ、中括弧、および矢印*の前後の任意の数の空白文字(スペース、タブ、改行)を考慮する必要があります。

 ( o   ,  O
     , _    )=>{

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

出力の空白を保持するかどうかはあなた次第です。「em」を保持するか、「em」を削除するか、独自に追加します-有効なコードであることを確認してください!

*矢印が改行の直後に来るのは技術的には違法ですが、この事実があなたに役立つとは思えません。:)


出力を検証する簡単な方法:

var foo = <your output>; foo()ブラウザコンソールに入力します。それが文句を言わなければ、あなたはおそらく正しい軌道に乗っています。


ウィザードのその他のルール:

  • 入力は、構文的に有効なES6矢印関数です。
  • 関数の本体はES5互換であると仮定(および参照しないthis、super、arguments、など)。これは、関数に別の矢印関数が含まれることは決してないことを意味します(ただし、「=>」が本体内で発生しないとは限りません)。
  • 変数名は、基本的なラテン文字で構成され、ます$と_。
  • 上記にリストされていないES6機能(デフォルトのパラメーター、レストオペレーター、構造化解除など)をトランスパイルする必要はありません。
  • 後のスペースreturnの文が続く場合は、オプションである(、[または{。
  • テストケースを厳密に一致させる必要はありません。バイト数を減らすのに役立つ場合は、コードを必要なだけ変更できます。本当に、構文的に有効で機能的に同等のES5関数式を生成する限り、あなたは黄金です!

入力が構文的に有効な矢印関数であり、他に何もないと想定できますか?
— ETHproductions 2017

エッジケースはでありa =>\na、function(a){ return\na }実際undefinedにaはの値が何であっても返されます。これを処理する必要がありますか?
— ETHproductions 2017

@ETHproductionsこれらのオートマジックセミコロンだけが好きではありませんか。
— ニール、

ネストされたES6関数を取得しますか?
— user41805

入力に含まれるのは1つだけであると想定できます=>か?
— 数学のジャンキー2017

回答:


5

JavaScriptの(ES6)、123の 110 100 97バイト

@Neilのおかげで3バイト節約

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

入力が構文的に有効な矢印関数であり、他には何もないと仮定します。ケースを正しく処理しますが、a =>\na私が知る限り、処理は短くなりません。

コード自体が実行されたときに出力されます。

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

おそらく無効な形式で9バイトを保存できます。

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

自身の出力:

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

(具体的には、これfunction anonymousが私が心配していることです。)


関数自体に追加の矢印関数が含まれているため、それ自体を実行しても実際には完全に変換されないのは残念です。
— ニール

\(?(.*?)\)?\s*=>3バイト節約できると思います。
— Neil、

2

Retina、86 80 79バイト

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

> \ s *(。* [^}])$
> {返品$ 1}
) `(。*?)=>(。*)
関数$ 1 $ 2

オンラインでお試しください!

ニールのおかげでバイトを節約

ETHproductionsの助けを借りて6バイトを節約

編集:関数本体の改行の可能性を修正しました。

入力に含まれないと想定した75バイトのソリューション§:オンラインで試してみてください!


1
\nバイトを保存する代わりに、ピルクロウを使用できます。
— Neil、

1
これにより、関数本体内の改行が削除され、機能が変更される可能性があります。
— darrylyeo

が\s含まれていると思うので、3行目では\s*$4バイトを節約できます。
— ETHproductions 2017

@ETHproductions 構成オプションが追加された場合に\sのみ一致するsようです。それにもかかわらず、それは私にいくつかのバイトを節約しました
— 数学中毒

0

PHP、112バイト

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

STDINから入力を受け取ります。と一緒に走る-R

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.