Ortak Lisp, 58 karakter
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
... ya da 24 karakter *print-circle*
global olarak ayarlanmış varsayılırsa sakıncası yoksa T
:
#1=(print '(write '#1#))
Kodun basılmış temsili, #1#
takip eden cons hücresine işaret eden döngüsel bir yapı olarak okunur #1=
. Programları, yürütülmemeleri için teklif ediyoruz. Yana *print-circle*
T, REPL baskı sırasında bu okuyucu değişkenleri yaymak üzere özen; Yukarıdaki kodun yazdırdığı ve döndürdüğü şey şudur:
#1=(write '(print '#1#))
Yukarıdaki kodu değerlendirdiğimizde, şunu yazdırır:
#1=(print '(write '#1#))
*print-circle*
Uygun bir uygulamada NIL olan varsayılan değerine bağlı kalmak istiyorsanız, değişkeni geçici olarak yeniden bağlamanız gerekir:
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
LET'in bedeninde, şeyleri *print-circle*
T olmakla basarız. Böylece elde ederiz:
#1=(write
'(let ((*print-circle* t))
(print '#1#))
:circle t)
Gördüğünüz gibi, yeni program yeniden bağlamadı *print-circle*
, ancak kullandığımızdan write
, alt seviye işlevi olan kullandığımızdan , print
gibi ek argümanları iletebiliriz :circle
. Kod daha sonra beklendiği gibi çalışır:
#1=(let ((*print-circle* t))
(print '(write '#1# :circle t)))
Ancak, dairesel yapıların dikkat çekerken şeyler yazdırmak hem çünkü rağmen değil, bir repl içinde bir komut dosyası olarak yukarıdaki programları çalıştırmak için gereken write
ve print
aynı zamanda basılıyor değeri döndürür; ve varsayılan bir REPL'de, değer de basılır, ancak *print-circle*
T'nin olduğu dinamik bağlamın dışında