Gangguan Umum, 58 karakter
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
... atau 24 karakter jika Anda tidak keberatan dengan asumsi *print-circle*
secara global disetel ke T
:
#1=(print '(write '#1#))
Representasi dicetak dari kode dibaca sebagai struktur siklik, di mana #1#
menunjuk kembali ke sel kontra berikut #1=
. Kami mengutip program sehingga tidak dieksekusi. Karena *print-circle*
T, REPL dengan hati-hati memancarkan variabel pembaca seperti itu selama pencetakan; inilah yang dicetak oleh kode di atas, dan mengembalikan:
#1=(write '(print '#1#))
Ketika kami mengevaluasi kode di atas, ia mencetak:
#1=(print '(write '#1#))
Jika Anda ingin tetap menggunakan nilai default untuk *print-circle*
, yaitu NIL dalam implementasi yang sesuai, maka Anda harus mengubah variabel untuk sementara:
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
Di dalam tubuh LET, kita mencetak sesuatu dengan *print-circle*
menjadi T. Jadi kita memperoleh:
#1=(write
'(let ((*print-circle* t))
(print '#1#))
:circle t)
Seperti yang Anda lihat, program baru tidak rebind *print-circle*
, tetapi karena kami menggunakan write
, yang merupakan fungsi tingkat rendah yang dipanggil oleh print
, kami dapat memberikan argumen tambahan seperti :circle
. Kode kemudian berfungsi seperti yang diharapkan:
#1=(let ((*print-circle* t))
(print '(write '#1# :circle t)))
Namun, Anda perlu menjalankan program di atas sebagai skrip, bukan di dalam REPL, karena meskipun Anda mencetak sesuatu sambil menjaga struktur melingkar, keduanya write
dan print
juga mengembalikan nilai yang sedang dicetak; dan dalam REPL default, nilainya juga sedang dicetak, tetapi di luar konteks dinamis di mana *print-circle*
T.