Saya berencana untuk menulis GolfScript yang ditingkatkan untuk program yang lebih pendek yang dapat melakukan lebih banyak hal. Ini bukan tantangan; itu adalah permintaan umpan balik dan tip tentang apa yang harus saya lakukan. (lihat tag)
Saya tidak yakin apakah ini harus Wiki Komunitas. Jika Anda berpikir begitu, cukup tandai moderator untuk mengonversinya :)
Bahasa ini akan sangat mirip dengan GolfScript. Itu masih ditulis dalam Ruby. Namun, ada beberapa perbedaan:
- Menggunakan
`
sebagai pembatas string, karena itu adalah karakter yang tidak biasa, jadi lebih sedikit melarikan diri akan diperlukan. (Karakter lain dapat menggantikan fungsinya, seperti#
(lebih banyak tentang itu nanti)).\`
untuk menghindari backtick,\\
untuk menghindari backslash, dan tidak ada urutan melarikan diri lainnya. Jika Anda membutuhkan baris baru, cukup taruh baris baru yang sebenarnya dalam string. - Menggunakan Ruby
Rational
untuk floating point presisi sembarang, salah satu kelemahan utama GolfScript. - Kemampuan untuk mengkonversi tipe ke tipe lain. Misalnya, Anda dapat mengonversi blok ke string.
- Ekspresi reguler. Mungkin dibuat dengan
"..."
. Operator juga akan kelebihan beban untuk mereka. Sebagai contoh"\W"~{`Invalid: non-word character`}{`OK`}if
,. Secara otomatis akan dieksekusi ketika didorong dari variabel, seperti blok. - File dan objek Tanggal, untuk melakukan lebih banyak hal yang tidak mungkin di GolfScript. Ini tidak akan memiliki literal, tetapi akan memiliki fungsi untuk menginisialisasi mereka, seperti
`file.txt`fl
(nama fungsi pembuatan file dapat berubah). - Hash mungkin, tapi saya tidak yakin itu. Haruskah saya?
- Fungsi pembantu untuk melakukan lebih banyak lagi. Misalnya,
`http://example.com`net
untuk akses jaringan (sekali lagi,net
operator dapat diganti namanya).rb
untuk mengeksekusi string sebagai kode Ruby. Akan ada lebih banyak dari ini; saran diterima. - Tidak ada komentar, sehingga
#
bisa digunakan untuk hal lain. Jika Anda ingin komentar,`comment here`;
akan berfungsi dengan baik. (Mungkin#
bisa menggantikan`
fungsi) - Ini akan sepenuhnya ditulis ulang sedemikian rupa sehingga akan lebih mudah untuk menambahkan fungsi. Pada dasarnya, kode akan lebih mudah dibaca. (Pernahkah Anda melihat sumber GolfScript?
:/
) - Itu akan ada di Github sehingga bisa dikolaborasikan secara bersama. Saya akan melisensikannya di bawah MIT atau sesuatu.
- Tidak ada baris akhir, jadi quine cheaty berfungsi: P
Dan saya memisahkan ini karena saya pikir itu adalah perubahan yang paling drastis dan bermanfaat (kecuali mungkin menambahkan floating point):
- Ini akan memiliki banyak fungsi Ruby bawaan. Misalnya,
shuffle
(yang dapat disingkat menjadisf
) (sebelumnya mengambil 9 karakter ),tr
(sebelumnya 14 karakter ),sample
(sm
, sebelumnya.,rand=
),flatten
(fl
, sebelumnya ???), dll. - Itu akan menjadi bubur, seperti Rebmu. Misalnya, sekarang Anda dapat melakukan
~:a0<{0a-}aIF
(menggunakan nama variabel huruf) alih-alih~:$0<{0$-}$if
(menimpa fungsi pengurutan). (contoh dari sini ). Perhatikan bahwa cara ini tidak peka terhadap huruf besar-kecil, dan angka tidak diperbolehkan dalam nama variabel. Ini tidak apa-apa menurut saya karena ini adalah bahasa golf: P - Ini akan memiliki debugging. Saya akan menambahkan kemampuan untuk menyediakan flag yang menentukan pembatas array, pembatas elemen, dll., Keluaran angka (rasional, float, atau int?), Melangkah melalui instruksi satu per satu, tokenizing dan outputing setiap token alih-alih menjalankan program, dll.
Jadi, pertanyaan saya adalah: apa yang harus diperbaiki? Menurut Anda apa yang harus saya tambahkan?
Ada ide lain untuk ini, sebelum saya mulai mengkodekannya?
sumber
Jawaban:
I / O fleksibel
Golfscript saat ini tidak dapat digunakan untuk program interaktif. Saya mengusulkan beberapa fungsi untuk input eksplisit ditambahkan (yaitu
readline
,getchar
dan teman-teman). Penerjemah harus melihat apakah program menggunakan ini sebelum menjalankannya.Jika program tidak memanggil fungsi input apa pun, penerjemah harus bertindak seperti Golfscript biasanya.
Saya tidak akan mengharapkan penerjemah mendeteksi fungsi input dalam kode yang dibuat pada saat runtime, tetapi jika entah bagaimana bisa melakukannya, pujian.
sumber
Built-in lebih pendek
Alias karakter tunggal untuk semua perintah bawaan yang tidak memilikinya. Saya akan menggunakan
base
lebih banyak jika itu hanyaB
.sumber
b
nama variabel? Masih; ide bagus; Anda hanya ingat untuk tidak menggunakan nama itu jika Anda akan menggunakan fungsi, dan jika Anda tidak menggunakan fungsi itu, maka itu tidak mempengaruhi Anda sama sekali.^
atau$
) sebagai nama variabel. Itu tidak memperburuk masalah itu. Selain itu, saya menyarankan alias untuk memungkinkan kompatibilitas ke belakang, jadi Anda hanya perlu menggunakan nama yang lebih panjang jika Anda telah menetapkan sesuatu yang lain ke alias yang lebih pendek.Z
untukzip
juga akan sangat bermanfaat.#include
dan"#{IO.read'lib'}"~
terlalu lama).mylang -Llibname somefile.ext
.Gabungan div-mod
Ini adalah ceruk yang sedikit lebih banyak daripada beberapa saran, tetapi ketika bekerja pada program teori angka saya sering menemukan diri saya menginginkan sebuah operasi yang muncul dua bilangan bulat
a
danb
dari tumpukan dan mendoronga/b
dana%b
. (Saat ini1$1$/@@%
).sumber
dvm
DiV-Mod. Terima kasih untuk semua idenya :-) +1Angka
Ubah lexer sehingga memimpin 0 bukan bagian dari angka:
Juga angka negatif harus ditulis dengan
_
:sumber
0 100-
negatif 100. +1~
. Misalnya -1 adalah0~
. Ini membuat sejumlah kecil angka lebih lama oleh satu karakter, tetapi menghilangkan kebutuhan yang cukup sering untuk spasi putih setelahnya-
.{0\-}:~;
(~
mengecilkan angka) dan menggunakannot
bitwise (sepertiand or xor
)?Akses ke seluruh tumpukan
GolfScript adalah bahasa berbasis stack, tetapi akses ke semua kecuali tiga item teratas pada stack terbatas
<integer>$
untuk menyalin item ke-n. Akan berguna untuk memiliki sesuatu sepertiroll
perintah PostScript sehingga lebih mudah untuk bekerja dengan lebih dari tiga variabel "langsung".Idealnya akan ada versi satu-arg dan dua-arg, tetapi jika tidak ada cukup nama di sekitar maka satu-arg harus mendapatkan preferensi untuk yang satu karakter.
Yang satu-arg satu hanya mengambil jumlah item untuk bergulir. Misalnya
1 roll
tidak melakukan apa-apa;2 roll
setara dengan\
;3 roll
setara dengan@
;4 roll
dan untuk angka yang lebih tinggi tidak memiliki yang setara; yang terdekat yang mungkin adalah sesuatu seperti(dan itu bahkan tidak menangani non-integer pada posisi tertentu di stack, atau aktif
[
, dan hampir pasti juga merusak loop internal).Dua arg satu juga membutuhkan jumlah untuk menggulung;
a b roll2
setara dengan{a roll}b*
.sumber
rotate
. Anda harus mengedit ini menjadi jawaban CW.roll
hanya memutar array, bukan?CJam
Saya telah mengimplementasikan "GolfScript yang ditingkatkan" dan disebut CJam - http://sf.net/p/cjam
Sekarang pada rilis kedua (versi 0.6) sudah memiliki banyak fitur, jika tidak sebagian besar dari fitur yang dibahas di sini. Saya akan mencoba daftar mereka:
`
sebagai pembatas string - tidak, tetapi menggunakan string yang dikutip ganda dengan pelolosan minimal (\
hanya lolos\
dan"
)`http://example.com`net
-"example.com"g
#
digunakan untuk sesuatu yang lain,"comments like this";
mr
er
_,mr=
debugging - hanya jejak stack, dan
ed
operator untuk menunjukkan stackI / O fleksibel - ya, tetapi hanya input eksplisit
b
= basis,z
= zip-
- ya, tapi tidak dengan_
;1 2-3
->1 2 -3
;1 2m3
->-1 3
t
md
m*
et
ea
e<
,e>
z
(GolfScript memilikiabs
, tidak kurang):+
,:*
c
(mengkonversi ke karakter, bukan string){}/
:
yang mengkonsumsi apa yang disimpan - tidak>=
,<=
- tidak, gunakan<!
,>!
1$1$
CJam memiliki lebih banyak fitur, periksa https://sourceforge.net/p/cjam/wiki/Operators/
sumber
Ubah lexer
Lexer GolfScript memperlakukan pengidentifikasi Ruby (apa pun yang cocok dengan regex
[_a-zA-Z][_a-zA-Z0-9]*
) sebagai token tunggal. Jika bukan diperlakukan[a-zA-Z]+
sebagai token yang akan membebaskan_
menjadi built-in dan akan memungkinkan variabel alpha untuk diikuti oleh integer literal tanpa memisahkan spasi.sumber
[a-z]+|[A-Z]+
, untuk mushing, jadi garis bawah gratis. Ini adalah ide yang menarik dan sangat unik! +1Alias Unicode
Perintah beberapa karakter dapat memiliki alias unicode. Ini akan menghemat skor ketika skor dihitung dalam karakter dan bukan dalam byte.
sumber
Semacam stabil
The
$
builtin pada blok harus melakukan semacam stabil.sumber
Array mengatur operator
Adakah built-in yang dapat kami sediakan untuk itu?
sumber
Pengidentifikasi karakter tunggal
Ini tidak seperti solusi golf kode yang akan memiliki terlalu banyak variabel. Dan itu akan menghemat ruang.
sumber
% sebagai builtin untuk produk
sumber
Dukungan Regex
Kurangnya dukungan regex selalu terasa aneh dalam bahasa yang dirancang untuk bermain golf. Akan sangat bagus untuk memiliki
<string> <string> <string> y
(aliastr
, menggunakan one-char alias Perl untuk itu)<string> <string> <string> s
(pengganti)<string> <string> <block> s
(gantikan dengan panggilan balik)<string> <string> m
(pertandingan)sumber
Dibangun untuk tanggal / waktu saat ini
Saat ini sangat aneh untuk mendapatkan tanggal / waktu menggunakan Ruby evals.
sumber
Buat |, & dan ^ built-in melakukan sesuatu yang berguna pada blok
Misalnya
<array/string> <block> |
dapat digunakan sebagai fungsi indeksAda ide untuk
<array/string> <block> &
atau<array/string> <block> ^
?sumber
array block =
harus dilakukan sekarang?"0<" {0<} =
.array block =
untuk "select by predicate",
.Cara untuk mengubah simbol kembali menjadi blok kode
Saat ini, kami dapat mengikat blok kode ke simbol dengan
:
, tetapi tidak ada cara untuk membalikkan proses: mengeksekusi simbol yang terikat pada blok kode hanya menjalankan blok.Saya dapat melihat beberapa cara untuk mengimplementasikan ini:
tambahkan sintaks baru, misalnya
#foo
untuk mendorong nilaifoo
ke stack, bahkan jika itu adalah blok kode, atautambahkan operator untuk memperluas setiap simbol dalam blok kode, sehingga (menggunakan
_
sebagai operator baru), misalnya{2*}:dbl; {dbl dbl}_
akan menghasilkan{2* 2*}
.Saya bisa melihat keuntungan dari kedua metode ini. Yang terakhir dapat menggantikan yang pertama, dengan biaya dua karakter tambahan (
{foo}_
bukan#foo
), tetapi saya dapat melihat beberapa aplikasi potensial untuk sintaks sebelumnya di mana kedua karakter tersebut akan menjadi penghalang (misalnya menggunakanarray #func %
alih-alih menggunakanarray {func} %
).Sementara itu, sintaks yang pertama dapat digunakan untuk menggantikan yang terakhir jika ada cara yang mudah untuk beralih ke token dalam blok kode (yang bisa berguna sendiri, bagaimanapun).
Dalam kedua kasus tersebut, saya akan mengusulkan bahwa simbol yang diperluas yang terikat ke bawaan bawaan (yaitu diimplementasikan dalam kode Ruby) harus mengembalikan beberapa jenis rintisan yang dapat dipanggil untuk mendapatkan fungsionalitas bawaan, sementara tidak mungkin dilakukan atau tidak mungkin ditimpa. Misalnya
#$
(atau{$}_
) dapat mengembalikan misalnya{builtin_dollar}
, di manabuiltin_dollar
akan berisi implementasi aktual dari$
built-in (dan#builtin_dollar
atau{builtin_dollar}_
seharusnya hanya mengembalikan{builtin_dollar}
sendiri).Ini akan memungkinkan built-in untuk didefinisikan ulang tanpa kehilangan akses ke fungsionalitasnya (lihat saran saya sebelumnya ), sehingga jika saya, katakanlah, untuk beberapa alasan ingin menukar makna dari
$
dan@
, saya hanya bisa melakukan#$ #@ :$; :@;
(atau{$}_ {@}_ :$; :@;
).sumber
_
harus dilakukan operator jika blok kode berisi tugas variabel. Hal yang jelas adalah membiarkan:symbol
token apa pun tidak tersentuh dan memperluas apa pun, tetapi ini akan menyebabkan_
rusaknya kode apa pun menggunakan variabel lokal. Membuatnya tidak merusak kode seperti itu mungkin tidak praktis rumit.[[1] [2] [3]] _ -> [1 2 3]
.2:A;{1:A;A}_
?{1:A;2}
(atau, secara teknis,{1:A builtin_semicolon 2}
jika fitur ekspansi bawaan disertakan). Jika beberapa jenis fitur "pengecualian variabel lokal" dimasukkan, mungkin masuk akal untuk menilai hanya{1:A;A}
.{builtin_1 :A builtin_semicolon 2}
.Preset variabel dengan args baris perintah
Sayangnya, tidak ada arang yang tersisa, tetapi mungkin kita bisa menggunakannya
A
untuk itu?sumber
_
tersedia. Mungkin itu? Pokoknya, ya, golfscript membutuhkan cara mengambil args baris cmd 1Fungsi asli Ruby yang harus saya terapkan
Ini adalah Komunitas Wiki; merasa bebas untuk mengedit dan menambahkan fungsi yang menurut Anda harus saya terapkan!
Format: "
nativeFunctionName
(nameInMyLanguage
)"shuffle
(sf
)tr
(tr
)sample
(sm
)sumber
Ambil fitur dari APL dan HQ9 + juga!
sumber
Memisahkan built-in dengan jelas
misalnya modal: bawaan; membuat B untuk basis yang layak
sumber
{-}:+
.Variabel / penutupan lokal
Satu hal yang sangat saya lewatkan dalam GolfScript adalah kemampuan untuk sementara mengubah nilai simbol .
Secara khusus, saat ini tidak ada cara untuk secara sementara menimpa makna built-in "primitif": sekali Anda, katakanlah, mendefinisikan kembali
$
, Anda tidak akan pernah lagi menyortir apa pun dalam program itu. (Yah, setidaknya tanpa menulis implementasi sendiri, setidaknya.) Akan sangat bagus untuk dapat mengatakan, misalnya, bahwa dalam blok kode ini$
berarti sesuatu yang lain, tetapi masih mempertahankan makna normal di tempat lain.Terkait dengan hal di atas, alangkah baiknya untuk mengikat simbol dalam blok kode ke nilai saat ini . Tentu, saya dapat menulis, mengatakan,
{$-1%}:rsort
dan dapat digunakanrsort
untuk mengurutkan dan membalikkan array, tetapi itu hanya berfungsi selama definisi$
(atau-1
atau%
) tidak berubah, karenarsort
fungsi saya masih memanggil simbol global$
. Alangkah baiknya bisa mengatakan "biarkanrsort
melakukan apa$-1%
sekarang, bahkan jika simbol-simbol itu kemudian didefinisikan ulang."Secara khusus, perpustakaan standar dapat menggunakan jenis pengikatan ini. Agak mengejutkan untuk menyadari bahwa, katakanlah, mengubah
n
perubahan perilakuputs
, atau mendefinisikan-ulang!
sepenuhnya kacauxor
. (Kemudian lagi, beberapa kehati-hatian harus dilakukan di sini, karena, khususnya, kemampuan untuk mengubah perilakuputs
ternyata menjadi satu-satunya cara untuk menghindari mencetak baris baru akhir dalam versi GS saat ini.)Sunting: Mampu mengubah simbol kembali menjadi blok kode akan jauh menuju penerapan fungsi ini. Secara khusus,
{foo}_
sintaks yang disarankan dalam jawaban itu akan secara efektif melakukan satu tingkat pengikatan statis dengan memperluas semua simbol dalam blok kode. Kombinasikan dengan fixpoint combinator untuk pengikatan statis dalam, dan Bob adalah pamanmu ...sumber
rsort
lakukan apa yang$-1%
saat ini dilakukan, bahkan jika simbol-simbol itu kemudian didefinisikan ulang" Jadi Emmental?Lebih banyak fungsi bawaan
Buat semua variabel huruf tunggal az dan AZ melakukan fungsi generik dan berguna. Beberapa built-in yang kurang:
{+}*
saat kamu bisaS
? Anda memiliki 52 fungsi untuk bekerja di sini!x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)
. Sekarang harus menjadi@-A@@-A+
jikaA
ini adalah nilai absolut bawaan. Memang ini hanya muncul karena posting terbaru saya, tetapi saya selalu berpikir bahwa itu akan menjadi cara yang baik untuk memperluas skrip golf: tuliskan apa fungsi akan berguna untuk memiliki, mengumpulkannya, dan menambahkannya sebagai bawaan.chr
).{}/
):
yang mengkonsumsi apa yang disimpan. Ini harus tidak 'terjebak' untuk pengidentifikasi agar bermanfaat.>=
,<=
1{\}{|}if
menjadi seperti1?\?|if
1$
,2$
,3$
,4$
,5$
\.@.@\
sumber
Alangkah baiknya jika nilai yang ditulis atau dihitung pada baris terakhir suatu fungsi secara otomatis dikembalikan
sumber