공통 리스프, 58 자
#1=(let((*print-circle* t))(print'(write '#1# :circle t)))
... 또는 24 글자 *print-circle*가 전역으로 설정되어 있다고 생각하지 않으면 24 자 T:
#1=(print '(write '#1#))
코드의 인쇄 된 표현은 순환 구조로 읽 히며, 여기서 #1#cons 셀은 다음과 같습니다 #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)
보시다시피, 새로운 프로그램은 리 바인드되지 않지만에 의해 호출되는 하위 수준 함수 인를 *print-circle*사용 write하고 있기 때문에 print와 같은 추가 인수를 전달할 수 있습니다 :circle. 그런 다음 코드는 예상대로 작동합니다.
#1=(let ((*print-circle* t))
(print '(write '#1# :circle t)))
그러나, 당신은 당신이 원형 구조의주의하면서 일을 인쇄, 모두에도 불구하고 있기 때문이 아니라 REPL 내부 스크립트로 위의 프로그램을 실행해야 write하고 print또한 인쇄되는 값을 반환 기본 REPL에서는 값도 인쇄되지만 *print-circle*T 는 동적 컨텍스트 외부에 있습니다 .