Tips untuk bermain golf di Forth

10

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

kucing
sumber

Jawaban:

3

Hindari loop eksplisit di semua biaya

Keempat memiliki dua konstruksi pengulangan, x y do... loop, dan kurang dikenal [begin]... di [until] x ymana xdan yadalah 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.

kucing
sumber
3

Tinggalkan sampah itu

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.

mbomb007
sumber
2

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.

kucing
sumber
1

Lihat tumpukannya

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 ...

mbomb007
sumber
1

Coba gunakan berbagai kata sel ganda

Ini termasuk aritmatika sel ganda , bitwise , perbandingan angka , dan kata-kata manipulasi stack . Literal integer sel ganda juga dihitung.

  • Menambahkan periode pada bilangan bulat integer (misalnya 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
  • Kata-kata yang menyalin dua nomor sekaligus, misalnya 2dup, 2over, 2tuckmemiliki peluang bagus untuk memenangkan variabel lokal.
Bubbler
sumber
0

(Khusus gforth) Memanfaatkan tumpukan titik-mengambang yang terpisah

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

  • Operasi terkait FP (aritmatika, manipulasi tumpukan) biasanya menghabiskan satu byte lagi ( fawalan, seperti pada f+, fdupdll.). Literal nomor FP juga membutuhkan satu byte lagi (postfix e, seperti pada 1e), tetapi beberapa angka dapat mengikat atau bahkan menyimpan byte (mis. 1e3Alih-alih 1000).
  • Beberapa operasi hilang pada tumpukan FP, mungkin makhluk yang paling menyakitkan 1+dan 1-.
  • Operasi unik tumpukan FP meliputi f**(daya), falog(daya 10) fsqrt, dan berbagai exp, log, yang terkait dengan trigonometri.
  • Anda dapat memindahkan angka antara tumpukan utama dan FP melalui 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.
Bubbler
sumber