Apa tip umum yang Anda miliki untuk bermain golf di Racket / Skema ? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk Racket / Skema (mis. "Hapus komentar" bukan jawaban).
Saya tahu Skema dan Racket (sebelumnya Skema PLT) adalah bahasa yang berbeda secara teknis tetapi sangat mirip dalam banyak hal dan banyak kode (saya curiga) sebagian besar akan berjalan sebagaimana dimaksud dalam keduanya. Jika tip Anda hanya berlaku untuk salah satu bahasa yang disebutkan di atas, perhatikan demikian.
let
lambda
Di Racket ,
require
formulir dapat memiliki beberapa argumen.Jauh lebih pendek dari
Saya tidak tahu banyak tentang Skema , tetapi tampaknya tidak memiliki
require
builtin.sumber
Gunakan sinonim yang lebih pendek
Ada sejumlah prosedur di Racket yang memiliki versi pendek yang sebagian besar setara. (Mereka biasanya tidak setara: misalnya,
(car (cons 1 2))
berfungsi di mana(first (cons 1 2))
gagal. Tapi Anda dapat membuat substitusi jika Anda tahu mereka adalah sinonim dalam kasus Anda.)Daftar ini mungkin tidak lengkap: Saya mungkin belum tahu tentang sebagian besar hal yang bisa masuk dalam daftar ini.
(= a b)
bukannya(equal? a b)
saat membandingkan angka.'(1 2)
bukannya(list 1 2)
.car
,cadr
,cdr
Untukfirst
,second
, danrest
.null?
dari padaempty?
modulo
alih-alihremainder
ketika modulus positif.floor
bukannyatruncate
ketika argumennya positif.sumber
Menghilangkan ruang yang tidak perlu
Ini bisa dianggap tip "sepele", tetapi harus ditunjukkan di suatu tempat.
Setiap kali Anda membaca kode Racket yang ditulis oleh orang normal (misalnya dalam dokumentasi Racket ) akan ada semua ruang yang dimasukkan: misalnya,
Bahkan, karena
(
dan)
tidak dapat menjadi bagian dari nama variabel, kami dapat menghapus semua ruang di sekitarnya dan tidak kehilangan ambiguitas (dan, yang lebih penting, masih mendapatkan kode yang valid). Jadi, ungkapan di atas dapat berupa:sumber
Kiat-kiat berikut adalah untuk Racket :
Argumen default
Terutama berguna untuk membuat alias untuk nama fungsi panjang yang sering digunakan.
Asumsikan golf memungkinkan Anda untuk menulis fungsi yang menghabiskan argumen, dan menganggap Anda perlu
reverse
banyak menggunakan . Anda akan mulai dengan sesuatu seperti:Sebagai gantinya Anda dapat menerima argumen tambahan, dengan nama yang lebih pendek daripada
reverse
, dan menetapkan nilai defaultnya kereverse
:Lebih lanjut, ini berguna jika Anda memiliki fungsi pembantu yang Anda gunakan di banyak tempat dengan beberapa argumen yang sama. Ingatlah untuk menyusun ulang argumen ke fungsi sesuai kebutuhan, sehingga Anda dapat menggunakan argumen default sebanyak mungkin, dan menghapus argumen dari beberapa panggilan.
match
Yang ini sedikit lebih sulit untuk diringkas dalam posting kecil, jadi baca di Racket Docs untuk yang ini. Singkatnya,
match
memungkinkan Anda mengekstrak elemen dan urutan elemen dalam urutan tertentu dari daftar, dan sintaks kuasiquote memungkinkan Anda menjahit daftar yang dimutilasi kembali bersama-sama:Ini juga memberi Anda cara mudah untuk bekerja dengan ekspresi reguler dan melakukan perhitungan tambahan pada grup yang dihasilkan setelahnya,
Bernama
let
Lihat sintaks yang dinamai di sini .
let proc-id ...
Ini memungkinkan Anda untuk menulis fungsi rekursif yang dipanggil segera tanpa
define
atau benar-benar memanggil fungsi setelah Anda mendefinisikannya.Sesuatu seperti:
dapat disingkat menjadi:
Yang terakhir ini konyol, tapi saya belum bisa menggunakan trik kecil ini di mana pun sejauh ini:
(apply map list matrix)
mengambil transposmatrix
, di manamatrix
ada beberapa daftar daftar persegi panjang, seperti'((1 2 3) (a b c))
.Beri tahu saya jika ini terbukti bermanfaat.
sumber
Seperti yang ditunjukkan Winny ,
#!
biasanya dapat digunakan alih-alih#lang
, menghemat empat byte.sumber