Tips untuk bermain golf di Lisp


9

Apa tips umum ini untuk bermain golf di Lisp (dialek apa saja)? Silakan kirim satu tip per jawaban, dan hanya jawaban yang spesifik untuk dialek Lisp (mis. "Hapus komentar" bukan jawaban).

Silakan kirim dialek Lisp yang sesuai dengan tip Anda.



1
Apakah Anda membayangkan ini akan berbeda dari tips untuk bermain golf di Skema dan Racket ?
Alex A.

1
Saya akan menyarankan menggunakan tinylisp, versi Lisp yang lebih kecil dan langsing untuk kesenangan bermain golf Anda.
ckjbgames

Jawaban:


4

Memesan parameter fungsi untuk meminimalkan spasi putih

Dari pada

(defun f(a b)(...))
...
(f x(1+ y))

coba sesuatu seperti

(defun f(b a)(...))
...
(f(1+ y)x)

1

String cetak yang terdiri dari huruf kapital melalui atom cetak

The princfungsi dalam Common Lisp pendek, dan akan mencetak benda-benda tanpa characers melarikan diri. Jika Anda mencetak simbol Common Lisp, yang memiliki synax 'symbol-name, ini akan menyelamatkan Anda dari perlu tanda kutip di sekitar apa yang ingin Anda cetak, dan juga dapat menghemat di spasi putih. Perhatikan bahwa saat mencetak simbol, mereka akan berhuruf besar. Juga, itu tidak menambahkan baris baru atau spasi, jadi Anda tidak perlu penggabungan.

Sebagai contoh,

(princ'hai)

akan dicetak HAI .

Dan

(princ'hai)(princ(read))

akan mencetak HAI, meminta input, dan mencetaknya kembali, misalnya jika Anda mengetik halo, hasilnya adalah

HAIhellohello


1

Gunakan loopdan format, yang seperti printfpada steroid. formattermasuk iterasi dan ketentuan, serta angka romawi, angka bahasa Inggris dan bentuk jamak bahasa Inggris. Ini sangat, sangat jelek, dan sangat kompak.


1

Output Bersyarat

GNU Common Lisp

~v^

The up-dan-out direktif ~^ini paling sering digunakan dalam daftar format operasi untuk mengakhiri setelah daftar item terakhir. Namun, itu juga dapat digunakan dengan vpengubah untuk mengkonsumsi argumen, dalam hal ini berakhir jika argumen itu nol. Ini sangat berguna untuk menangani nol yang dihasilkan oleh dotimes.

(loop as n from 1 to 10 do(format t"~d~%"n))

(dotimes(n 11)(if(> n 0)(format t"~d~%"n)))

(dotimes(n 11)(format t"~v^~d~%"n n))

format(condition)

Argumen pertama untuk formatdapat berupa salah satu t, nilalias (), atau aliran. Jika dilewati t, itu akan menjadi output stdout, jika nilakan mengembalikan output yang diformat sebagai string. Ini dapat digunakan keluaran bersyarat. Contoh di atas dapat ditulis sama pendeknya dengan:

(dotimes(n 11)(format(> n 0)"~d~%"n))

Jika nilai adalah output, nilai pengembaliannya akan nil. Karena itu, ini juga dapat digunakan sebagai kondisi terminating untuk doloop:

(do((n 11))((<(decf n)1))(format t"~d~%"n))

(do((n 11))((format(>(decf n)0)"~d~%"n)))

~[...~]

Pemformat bersyarat menggunakan argumen, dan memilih string pemformatan dari daftar dengan indeks. Kasus penggunaan umum adalah dengan formatter default ~:;untuk memilih antara nol dan bukan nol.

(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))

Formatters bersyarat juga dapat disarangkan, dalam hal ini masing-masing akan mengkonsumsi argumen pada gilirannya.


~&

Dalam setiap contoh di atas, ~%digunakan untuk memancarkan baris baru. Dalam kebanyakan kasus, ini dapat digantikan oleh baris baru literal. Pilihan lain adalah menggunakan ~&, yang akan memancarkan baris baru jika dan hanya jika kursor output tidak pada awal baris, aliasfresh-line .

Keduanya ~%dan ~&juga dapat mengambil argumen, dengan vpengubah atau sebagai konstanta, dan akan menghasilkan banyak baris baru. Mereka juga akan dengan senang hati menerima argumen negatif, dalam hal ini mereka tidak mengeluarkan apa-apa.


Referensi Eksternal

Praktis Masalah Umum
18. Beberapa Resep FORMAT

Umum Gangguan Bahasa, Edisi ke-2
22.3.3. Output Terformat ke Streaming Karakter

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.