เสียงกระเพื่อมสามัญ 58 ตัวอักษร
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
... หรือ 24 ตัวอักษรหากคุณไม่คิดว่า*print-circle*
จะถูกตั้งค่าเป็นT
:
#1=(print '(write '#1#))
การพิมพ์รหัสแทนจะถูกอ่านเป็นโครงสร้างแบบวงกลมซึ่ง#1#
ชี้ไปที่เซลล์ข้อเสียที่ตาม#1=
มา เราเสนอราคาโปรแกรมเพื่อไม่ให้ดำเนินการ เนื่องจาก*print-circle*
เป็น T ดังนั้น REPL จะปล่อยตัวแปรตัวอ่านดังกล่าวในระหว่างการพิมพ์ นี่คือสิ่งที่โค้ดข้างต้นพิมพ์ออกมาและคืนค่า:
#1=(write '(print '#1#))
เมื่อเราประเมินโค้ดข้างต้นมันจะพิมพ์:
#1=(print '(write '#1#))
หากคุณต้องการที่จะยึดติดกับค่าเริ่มต้นสำหรับ*print-circle*
ซึ่งเป็น NIL ในการใช้งานที่สอดคล้องคุณจะต้องเชื่อมโยงตัวแปรชั่วคราว:
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
ภายในเนื้อความของ LET เราพิมพ์สิ่งต่าง ๆ ด้วย*print-circle*
การเป็น T ดังนั้นเราจึงได้รับ:
#1=(write
'(let ((*print-circle* t))
(print '#1#))
:circle t)
ที่คุณสามารถดูโปรแกรมใหม่ไม่ rebind *print-circle*
แต่เนื่องจากเราจะใช้write
ซึ่งเป็นฟังก์ชั่นในระดับต่ำที่เรียกว่าโดยเราสามารถส่งผ่านอาร์กิวเมนต์เพิ่มเติมเช่นprint
:circle
รหัสนั้นทำงานตามที่คาดไว้:
#1=(let ((*print-circle* t))
(print '(write '#1# :circle t)))
อย่างไรก็ตามคุณต้องดำเนินการโปรแกรมด้านบนเป็นสคริปต์ไม่ใช่ใน REPL เพราะแม้ว่าคุณจะพิมพ์สิ่งต่าง ๆ ในขณะที่ดูแลโครงสร้างแบบวงกลมทั้งคู่write
และprint
ส่งคืนค่าที่พิมพ์ และใน REPL เริ่มต้นค่าจะถูกพิมพ์ด้วยเช่นกัน แต่อยู่นอกบริบทแบบไดนามิกที่*print-circle*
เป็น T