Apa tips umum yang Anda miliki untuk bermain golf di Forth (dan klonnya)? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk Forth (mis. "Hapus komentar" bukan jawaban).
Keempat memiliki dua konstruksi pengulangan, x y do
... loop
, dan kurang dikenal [begin]
... di [until] x y
mana x
dan y
adalah nilai untuk batas dan indeks, atau kondisi yang harus dicatat, masing-masing.
Ini sangat lambat, sangat bertele-tele (haha) dan secara keseluruhan agak menggembirakan, jadi gunakan saja jika perlu.
Alih-alih, seperti bahasa fungsional yang tepat (seperti Forth, benar-benar), orang harus lebih suka recursivity daripada loop eksplisit karena cenderung lebih pendek dan membuat penggunaan bahasa yang lebih baik.
Program tidak harus aman dari tumpukan.
Sebagai gantinya, mereka dapat meninggalkan sampah tambahan di stack jika menghemat byte. Di Forth, "nilai kembali" meninggalkan sesuatu di atas tumpukan. Mungkin tidak masalah sampah apa yang Anda miliki di bawah itu di stack kecuali jika Anda menggunakan masalah kedalaman rekursi dan stack.
Keempat memiliki banyak kata-kata bawaan yang keren, banyak di antaranya sangat membantu untuk menyusun jenis-jenis algoritma yang ditemukan di PPCG.
Contoh buruk tapi ilustratif dari ini adalah kata-kata untuk increment ( 1+
) dan decrement ( 1-
). Mereka menyimpan byte lebih dari menulis 1 +
untuk menambah bagian atas tumpukan.
Selain itu, berikut adalah daftar praktis dari banyak (mungkin tidak semua) kata yang ditemukan dalam distribusi modern gforth
.
Saat menulis kode Anda, perhatikan apa yang terjadi pada tumpukan di setiap perintah. Saya biasanya mengeluarkannya saat saya pergi, seperti:
6 6
7 7 6
* DUP 42 42
Ketika Anda pergi seperti ini, Anda mungkin akan lebih mudah untuk mengenali ketika Anda dapat menggunakan operasi stack seperti ROT
, -ROT
, 2DUP
, 2OVER
, dll ...
Ini termasuk aritmatika sel ganda , bitwise , perbandingan angka , dan kata-kata manipulasi stack . Literal integer sel ganda juga dihitung.
1.
) memberikan literal sel ganda. Untuk angka kecil, itu berarti mendorong nol tambahan dengan biaya hanya satu byte.m+
= 0 d+
~ = under+
(tidak sepenuhnya, karena overflow dapat terjadi.)d2*
dan d2/
dapat digunakan untuk mengekstrak / mendorong sedikit dari sebuah kata.a b c d d=
= a c = b d = and
a b c d d<>
= a c <> b d <> or
2dup
, 2over
, 2tuck
memiliki peluang bagus untuk memenangkan variabel lokal.gforth memiliki tumpukan terpisah untuk angka floating-point. Bahkan jika Anda hanya berurusan dengan bilangan bulat, melepas beberapa pekerjaan dan penyimpanan ke tumpukan FP dapat menghasilkan keseluruhan kode yang lebih pendek, baik dengan menghindari manipulasi tumpukan eksplisit atau menggunakan operasi spesifik-FP yang tidak tersedia di tumpukan utama. Kembali ke tumpukan FP juga merupakan opsi yang benar-benar valid (kecuali ketika tugasnya adalah mengembalikan boolean).
f
awalan, seperti pada f+
, fdup
dll.). Literal nomor FP juga membutuhkan satu byte lagi (postfix e
, seperti pada 1e
), tetapi beberapa angka dapat mengikat atau bahkan menyimpan byte (mis. 1e3
Alih-alih 1000
).1+
dan 1-
.f**
(daya), falog
(daya 10) fsqrt
, dan berbagai exp, log, yang terkait dengan trigonometri.s>f
(tunggal ke mengambang), f>s
(mengambang ke tunggal), d>f
(ganda ke mengambang),f>d
(mengambang ke ganda). Kadang-kadang, variasi "ganda" dapat digunakan untuk menghasilkan atau mengkonsumsi nol tambahan.