공통 리스프, 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 는 동적 컨텍스트 외부에 있습니다 .