Tugas Anda adalah untuk menempelkan fitur ke bahasa pemrograman, baik dengan menerapkan pustaka yang sangat pintar, atau dengan memproses teks input dan / atau mengubah proses kompilasi.
Ide ide:
- Tambahkan presentasi PHP-style interleaving ke C (mis
<?c printf("Hello,"); ?> world!
). - Tambahkan operator penggabungan nol ke salah satu bahasa yang bukan C #.
- Tambahkan makro ke PHP.
- Tambahkan
goto
ke JavaScript. - Tambahkan pencocokan pola ke bahasa X.
- Tambahkan dukungan namespace ke bahasa yang tidak memilikinya.
- Buat C terlihat seperti PHP.
- Buat Haskell terlihat seperti Pascal.
- ... (jangan ragu untuk mengirim ide di bagian komentar)
Aturan:
- Bawa sesuatu ke meja. Jangan hanya mengatakan "Templat Haskell" untuk menambahkan fasilitas metaprogramming ke Haskell. Ini bukan StackOverflow.
- Seluruh implementasi harus sesuai dalam satu layar penuh (tidak termasuk contoh).
- Jangan meng-host kode di situs eksternal khusus untuk tugas ini.
- Fitur yang paling mengesankan atau mengejutkan menang.
Jangan khawatir tentang penerapan fitur 100% dengan benar. Jauh dari itu! Tantangan utama adalah mencari tahu apa yang ingin Anda lakukan dan dengan kejam memotong detail sampai usaha yang Anda rencanakan menjadi layak.
Contoh:
Tambahkan operator lambda ke bahasa pemrograman C.
Pendekatan awal:
Oke, saya tahu saya ingin menggunakan libgc sehingga lambda saya akan memecahkan masalah funarg ke atas dan ke bawah. Saya kira hal pertama yang perlu saya lakukan adalah menulis / menemukan parser untuk bahasa pemrograman C, maka saya harus belajar semua tentang sistem tipe C. Saya harus mencari cara untuk memahami sejauh jenis pergi. Apakah saya perlu menerapkan inferensi tipe, atau haruskah saya meminta agar parameter formal diketik seperti yang diberikan? Bagaimana dengan semua fitur gila di CI yang belum Anda ketahui?
Cukup jelas bahwa mengimplementasikan lambda di C dengan benar akan menjadi usaha yang sangat besar. Lupakan kebenaran! Sederhanakan, sederhanakan.
Lebih baik:
Persetan funargs ke atas, siapa yang butuh mereka? Saya mungkin bisa melakukan sesuatu yang rumit dengan fungsi bersarang GNU C dan ekspresi pernyataan . Saya ingin memamerkan transformasi sintaksis yang luar biasa pada C dengan kode pendek, kasar, tetapi saya bahkan tidak perlu parser untuk ini. Itu bisa menunggu satu hari lagi.
Hasil (membutuhkan GCC):
#include <stdio.h>
#include <stdlib.h>
#define lambda(d,e)({d;typeof(e)f(d){return(e);};f;})
#define map(F,A)({typeof(F)f=(F);typeof(*(A))*a=(A);({int i,l=((int*)(a))[-1]; \
typeof(f(*a))*r=(void*)((char*)malloc(sizeof(int)+l*sizeof(*r))+sizeof(int)); \
((int*)r)[-1]=l;for(i=0;i<l;i++)r[i]=f(a[i]);r;});})
#define convert_to(T) lambda(T x, x)
#define print(T, fmt) lambda(T x, printf(fmt "\n", x))
int main(void)
{
int *array = 1 + (int[]){10, 1,2,3,4,5,6,7,8,9,10};
map(print(int, "%d"), array);
double *array2 = map(lambda(int x, (double)x * 0.5), array);
map(print(double, "%.1f"), array2);
long *array3 = map(convert_to(long), array2);
map(print(long, "%ld"), array3);
long product = 1;
map(lambda(int x, product *= x), array);
printf("product: %ld\n", product);
return 0;
}
Itu mudah, bukan? Saya bahkan melempar map
makro untuk membuatnya berguna dan cantik.
sumber
Jawaban:
Sintaks OOP di Haskell
Objek dapat memiliki properti:
... dan metode:
sumber
&
dan didefinisikan seperti ini(&) = flip ($)
.&
karena itu adalah 'alamat-dari' operator unary (implementasi pointer di Haskell dibiarkan sebagai latihan untuk pembaca).flip id
goto
dalam JavaScript?Pikiran pertama saya adalah pendekatan fungsional - untuk menambahkan parameter ke fungsi untuk menunjukkan di mana eksekusi harus dimulai, menggunakannya dengan
switch
pernyataan dan loop luar berulang kali memanggil fungsi pada nilai kembali sendiri . Sayangnya, itu akan menghalangi penggunaan variabel lokal, karena mereka akan kehilangan nilainya dengan setiap kebohongan.Saya bisa menggunakan
with
pernyataan dan memindahkan semua deklarasi variabel ke awal fungsi, tetapi harus ada cara yang lebih baik. Akhirnya saya sadar untuk menggunakan penanganan pengecualian JavaScript . Bahkan, Joel Spolsky berkata, "Saya menganggap pengecualian tidak lebih baik daripada" goto ... " - jelas sangat cocok.Idenya adalah untuk menempatkan loop tak terbatas di dalam suatu fungsi, diakhiri hanya dengan
return
pernyataan atau pengecualian tanpa tertangkap. Semua foto, diperlakukan sebagai pengecualian, akan ditangkap dalam loop untuk mencegah penghentiannya. Inilah hasil dari pendekatan itu:Anda dapat menggunakannya seperti ini - bahkan dalam mode ketat ES5 - kecuali di Internet Explorer ( demo ):
[Internet Explorer, karena suatu alasan, gagal untuk mengevaluasi kode fungsi anonim, jadi orang harus memberi fungsi nama (sebelum menulis ulang) dan menyebutnya dengan menggunakan nama itu. Tentu saja, itu mungkin akan melanggar aturan mode ketat.]
Ini tidak memungkinkan melompat ke pernyataan yang terletak di dalam blok (sampai konstruksi seperti perangkat Duff menjadi legal), tetapi kita dapat mengatasinya (fungsi menulis ulang yang dijalankan sendiri), kan?
sumber
goto
diterapkan sepenuhnya dalam JavaScript (ke tempat Anda dapat menggunakangoto
untuk melompat keluar dari ruang lingkup apa pun, bahkan suatu fungsi ), itu akan menyiratkan dukungan untuk kelanjutan.#define di Jawa
Saya pikir akan menyenangkan untuk mengimplementasikan makro di Jawa.
Contoh penggunaan (konversi ke kode yang diposting sebelumnya; mari buat ini aneh):
sumber
Pejuang di C
Iterate array (berfungsi untuk array statis, bukan array, diterima melalui pointer)
Untuk mengujinya:
hasil:
sumber
Properti dalam C
Tomasz Wegrzanowski mengimplementasikan properti di plain C, dengan sengaja memisahkan program ketika properti diakses.
Objek dengan "properti" diatur dengan membuat
struct
yang melintasi beberapa halaman, memastikan bahwa alamat memori properti terletak di halaman yang berbeda dari anggota data nyata. Halaman properti ditandai sebagai tidak ada akses, menjamin bahwa upaya untuk mengakses properti akan menyebabkan segfault. Penangan kesalahan kemudian mencari tahu akses properti mana yang menyebabkan segfault, dan memanggil fungsi yang sesuai untuk menghitung nilai properti, yang disimpan di alamat memori properti.Penangan kesalahan juga menandai halaman data sebagai hanya-baca untuk memastikan nilai yang dihitung tetap konsisten; ketika Anda selanjutnya mencoba menulis ke anggota data, yang memicu segfault, yang penangannya mengatur halaman data sebagai baca-tulis dan halaman properti sebagai tidak ada akses (menunjukkan bahwa itu perlu dihitung ulang).
sumber
Dihitung berasal dari Common Lisp
Awalnya saya menerapkan asal-usul. Tapi itu tidak cukup baik.
Terinspirasi oleh goto yang dihitung, saya memutuskan untuk menerapkan komputasi yang berasal.
Contoh penggunaan
Untuk setiap deklarasi berasal di tagbody, itu akan memeriksa pada setiap label jika variabel berasal dari sama dengan label saat ini, dan jika demikian, lompat ke deklarasi asal-datang yang sesuai.
Lebih ramah
FizzBuzz
sumber
"Auto-string" di Ruby
Kode ini cukup sederhana:
Sekarang kamu bisa melakukannya
sumber
Tambahkan makro ke PHP
Kita bisa menggunakan preprosesor C untuk tugas ini.
Script php:
Pipa itu melalui cpp:
Hasil:
sumber
<<<HEREDOC
tidak lebih dari 3 shift bawah atau kiri dan pengidentifikasi :-) Ini akan melakukan substitusi makro dalam string heredoc.grep -v ^#
memperbaikinya. Saya kira ini sudah cukup untuk pertanyaan ini :-)PenjagaPola Pencocokandengan PythonTubuh fungsi datang pada 288 karakter.
PelindungPencocokan Polamemungkinkan Anda menggunakan fungsi yang sama sekali berbeda tergantung pada nilai argumen. Meskipun dapat dengan mudah ditiru dengan serangkaianif
pernyataan, penjaga yangcocok dengan poladapat membantu bagian kode yang terpisah, dan itu adalah alasan yang bagus untuk melakukan beberapa pemrograman metafila.pattern_match
adalah dekorator yang menciptakan fungsi baru yang mengimplementasikan penjagapencocokan pola. Kondisi untuk setiap "subfungsi" yang diberikan dalam setiap dokumen pada garis yang dimulai dengan pipa (|
). Jika semua kondisi mengevaluasi dengan benar, versi fungsi itu dijalankan. Fungsi diuji secara berurutan sampai kecocokan ditemukan. Kalau tidak,None
dikembalikan.Contoh akan membantu memperjelas:
sumber
f [a,b,c] = ...
, yang tidak hanya menguji argumen terhadap predikat, tetapi juga mengikat masing-masing variabel saat pertandingan berhasil. Ini masih cukup keren.f (x:xs) = ...
danf [] = ...
). Entah bagaimana aku berbelit penjaga ke sana, tapi di situlah aku mengambil|
dari.Coroutine
Saya tidak bisa mengambil kredit untuk ini, jadi saya sudah menandainya CW.
Coroutines in C oleh Simon Tatham
sumber
Operator khusus di Lua
Pogs secara cerdik menyalahgunakan overloading operator di Lua untuk memungkinkan operator infix kustom untuk didefinisikan. Saya telah memperluas ini untuk mendukung bagian operator (sebagian menerapkan operator dengan salah satu operan) dan memanggil objek yang dihasilkan seolah-olah itu adalah fungsi.
sumber
String multiline dalam javascript
dalam sintaks yang rumit ini untuk string multiline, setiap string multiline akan didahului dengan
(function(){/*
dan baris baru, dan diikuti oleh baris baru dan*/}+'').split('\n').slice(1,-1).join('\n')
.menggunakan sintaks yang luar biasa dan intuitif ini, akhirnya kita bisa menggunakan string multiline:
untuk orang-orang yang tidak menyukai sintaksis sederhana kami, kami memiliki kompiler untuk bahasa baru kami yang luar biasa:
contoh yang sama, dalam versi bahasa yang dikompilasi:
sumber
*/
string multiline saya. Ini sangat menjengkelkan saat menyertakan regexps di string!Daftar Sliceable dalam C # (seperti Python)
Saya selalu menikmati notasi potongan python dan berharap itu tersedia dalam C #
Pemakaian:
Kode, jauh dari bukti kesalahan:
sumber
Jadikan C lebih sederhana
Kode ini memungkinkan Anda untuk menulis program C yang agak mirip dengan bahasa skrip. Ini menampilkan kata kunci seperti 'var', 'is', 'string', 'plus', 'equal' dan beberapa lainnya. Ia bekerja melalui banyak pernyataan yang didefinisikan.
Ini memungkinkan Anda untuk menulis kode seperti:
Di atas akan diperluas ke:
Mungkin tidak terlalu berguna tetapi saya merasa cukup menarik bahwa Anda pada dasarnya dapat membuat seluruh bahasa pemrograman melalui sekelompok
#define
s.sumber
#define
s yang cukup kompleks , Anda bahkan dapat memberikan hal-hal bahasa Anda seperti penanganan pengecualian dan pengumpulan sampah sambil tetap menjaga lapisan C fundamental di bawahnya.Tcl
Tcl tidak
do ... while
atau kurangdo ... until
...Contoh:
uplevel
mengeksekusi skrip dalam ruang lingkup penelepon.sumber
Masuk dalam PostScript
Pikiran pertama saya adalah bahwa saya harus muck sekitar dengan tumpukan exec, jadi ini mulai salah menggali operator lanjutan untuk berhenti dari ghostscript (atau xpost).
Tapi, itu lebih sederhana dari itu. Karena posisi file sama untuk semua duplikat dari pegangan file (
setfileposition
menggunakan argumennya, jadi ini adalah satu-satunya semantik yang berguna untuk fungsi itu).Mencetak
5
.Ada beberapa batasan dengan hal di atas. Lompatannya tidak langsung, tetapi terjadi ketika if-body kembali ke level atas dan penerjemah membaca lagi dari file (alih-alih membaca dari array yang berisi if-body). Pada saat itu, file telah diposisikan ulang dan 'goto' mulai berlaku.
sumber
currentfile <pos> setfileposition
, menghitung byte dari awal file.Symbol#to_proc
dengan argumen di RubySymbol#to_proc
mungkin salah satu trik favorit saya untuk menulis kode Ruby yang sangat singkat. Misalkan Anda punyadan Anda ingin mengonversi konten dari
nums
dantext
ke Mengapung dan huruf besar, masing-masing.Symbol#to_proc
memungkinkan Anda untuk mempersingkat kode seperti ini:untuk ini:
Luar biasa! Tetapi bagaimana jika kita ingin meningkatkan setiap elemen
nums
menjadii
kekuatan th, atau mengganti setiap kejadians
dengan*
intext
? Apakah ada cara untuk mempersingkat kode seperti ini?Sayangnya, tidak ada cara mudah untuk menyampaikan argumen saat menggunakan
Symbol#to_proc
. Saya telah melihatnya melakukan banyak cara, tetapi mungkin dua yang paling pintar dan bisa digunakan adalah menambal monyet diSymbol
kelas [ 1 , 2 ]. Saya akan menggambarkan cara pertama di bawah ini.Sekarang Anda dapat melakukan hal-hal seperti:
sumber
JavaScript sebelumnya
Keluaran
Sintaks alternatif, lebih seperti Tcl.
sumber
Gotos di Haskell
ide dasarnya adalah gotos dapat disimulasikan sebagian menggunakan pernyataan terakhir di
do
-notations. sebagai contoh:setara dengan
karena eksekusi akan melompat ke pernyataan terakhir, itu optimal untuk mengekspresikan gotos.
karena cara itu dilakukan, gotos hanya melompat ketika mereka berada di
do
blok definisi tingkat atas secara langsung. sebenarnya "panggil x dan abaikan sisa pernyataan yang terlihat secara leksikal " daripada "semua x dan abaikan sisa pernyataan", seperti kebohongan nyata.masalah terbesar adalah ketika tidak ada cara untuk meninggalkan eksekusi dari tengah tindakan IO - bahkan
return
tidak;return
tidak melakukan apa-apa ketika itu bukan pernyataan terakhir.ini mengatasi ini dengan menangkap sisa pernyataan oleh orang lain
do
blok .menjadi
yang
print 3
pernyataan ditangkap olehdo
blok, sehinggaloop
menjadi pernyataan terakhir.transformasi ini juga mendukung variabel yang hadir di lingkup tindakan. ini dilakukan dengan mengingat variabel yang ada dalam ruang lingkup, dan meneruskannya ke tindakan. sebagai contoh:
ini hanya diterjemahkan menjadi:
beberapa catatan:
juga, sebuah
return undefined
pernyataan ditambahkan untuk memastikan penangkapando
blok tidak kosong.karena kadang-kadang ada tipe ambiguitas di
do
blok penangkap , alih-alihconst
kami gunakanasTypeOf
, yang samaconst
tetapi membutuhkan kedua parameternya untuk memiliki tipe yang sama.implementasi aktual (dalam javascript):
contoh:
menjadi:
keluaran:
sumber
return
di Haskell adalah fungsi biasa, dan tidak terkait dengan kata kunci di C / etc.Python Goto
mengerti
Pemakaian
Contoh Uji Kasus
Contoh Hasil Uji Kasus
Hanya sedikit bersenang-senang dengan exec (). Dapat meningkatkan kesalahan kedalaman rekursi maksimum jika tidak digunakan dengan benar.
sumber
// impor javascript tanpa menggunakan tag skrip khusus di halaman HTML
Itu timpang ya aku tahu. Durasi: 99
sumber
script
tag di sekitarnya. Lalu di mana tepatnya fitur baru itu?