Common Lisp, 58 Zeichen
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
... oder 24 Zeichen, wenn es Ihnen nichts ausmacht, wenn *print-circle*global festgelegt ist auf T:
#1=(print '(write '#1#))
Die gedruckte Darstellung des Codes wird als zyklische Struktur gelesen, wobei #1#auf die folgende Konsolenzelle zurückgegriffen wird #1=. Wir zitieren Programme, damit sie nicht ausgeführt werden. Da *print-circle*es T ist, achtet der REPL darauf, solche Leservariablen während des Druckens auszugeben. Dies ist, was der obige Code ausgibt und zurückgibt:
#1=(write '(print '#1#))
Wenn wir den obigen Code auswerten, gibt er Folgendes aus:
#1=(print '(write '#1#))
Wenn Sie den Standardwert für *print-circle*beibehalten möchten , der in einer konformen Implementierung NIL ist, müssen Sie die Variable vorübergehend neu binden:
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
Innerhalb des Körpers des LET drucken wir Dinge mit *print-circle*T. So erhalten wir:
#1=(write
'(let ((*print-circle* t))
(print '#1#))
:circle t)
Wie Sie sehen, wird das neue Programm nicht erneut gebunden *print-circle*, aber da wir writedie Low-Level-Funktion verwenden, die von aufgerufen wird print, können wir zusätzliche Argumente übergeben, wie z :circle. Der Code funktioniert dann wie erwartet:
#1=(let ((*print-circle* t))
(print '(write '#1# :circle t)))
Allerdings müssen Sie die oben genannten Programme als Skript auszuführen, nicht in einem REPL, denn auch wenn man die Dinge drucken , während der Rundbauten die Pflege, die beide writeund printauch gibt den Wert gedruckt wird; und in einem Standard-REPL wird der Wert ebenfalls gedruckt, jedoch außerhalb des dynamischen Kontexts, in dem *print-circle*T steht.