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 write
die 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 write
und print
auch 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.