कॉमन लिस्प, 58 अक्षर
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
... या 24 वर्ण यदि आपको बुरा न लगे तो *print-circle*
विश्व स्तर पर इसके लिए तैयार है T
:
#1=(print '(write '#1#))
कोड का मुद्रित प्रतिनिधित्व एक चक्रीय संरचना के रूप में पढ़ा जाता है, जहां #1#
बाद में सामान्य सेल को इंगित किया जाता है #1=
। हम कार्यक्रमों को उद्धृत करते हैं ताकि वे निष्पादित न हों। चूंकि *print-circle*
टी है, आरईपीएल मुद्रण के दौरान ऐसे पाठक चर का उत्सर्जन करने का ध्यान रखता है; उपरोक्त कोड प्रिंट और रिटर्न:
#1=(write '(print '#1#))
जब हम उपरोक्त कोड का मूल्यांकन करते हैं, तो यह प्रिंट करता है:
#1=(print '(write '#1#))
यदि आप उस डिफ़ॉल्ट मान के साथ रहना चाहते हैं *print-circle*
, जो एक अनुरूप कार्यान्वयन में NIL है, तो आपको अस्थायी रूप से चर को फिर से बनाना होगा:
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
एलईटी के शरीर के अंदर, हम चीजों को *print-circle*
टी के साथ प्रिंट करते हैं । इसलिए हम प्राप्त करते हैं:
#1=(write
'(let ((*print-circle* t))
(print '#1#))
:circle t)
जैसा कि आप देख सकते हैं, नया प्रोग्राम रिबंड नहीं करता है *print-circle*
, लेकिन जब से हम उपयोग कर रहे हैं write
, जो निम्न-स्तरीय फ़ंक्शन कहलाता है print
, हम अतिरिक्त तर्क जैसे कि पास कर सकते हैं :circle
। कोड फिर अपेक्षा के अनुसार काम करता है:
#1=(let ((*print-circle* t))
(print '(write '#1# :circle t)))
हालाँकि, आपको उपरोक्त कार्यक्रमों को स्क्रिप्ट के रूप में निष्पादित करने की आवश्यकता है, न कि एक REPL के अंदर, क्योंकि भले ही आप परिपत्र संरचनाओं की देखभाल करते समय चीजों को प्रिंट करते हैं, दोनों write
और print
मुद्रित होने वाले मूल्य को भी लौटाते हैं; और एक डिफ़ॉल्ट REPL में, मान भी मुद्रित किया जा रहा है, लेकिन गतिशील संदर्भ के बाहर जहां *print-circle*
T है।