Transpile fungsi-fungsi panah ES6 ini!

8

Standar ECMAScript 6 menambahkan banyak fitur baru ke bahasa JavaScript, termasuk notasi fungsi panah baru .

Tugas Anda adalah menulis transpiler ES6-ke-ES5 dasar. Diberi hanya fungsi panah ES6 sebagai input, menghasilkan mitra ES5 yang kompatibel.

Ini ! Semoga program terpendek dalam byte menang!


Dasar

Fungsi panah terlihat seperti ini:

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

Dan ekspresi fungsi ES5 yang setara terlihat seperti ini:

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

Secara umum, Anda dapat menyalin tubuh fungsi (semuanya di antara kurung kurawal) kata demi kata.


Pernyataan Pengembalian Tersirat

Alih-alih tubuh dengan kurung kurawal, ekspresi tunggal dapat digunakan; hasil dari ungkapan ini kemudian dikembalikan.

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

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

Contoh lain:

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

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

Sekali lagi, Anda cukup menyalin ekspresi kata demi kata - TETAPI berhati-hatilah agar Anda tidak menghasilkan jeda baris antara returnkata kunci dan kata kunci untuk menghindari penyisipan titik koma otomatis!


Satu argumen

Tanda kurung adalah opsional jika satu argumen disediakan.

foo => { return foo + 'bar' }

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

Ruang putih

Terakhir, Anda harus dapat memperhitungkan sejumlah karakter spasi putih (spasi, tab, baris baru) sebelum atau setelah tanda kurung, variabel, koma, kurung kurawal, dan panah *.

 ( o   ,  O
     , _    )=>{

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

Apakah Anda memilih untuk mempertahankan spasi putih di output, itu terserah Anda. Simpan, hapus, atau tambahkan milik Anda - pastikan kode itu valid!

* Secara teknis ilegal jika panah datang segera setelah jeda baris, tetapi saya ragu fakta ini akan membantu Anda. :)


Cara cepat untuk memvalidasi output Anda:

Masuk var foo = <your output>; foo()ke konsol browser Anda. Jika tidak mengeluh, Anda mungkin berada di jalur yang benar.


Lebih banyak aturan untuk para penyihir:

  • Input adalah fungsi panah ES6 yang valid secara sintaksis.
  • Asumsikan tubuh fungsi adalah ES5-kompatibel (dan tidak referensi this, super, arguments, dll). Ini juga berarti bahwa fungsi tidak akan pernah mengandung fungsi panah lain (tetapi Anda mungkin tidak berasumsi bahwa "=>" tidak akan pernah terjadi di dalam tubuh).
  • Nama variabel hanya akan terdiri dari huruf Latin dasar, $dan _.
  • Anda tidak perlu mentranspilasikan fitur ES6 yang tidak terdaftar di atas (parameter default, operator lainnya, perusakan, dll).
  • Ruang setelah returnpernyataan adalah opsional jika diikuti oleh (, [atau {.
  • Tidak sepenuhnya perlu mencocokkan kasus pengujian saya dengan tepat - Anda dapat memodifikasi kode sebanyak yang Anda butuhkan jika itu akan membantu menurunkan jumlah byte Anda. Sungguh, selama Anda menghasilkan ekspresi fungsi ES5 yang secara sintaksis valid, dan setara secara fungsional, berarti Anda hebat!
Darrylyeo
sumber
Bolehkah kita menganggap input adalah fungsi panah yang valid secara sintaksis dan tidak ada yang lain?
ETHproduksi
Kasus tepi akan a =>\na, di mana function(a){ return\na }sebenarnya akan kembali undefinedtidak peduli apa nilainya a. Apakah kita perlu menangani ini?
ETHproduksi
@ ETHproductions Jangan hanya menyukai titik koma automagik itu!
Neil
Apakah kita akan mendapatkan fungsi ES6 bersarang?
user41805
Bisakah kita berasumsi bahwa input hanya akan berisi satu =>?
pecandu matematika

Jawaban:

5

JavaScript (ES6), 123 110 100 97 byte

Disimpan 3 byte berkat @Neil

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

Asumsikan input adalah fungsi panah yang valid secara sintaksis dan tidak ada yang lain. Benar menangani kasus ini a =>\na, meskipun tidak menangani tidak lebih pendek sejauh yang saya tahu.

Output ketika kode dijalankan dengan sendirinya:

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

Saya dapat menyimpan 9 byte dengan format yang mungkin tidak valid:

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

Output untuk dirinya sendiri:

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

(Secara khusus, function anonymousitulah yang saya khawatirkan.)

Produksi ETH
sumber
Malu bahwa fungsi Anda sendiri mengandung fungsi panah lebih lanjut sehingga ketika dijalankan sendiri itu sebenarnya tidak sepenuhnya ditransformasikan.
Neil
kupikir \(?(.*?)\)?\s*=> mungkin menghemat 3 byte.
Neil
2

Retina, 86 80 79 byte

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

> \ s * (. * [^}]) $
> {return $ 1}
) `(. *?) => (. *)
fungsi $ 1 $ 2

Cobalah secara Online!

Menyimpan satu byte berkat Neil

Disimpan 6 byte dengan bantuan dari ETHproductions

Edit: Memperbaiki kemungkinan baris baru di badan fungsi.

Solusi 75 byte dengan asumsi input tidak akan berisi §: Cobalah Online!

pecandu matematika
sumber
1
Anda dapat menggunakan pilcrow alih-alih \nmenyimpan byte.
Neil
1
Ini tampaknya menghapus jeda baris dalam tubuh fungsi, yang dapat mengubah fungsionalitas.
darrylyeo
Saya pikir \stermasuk , jadi baris tiga bisa \s*$menghemat 4 byte.
ETHproductions
@ ETHproductions Tampaknya \shanya cocok ketika sopsi konfigurasi ditambahkan. Namun demikian, itu menyelamatkan saya beberapa byte
pecandu matematika
0

PHP, 112 byte

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

menerima input dari STDIN; jalankan bersama-R

Titus
sumber