Versi perbaikan GolfScript [ditutup]


12

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 Rationaluntuk 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`netuntuk akses jaringan (sekali lagi, netoperator dapat diganti namanya). rbuntuk 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 menjadi sf) (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?


Sadarilah bahwa jika Anda menambahkan mushing Anda kehilangan sensitivitas case.
marinus

@marinus saya menyadari itu. Aku seharusnya menjelaskan itu; mengedit ...
Gagang Pintu

Apa yang benar-benar dibutuhkan adalah cara untuk melakukan I / O secara eksplisit (untuk program interaktif). Penerjemah dapat memeriksa sebelumnya jika program menggunakan I / O eksplisit, dan hanya melakukan I / O implisit jika tidak.
marinus

@marinus Hebat, Anda harus menambahkan itu sebagai jawaban kalau begitu :)
Doorknob

1
@Claudiu Perkembangan saya pada bahasa baru saya cukup hidup, meskipun saya baru-baru ini cukup sibuk sehingga saya belum melakukan banyak hal dengannya untuk sementara waktu. Beberapa dari ide-ide ini bukanlah ide yang baik, yang tidak saya gunakan: P
Doorknob

Jawaban:


17

I / O fleksibel

Golfscript saat ini tidak dapat digunakan untuk program interaktif. Saya mengusulkan beberapa fungsi untuk input eksplisit ditambahkan (yaitu readline, getchardan 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.


Ini ide yang bagus; limited io adalah salah satu batasan besar golfscript. +1
Gagang Pintu

11

Built-in lebih pendek

Alias ​​karakter tunggal untuk semua perintah bawaan yang tidak memilikinya. Saya akan menggunakan baselebih banyak jika itu hanya B.


Tetapi bagaimana jika Anda menggunakan bnama 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.
Gagang Pintu

@DoorknobofSnow, Anda sudah dapat menggunakan built-in (dan bahkan token seperti ^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.
Peter Taylor

4
Zuntuk zipjuga akan sangat bermanfaat.
Howard

Mungkin kita bisa merilis perpustakaan standar resmi untuk GolfScript. Tetapi saya tidak jelas tentang bagaimana hal itu dapat dimasukkan dalam solusi (hilang #includedan "#{IO.read'lib'}"~terlalu lama).
Howard

@Howard Nah, itu ide ... Saya bisa menambahkan perpustakaan ke dalam bahasa saya, mungkin seperti mylang -Llibname somefile.ext.
Gagang Pintu

9

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 adan bdari tumpukan dan mendorong a/bdan a%b. (Saat ini 1$1$/@@%).


Karena begitu ceruk, mungkin seperti dvmDiV-Mod. Terima kasih untuk semua idenya :-) +1
Gagang Pintu

8

Angka

Ubah lexer sehingga memimpin 0 bukan bagian dari angka:

# current behaviour
01     # -> 1

# new
01     # -> 0 1

Juga angka negatif harus ditulis dengan _:

# current behaviour
1 2-3   # -> -1 3

# new
1 2_3     # -> 1 2 -3

Wow, itu menarik. Biasanya Anda biasanya tidak menekan dua angka berturut-turut, tetapi ini akan banyak membantu. Hal negatifnya juga hebat, bukan 0 100-negatif 100. +1
Gagang Pintu

1
Saya sudah memikirkan hal ini sebelumnya. Seharusnya tidak ada dukungan untuk literer bilangan negatif sama sekali. Sudah ditangani oleh ~. Misalnya -1 adalah 0~. Ini membuat sejumlah kecil angka lebih lama oleh satu karakter, tetapi menghilangkan kebutuhan yang cukup sering untuk spasi putih setelahnya -.
Peter Taylor

Tunggu sebentar, bagaimana Anda mendorong, misalnya, 1001? Saya pikir Anda berarti memimpin nol, bukan tertinggal.
Gagang Pintu

@DoorknobofSekarang Benar.
Howard

Apa yang akan Anda pikirkan tentang melakukan {0\-}:~;( ~mengecilkan angka) dan menggunakan notbitwise (seperti and or xor)?
Gagang Pintu

8

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 seperti rollperintah 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 rolltidak melakukan apa-apa; 2 rollsetara dengan \; 3 rollsetara dengan @; 4 rolldan untuk angka yang lebih tinggi tidak memiliki yang setara; yang terdekat yang mungkin adalah sesuatu seperti

]-4/()\+\+[]*-1%~

(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 roll2setara dengan {a roll}b*.


Jadi, seperti Ruby rotate. Anda harus mengedit ini menjadi jawaban CW.
Gagang Pintu

@ Doorknob, tidak. Saya sedang berbicara tentang operasi pada sepotong stack, bukan pada array.
Peter Taylor

Umm ... aku tidak yakin apa maksudmu. Saya tidak terbiasa dengan postscript, tetapi rollhanya memutar array, bukan?
Gagang Pintu

@DoorknobofSnow, tumpukan . Array adalah item yang berada di stack.
Peter Taylor

Oh, jadi itu memutar seluruh tumpukan . Ah, itu mungkin berguna! +1
Gagang Pintu

8

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:

  • masih ditulis dalam Ruby - tidak, java
  • menggunakan `sebagai pembatas string - tidak, tetapi menggunakan string yang dikutip ganda dengan pelolosan minimal ( \hanya lolos \dan ")
  • floating point - didukung, tetapi hanya standar "ganda", bukan presisi yang sewenang-wenang
  • konversi tipe ke tipe lain - ya
  • ekspresi reguler - belum, tetapi direncanakan; akan menggunakan string biasa dengan operator khusus
  • Objek File dan Tanggal - tidak, tetapi bisa mendapatkan tanggal / waktu saat ini
  • hash - dengan asumsi itu seperti dict python atau peta java, maka itu tidak didukung (dapat dipertimbangkan di masa mendatang)
  • fungsi pembantu untuk melakukan lebih banyak lagi - ya, banyak
  • `http://example.com`net - "example.com"g
  • jalankan string sebagai kode Ruby - tidak
  • tidak ada komentar - tepatnya, #digunakan untuk sesuatu yang lain,"comments like this";
  • lebih mudah untuk menambahkan fungsi - saya pikir begitu, tapi saya juga bias :)
  • pada Github - bahkan lebih baik (menurut saya, tolong jangan tembak) - di SourceForge, menggunakan hg
  • dilisensikan di bawah MIT - ya
  • tidak ada baris akhir final - benar
  • mengocok - mr
  • tr - er
  • sampel - belum selesai, _,mr=
  • meratakan - tidak dilakukan, tetapi mungkin lebih mudah untuk dicapai
  • bubur - tidak, tetapi pengidentifikasi tidak perlu dipisahkan
  • debugging - hanya jejak stack, dan edoperator untuk menunjukkan stack

  • I / O fleksibel - ya, tetapi hanya input eksplisit

  • built-in yang lebih pendek - ya, b= basis, z= zip
  • pisahkan 0 - tidak, tetapi bisa menggunakan variabel yang sudah ditentukan sebelumnya
  • ambigu -- ya, tapi tidak dengan _; 1 2-3-> 1 2 -3; 1 2m3->-1 3
  • gulung / putar tumpukan - tidak
  • set array - t
  • divmod - md
  • ubah lexer (untuk pengidentifikasi) - ya, lebih banyak di bawah
  • produk cartesian - tidak persis sama, tapi ya, m*
  • operator unicode - no
  • pengidentifikasi satu karakter - operator yang telah ditentukan memiliki 1 atau 2 karakter dan variabelnya adalah huruf besar karakter tunggal; semuanya dapat disatukan tanpa membingungkan lexer / parser
  • operator pada blok - no
  • semacam stabil - ya
  • ubah simbol kembali menjadi blok kode - tidak, tetapi dapat ditambahkan nanti
  • tanggal / waktu saat ini - et
  • baris perintah args - ea
  • dengan jelas memisahkan built-in - ya, tetapi kapital adalah variabel; built-in atau mulai dengan huruf kecil dan karakter khusus
  • min dan max - ya, saat ini hanya untuk 2 nilai: e<,e>
  • nilai absolut - z(GolfScript memiliki abs, tidak kurang)
  • jumlah dan produk array - :+,:*
  • Jarak Manhattan - tidak
  • chr - c(mengkonversi ke karakter, bukan string)
  • menumpahkan string ke tumpukan - string CJam terbuat dari karakter, bukan angka; untuk menumpahkan karakter itu masih{}/
  • versi :yang mengkonsumsi apa yang disimpan - tidak
  • operator untuk >=, <=- tidak, gunakan <!,>!
  • base64 dan zlib - nggak
  • pintas untuk $ 1, $ 2, $ 3, $ 4, $ 5 - tidak
  • salin dua item tumpukan teratas - direncanakan; untuk sekarang gunakan1$1$
  • variabel lokal - tidak
  • Fitur HQ9 + - tidak, terima kasih

CJam memiliki lebih banyak fitur, periksa https://sourceforge.net/p/cjam/wiki/Operators/


7
Saya tidak setuju dengan SourceForge dan Mercurial lebih baik daripada GitHub.
nyuszika7h

1
@ nyuszika7h tidak apa-apa, kita semua memiliki preferensi kita
aditsu berhenti karena SE adalah 2 JAHAT 14

Saya baru saja memposting jawaban CJam pertama saya , karena jawaban GolfScript saya sangat membutuhkan fungsi sqrt yang tepat. CJam jauh lebih cepat daripada GolfScript!
Dennis


@aditsu Apakah Anda menganggap CJam sebagai dialek GolfScript atau bahasa baru yang terinspirasi oleh GolfScript? (Inilah alasan saya bertanya: codegolf.stackexchange.com/questions/37464/… )
Martin Ender

6

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.


Nah, saat ini saya hanya menggunakan [a-z]+|[A-Z]+, untuk mushing, jadi garis bawah gratis. Ini adalah ide yang menarik dan sangat unik! +1
Gagang Pintu

5

Alias ​​Unicode

Perintah beberapa karakter dapat memiliki alias unicode. Ini akan menghemat skor ketika skor dihitung dalam karakter dan bukan dalam byte.


7
uh ... kami tidak ingin APL lain ...
John Dvorak

1
Golfscript bukan sesuatu seperti APL, Unicode atau tidak. Kami sudah memiliki beberapa APL lain, seperti J dan K. (atau bahkan R yang terlihat cukup terinspirasi APL untuk saya, sampai-sampai Anda bisa sering melakukan terjemahan literal)
marinus

Poin yang membedakan tentang APL adalah bahwa ia menggunakan charset yang sangat berbeda dari yang lain, bukan karena ia menggunakan vektor aritmatika secara asli. Saya suka J, saya menggunakannya, dan saya biasanya memilih jawaban J. Saya belum mengunggah satu jawaban APL. Jika saya ingin melukis program saya alih-alih menulisnya, saya akan menggunakan Piet.
John Dvorak

Saya pikir APL lebih terbaca dari J, tentu lebih terbaca dari Golfscript.
marinus

5

Semacam stabil

The $builtin pada blok harus melakukan semacam stabil.


5

Array mengatur operator

["A" "B" "C" "D" "E" "F"] -1 4 S    # -> ["A" "B" "C" "D" -1 "F"]

Adakah built-in yang dapat kami sediakan untuk itu?


+1 Saya mulai menulis posting blog tentang mengimplementasikan set array, tetapi tidak pernah menyelesaikannya. Saat ini sangat sulit secara umum. Ini akan membuat perbedaan besar untuk beberapa tantangan.
Peter Taylor

Saya tidak percaya ini belum dibangun untuk skrip golf. +1
Gagang Pintu

5

Pengidentifikasi karakter tunggal

Ini tidak seperti solusi golf kode yang akan memiliki terlalu banyak variabel. Dan itu akan menghemat ruang.


Hmm .. Ini juga bisa dilakukan dengan mengganti parser. Mungkin sebuah bendera untuk menentukan perilaku ini? Ide yang hebat! +1
Gagang Pintu

4

% sebagai builtin untuk produk

[1 2][1 2 3]%  # -> [[[1 1][1 2][1 3]][[2 1][2 2][2 3]]]

+1; Anda dapat mengedit jawaban CW saya dan menambahkan yang ini
Gagang Pintu

Bagaimana dengan modulo?
MilkyWay90

3

Dukungan Regex

Kurangnya dukungan regex selalu terasa aneh dalam bahasa yang dirancang untuk bermain golf. Akan sangat bagus untuk memiliki

  • <string> <string> <string> y(alias tr, menggunakan one-char alias Perl untuk itu)
  • <string> <string> <string> s (pengganti)
  • <string> <string> <block> s (gantikan dengan panggilan balik)
  • <string> <string> m (pertandingan)

Saya sudah menyebutkan regex dalam pertanyaan saya.
Gagang Pintu


3

Buat |, & dan ^ built-in melakukan sesuatu yang berguna pada blok

Misalnya <array/string> <block> |dapat digunakan sebagai fungsi indeks

[0 -10 -20 30 40 -50 60] {0<} |   # -> [1 2 5]

Ada ide untuk <array/string> <block> &atau <array/string> <block> ^?


Apa yang array block =harus dilakukan sekarang?
John Dvorak

@JanDvorak Bandingkan. Berguna jika Anda ingin membandingkan string dengan blok, misalnya "0<" {0<} =.
Howard

Seberapa sering Anda membutuhkannya? Saya lebih suka menjatuhkan itu, dan gunakan array block =untuk "select by predicate"
John Dvorak

@JanDvorak pilih dengan predikat sudah diterapkan menggunakan ,.
Howard

Oh ya sudah. Lanjutkan :-)
John Dvorak

2

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:

  1. tambahkan sintaks baru, misalnya #foountuk mendorong nilai fooke stack, bahkan jika itu adalah blok kode, atau

  2. tambahkan 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 menggunakan array #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 mana builtin_dollarakan berisi implementasi aktual dari $built-in (dan #builtin_dollaratau {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 {$}_ {@}_ :$; :@;).


Satu detail yang saya tidak yakin adalah apa yang _harus dilakukan operator jika blok kode berisi tugas variabel. Hal yang jelas adalah membiarkan :symboltoken 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.
Ilmari Karonen

1
Versi kedua Anda akan cocok bersama-sama dengan operator meratakan pada array: [[1] [2] [3]] _ -> [1 2 3].
Howard

Jadi apa hasilnya 2:A;{1:A;A}_?
Howard

Secara naif, {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}.
Ilmari Karonen

Atau menjadi lebih teknis {builtin_1 :A builtin_semicolon 2}.
Howard

1

Preset variabel dengan args baris perintah

Sayangnya, tidak ada arang yang tersisa, tetapi mungkin kita bisa menggunakannya Auntuk itu?


_tersedia. Mungkin itu? Pokoknya, ya, golfscript membutuhkan cara mengambil args baris cmd 1
Doorknob

0

Fungsi 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)

0

Ambil fitur dari APL dan HQ9 + juga!

  • Pintasan, seperti di APL. EDIT: hanya melihat jawaban "alias unicode". Itu yang saya maksudkan :)
  • Pintasan berorientasi golf lainnya, seperti di H9 +, HQ9 +, CHIQRSX9 +

Oke, jadi bagaimana Anda akan mengusulkan itu? Ada ide spesifik?
Gagang Pintu

karakter unicode memungkinkan untuk melakukan hal-hal kompleks hanya dalam satu karakter.
xem

@Doorknob of Snow, saya memperbarui jawaban saya dengan pintasan yang ingin saya lihat: yang dari APL, dan yang dari CHIRQSX9 + :)
xem

Hmm, the hq9 + hal itu tampaknya terlalu curang :-P
Doorknob

Ini berorientasi pada golf: P im pendapat saya bahasa Anda harus melakukan setidaknya juga :)
xem

0

Memisahkan built-in dengan jelas

misalnya modal: bawaan; membuat B untuk basis yang layak


1
Seperti disebutkan di atas tidak perlu terpisah. Jika seseorang suka menimpa builtin, ia harus bisa melakukannya. Saya bahkan menemukan aplikasi yang bermanfaat dari operator overwriting seperti {-}:+.
Howard

Tidak perlu, bahasa ini juga tidak peka huruf besar-kecil.
Gagang Pintu

2
Karena tujuannya adalah untuk memberikan pukulan lebih sedikit per lubang, memiliki sensitivitas case dan lebih built-in secara efektif mengarah pada pernyataan misi.

0

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%}:rsortdan dapat digunakan rsortuntuk mengurutkan dan membalikkan array, tetapi itu hanya berfungsi selama definisi $(atau -1atau %) tidak berubah, karena rsortfungsi saya masih memanggil simbol global $. Alangkah baiknya bisa mengatakan "biarkan rsortmelakukan 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 nperubahan perilaku puts, atau mendefinisikan-ulang !sepenuhnya kacau xor. (Kemudian lagi, beberapa kehati-hatian harus dilakukan di sini, karena, khususnya, kemampuan untuk mengubah perilaku putsternyata 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 ...


Ayo - semua bahasa baru yang mewah merayakan evaluasi malas ;-) Mari kita simpan fitur itu di GolfScript.
Howard

Setelah dipikir-pikir - Anda benar, ini lebih merupakan fitur pengikatan daripada evaluasi. Tapi kemudian - pengikatan statis lebih kompleks daripada kedengarannya - misalnya memberikan panggilan rekursif di dalam definisi.
Howard

"Biarkan rsortlakukan apa yang $-1%saat ini dilakukan, bahkan jika simbol-simbol itu kemudian didefinisikan ulang" Jadi Emmental?
CalculatorFeline

0

Lebih banyak fungsi bawaan

Buat semua variabel huruf tunggal az dan AZ melakukan fungsi generik dan berguna. Beberapa built-in yang kurang:

  • min dan maks: semua atau beberapa nilai tumpukan 2 teratas, nilai tumpukan atas, di atas array
  • nilai mutlak
  • jumlah dan produk array. kenapa bisa {+}*saat kamu bisaS ? Anda memiliki 52 fungsi untuk bekerja di sini!
  • Jarak Manhattan (mis x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1). Sekarang harus menjadi @-A@@-A+jika Aini 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.
  • Konversi integer menjadi string satu karakter (setara dengan python chr).
  • Tumpahkan string ke tumpukan (saat ini {}/)
  • Versi :yang mengkonsumsi apa yang disimpan. Ini harus tidak 'terjebak' untuk pengidentifikasi agar bermanfaat.
  • Operator untuk >=,<=
  • Seperti yang disarankan seseorang, cara untuk meletakkan variabel yang berisi blok ke stack tanpa menjalankannya. Jadi Anda bisa mengurangi seandainya dari bentuk 1{\}{|}ifmenjadi seperti1?\?|if
  • Konversi base64 bawaan dan dukungan zlib untuk membuat data penyematan mengambil lebih sedikit karakter
  • Di luar base64, buat pengkodean base93 kustom (menggunakan semua karakter yang dapat dicetak yang bukan pembatas string).
  • Cara pintas untuk 1$, 2$, 3$, 4$,5$
  • Operator untuk menyalin dua item tumpukan teratas sebagaimana adanya, yaitu \.@.@\

-3

Alangkah baiknya jika nilai yang ditulis atau dihitung pada baris terakhir suatu fungsi secara otomatis dikembalikan


3
Berbasis tumpukan, jadi ...
marinus

1
Tidak ada yang namanya fungsi.
Peter Taylor

Fungsinya tidak mengembalikan apa pun ... dan itu disebut blok
Gagang Pintu

Itu mungkin bagus ... dalam beberapa bahasa lain. (Tidak ada pernyataan pengembalian yang lebih menjengkelkan di akhir fungsi! Yay! (Tapi saya belum pernah membutuhkan pernyataan pengembalian, jadi ...))
CalculatorFeline
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.