13. Ex) Free
• (let ((x y) (z 10))
(list w x z))
• 표현식 (list w x z)에서는 binding이 없으므로
w, x, z 모두 free 이다.
• 하지만, 확장하여 (let ~~~) 표현식까지 보면, x
를 y에, z를 10에 binding함. w와 y는 free.
• (let ((x x)) ; (x <= binding x <= Free)
x)
16. Capturable:
A. macro expansion의 skeleton에 free
symbol이 있다. – cap1, gripe매크로
A. 또는 skeleton에 bind되었다.
• 이미 다른 심볼이 bind된 skeleton에, argument가
bind되거나 evaluate된다.
• Bind됬는데, skeleton에서 만든 binding범위 안이다. –
cap2, cap3, safe1, for 매크로
• Bind됬는데, skeleton에서 만든 binding이 안에 있다. –
cap4
• Evaluate됬는데, skeleton에서 만든 binding이 안에 있
다. – cap5, safe2, safe3, 125p before매크로
17. • Ex) captuable version
• (A)
• Cap1
• (B)
• Cap2, Cap3, Cap4, Cap5
• Ex) safe version
• safe1 – let을 나눔
• safe2 – argument를 evaluate시킴
• safe3 – 아에 사용할 var를 제공
18. 예측, 회피 방법
• Better Name
• Prior Evaluation
• Gensym
• Package
• namespace
19. 9.4 더 좋은 이름으로 캡쳐 피하기
• free symbol capture 의 경우는 주로 전역변
수에 구별되는 이름을 지어줘서 해결
• gripe 매크로에서 w대신 *warnings*
• *package*는 현재 페키지를 나타내는 전역
변수
20. 9.5 Avoiding Capture by Prior
Evaluation
• argument capture의 위험에 있는 argument
를
• 매크로 확장에 생성된 binding 밖에서 평가
(evaluation)
21. • 대개 반복을 위한 매크로의 경우, 새롭게 생
성된 binding 내에서 평가되는 경우가 많다.
• 그러면 이럴 때, Capture를 피하는 방법은?
22. • closure 안에 몸체를 감싸는 것!
• Ex) for - ((b #'(lambda (,var) ,@body))
• 즉, 뼈대에 의해 어떠한 binding 환경이 생성되
기 전에 람다 내에서 평가됨.
• 만능은 아님 (let이나 do에 의해 2번 바인딩될
수 있는 위험이 존재한다.)
30. scheme
• 이러한 함수-capture 문제는 single name-
space 를 가진 스킴에서 더 심각한 문제다.
• 스킴에 대한 자세한 사항은 최신 레포트를
찾아봐라.
31. Function namespace 해결책
• Argument capture
• Variable에 gensym을 사용한 것처럼 function
에도 gensym을 사용해라.
• Free symbol capture
• 함수는 전역, 지역 구별이 없음. (모두 전역)
• 가장 좋은 해결책은 다른 패키지 안에 넣어두
는 것이다.