Pretty.c - Scripting yang Berjalan di Atas C
(github.com/aartaka)- Pretty C adalah bahasa scripting baru yang kompatibel dengan C, yang menambahkan fitur kemudahan seperti dynamic typing, iterasi generik, dan pelacakan resource ke program C
- Cara menggunakannya adalah sebagai library header-only yang cukup menyertakan satu
pretty.h, dan dapat dipakai bersama file C serta library C yang sudah ada - Fitur yang disediakan mencakup alias seperti
string,any,nil, inferensi tipevar/let, output generikprint/println, perbandingan generikequal, serta makro ekspresi ternary yang lebih mudah dibaca - Untuk mengurangi pekerjaan iterasi dan memori, tersedia sintaks berbasis makro seperti
foreach,forthese,fortimes,forrange,new,vector,delete,with,lambda,try/catch - Beberapa fitur memiliki syarat seperti GCC, Clang, C23+, C11+, dan variabel yang dibungkus dengan
withbertipevoid *sehingga mungkin perlu dikonversi tipe sebelum digunakan
Tujuan dan Cara Penggunaan Pretty C
- Pretty C adalah bahasa scripting yang kompatibel dengan C, yang menambahkan dynamic typing, iterasi generik, pelacakan resource, dan berbagai kemudahan sintaks ke program C
- Mempertahankan kompatibilitas mundur dengan C dan library C yang sudah ada
- Terinspirasi oleh Lua, Python, JavaScript, dan Lisp
- Instalasi dapat dilakukan dengan meng-clone repository atau cukup menyalin file
pretty.h- Dapat disertakan dari file C mana pun dengan
#include "pretty.h" - Juga dapat digunakan dengan menentukan path Pretty C pada include path
- Dapat disertakan dari file C mana pun dengan
Header Bawaan dan Makro Sederhana
- Pretty C menyertakan header standar agar tipe yang sering digunakan dan ekspresi pengganti operator bisa langsung dipakai
- Juga menyediakan makro sederhana yang sering didefinisikan
max,min: nilai maksimum dan minimum dari dua angkalen: panjang arraydefault: menyediakan nilai fallbacklimit: membatasi rentang nilaibetween: memeriksa apakah angka berada dalam rentangdivisible: memeriksa apakah habis dibagi oleh angka lain
Tipe dan Alias
- Pretty C menyediakan alias tipe pendek untuk tipe C
stringadalahchar*byteadalahcharbytesadalahchar*anyadalahvoid*- Menyediakan singkatan integer
uchar,ushort,uint,ulong
- Juga mencakup alias sintaks yang dipengaruhi oleh Lua dan Lisp
eq,is:==bitnot,bitxor: alias operasi bitsuccess,fail,failure: alias untuk polasuccess == 0below,above,upto,downto: operator perbandinganeven,odd,positive,negative,zero,empty: predicate untuk angka dan datanil:NULLuntil:whilenegatifelif:else ififnt,elifnt: ekspresi keluargaif(!...)repeat: aliasdoala Luadone,finish,pass: aliasbreak,continuealways,forever,loop,indefinitely: ekspresi loop tanpa batasnever,comment: ekspresi yang tidak menjalankan kode tetapi tetap memungkinkan compiler menganalisisnya
Inferensi Tipe, Output, Perbandingan, Ekspresi Ternary
- Inferensi tipe dapat digunakan di GCC, Clang, atau C23+
- Contohnya menyediakan bentuk seperti
var t = time(0);,let lt = localtime(&t);,local at = asctime(lt);
- Contohnya menyediakan bentuk seperti
- Output generik dapat digunakan di C11+
printmencetak nilai yang diberikanprintlnmenambahkan baris baru setelah output
- Perbandingan kesetaraan generik juga disediakan sebagai fitur C11+
- Perbandingan string seperti
equal("NA", line) - Termasuk contoh perbandingan seperti
equal(0.3, 0.2 + 0.1)
- Perbandingan string seperti
- Operator ternary dapat dibuat lebih mudah dibaca dengan makro berbasis teks
whendiekspansi menjadi string kosong untuk keterbacaanunlessdiekspansi menjadinotdan berfungsi sebagai bentuk negatif dariwhenthenadalah?otherdanotherwiseadalah:onlydigunakan ketika klausaotherwisetidak diperlukanotherwhendigunakan untuk menyambungkan kondisi berikutnya
Makro Iterasi
- Pretty C mengabstraksikan pola loop
foryang sering digunakan menjadi makro foreach (var, type, length, ...)- Menelusuri array atau area memori
- Pada setiap iterasi,
varmenjadi pointer ke elemen array tersebut - Karena berupa pointer, elemen dapat dimodifikasi langsung di tempat bila perlu
forthese (var, type, ...)- Menelusuri argumen variadik yang diberikan dan mengikat setiap nilai ke
varbertipetype
- Menelusuri argumen variadik yang diberikan dan mengikat setiap nilai ke
fortimes (var, times)- Mempersingkat pola umum yang mengulang dari 0 hingga jumlah positif tertentu
forrange (var, init, target)- Menelusuri rentang angka dari
inithinggatarget initdantargetdapat berupa integer signed atau unsigned apa pun- Jika
initlebih besar daritarget, langkah iterasi akan menurun
- Menelusuri rentang angka dari
forrangeby (var, type, init, target, by)- Menelusuri
varbertipetypedariinithinggatargetdengan intervalby
- Menelusuri
Alokasi dan Utilitas Blok
- Makro alokasi menyederhanakan pola alokasi memori umum dalam bentuk yang dipengaruhi oleh C++
new (type, ...): membuat struct dan sejenisnya dalam bentuk yang mirip C++newvector (length, type, ...): menyederhanakan pola untuk mengalokasikan array dengan panjang dan tipe tertentu lalu mengisi konten awalnyadelete (...): sama denganfree, tetapi dapat digunakan bila lebih menyukai nama ala C++
- Utilitas blok menyediakan makro untuk binding lokal, eksekusi tertunda, dan pekerjaan berbasis blok
lambda (ret, name, ...): memungkinkan penggunaan nested function, lambda, dan closure di C pada GCC, Clang, atau C++with (var, close, ...): berguna untuk objek yang dialokasikan secara dinamis atau file handle dengan menyediakan fungsi pelepas resourcecloseterlebih dahulu- Kekurangannya,
varyang di-binding bertipevoid *, sehingga mungkin perlu dikonversi ke tipe yang diinginkan sebelum digunakan
- Kekurangannya,
defer: telah dihapus, dan diarahkan untuk menggunakandeferbaru yang tersediatrydancatch: memungkinkan penulisan error handling di C dalam bentuk yang lebih bergayaNOERR,NOERROR: disediakan untuk kemudahan switch-case error
Cara Berkontribusi
- Saat menambahkan fungsi, diminta mengikuti Linux Kernel Style Guide
- Disarankan menjalankan
make indentsebelum commit
- Disarankan menjalankan
- Mengikuti A’s Commit Message Guide lebih disukai, tetapi tidak wajib
1 komentar
Opini Hacker News
Tradisi membuat bahasa khusus domain di dalam C sudah lama ada
Stephen Bourne ingin menulis shell dengan gaya ALGOL, jadi ia terus-menerus “menghajar” preprosesor C sampai akhirnya tampak seperti bahasa yang ia sukai
https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh...
https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh...
https://www.ioccc.org/
Saya bertanya-tanya apakah ada yang bisa menjelaskan apakah ini lelucon, atau penulisnya benar-benar bingung
Tidak ada yang masuk akal. Ini bukan “scripting”, katanya memperkenalkan “strong typing” tetapi tidak melakukan apa pun pada tipe, dan alias operator yang katanya meniru Lua dan Lisp justru tidak ada di kedua bahasa itu. Namun ini juga tidak terlihat seperti parodi yang jelas, jadi benar-benar membingungkan
Mengklaim sebagai bahasa scripting, tetapi programnya tetap harus dikompilasi. Patut disoraki sinis
Kalau dipasangi CINT(https://root.cern.ch/root/html534/guides/users-guide/CINT.ht...), bisa langsung dijalankan dan REPL juga memungkinkan
Dulu saya pernah membaca posting blog yang membahas secara detail bagaimana
./foobekerja dan bagaimana file ELF dieksekusi. Dengan cara yang sama, tampaknya program.cjuga bisa didaftarkan agar dikompilasi lalu dijalankan[0] https://gist.github.com/jdarpinian/1952a58b823222627cc1a8b83...
[0] https://bellard.org/tcc/tcc-doc.html
“Memberikan syntactic sugar yang cukup untuk membuat developer C terkena serangan jantung diabetik.”
Saya sangat suka kalimat ini
Saya melihat beberapa hal yang perlu ditambahkan ke CNoEvil[0] dan ogw[1]. Setiap kali proyek ini muncul lagi setiap beberapa bulan, sepertinya selalu ada tambahan baru
[0] https://git.sr.ht/~shakna/cnoevil3/
[1] https://git.sr.ht/~shakna/ogw
Ini kalimat yang dengan tulus saya cintai dari lubuk hati
Ini mengulangi kesalahan yang sama seperti Python 2. String dan byte bukan tipe yang sama, dan tidak boleh diperlakukan seperti itu
argvatau keluaran subprocess, sebaiknya dianggap bertipe apa?Di sana bisa berisi nilai sampah arbitrer, jadi bukan string UTF-8 yang valid, tetapi alat seperti awk dan grep dipakai di mana-mana
String dan byte bisa dianggap sebagai tipe umum yang sama, hanya saja kadang berguna memberi tipe internal yang berbeda untuk byte UTF-8 yang valid. Rust menangani bagian ini dengan cukup baik lewat OsString dan String
https://en.cppreference.com/w/c/string/multibyte
Tidak satu pun dari itu selalu benar. Membungkus urutan byte yang tervalidasi dalam tipe yang hanya bisa dibuat lewat validasi memang berguna, tetapi setelah itu
Utf8StringdanEmailAddresspada dasarnya berada dalam kategori yang sama. Tidak ada alasan untuk memperlakukan encoding secara istimewa dalam sistem tipeJika maksudnya “teks yang bisa dibaca manusia”, saya setuju bahwa string tidak sama dengan array byte arbitrer. Namun banyak bahasa tidak memaksakan definisi itu
Teringat sebuah codebase C++ yang dulu harus saya periksa. Seluruhnya dibuat seolah-olah ditulis dalam Java: camel case untuk semuanya, getter/setter untuk setiap variabel kelas, dan interface di mana-mana
https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd...
Sulit dipercaya bahwa itu bukan ALGOL
std::string, tetapi diberi metode ala Javahttps://learn.microsoft.com/en-us/cpp/cpp/property-cpp?view=...
f(String *), jadi kode C++-nya berbentukf(new String("Hello")Kalau ini menarik, mungkin Anda juga akan suka libcello.h
https://www.libcello.org
Nama-nama tipenya bagus, dan pilihan makro fungsi bawaan seperti
minjuga sempurna. Saya juga sukaLenOperator boolean bernama mungkin agak berlebihan, tetapi layak dicoba, dan operator ternary memang sulit dibaca, jadi masih banyak ruang untuk perbaikan. Saya belum sepenuhnya yakin dengan semua definisi loop, tetapi sebagian masuk akal. Pelacakan resource mengesankan, dan bentuk
for...agak kurang enak dilihat, jadi mungkin bisa diberi nama lainSecara keseluruhan ini upaya yang cukup solid. Untuk desainnya saya ingin memberi sekitar 8/10. Cara mensketsanya dengan makro C benar-benar elegan dan tampak seperti kode yang memang bagus. Entah apakah saya akan memakainya langsung. Ini bahasa baru, dan saya sudah menyukai C. Meski begitu, cara implementasinya sangat jelas, jadi bisa membantu orang belajar C dan memikirkan desain bahasa
len(),max/min, dan beberapa makro operator. Soalnya saya belum terlalu membutuhkan banyak fitur lezat lainnya. Jadi sebaiknya coba saja beberapa makro operator duluKalau
ifntuntukif(!...), unless tampaknya lebih mudah dibaca daripadaifntfor(;;)juga bisa disebutalwaysDi bahasa lain saya pernah melihat
loop. Tapi Qt menyebutnyaforever, dan itu benar-benar cantik. Sangat khas Qt jugaifntlucu kalau diucapkan keras-kerasunlesssaya sisakan untuk kondisi ternary. Karena di sana bagaimanapun lebih bergunaAh, tunggu, ini John Tromp. Pembuat BLC! Saya penggemarnya