eval을 써서 멋지게 해결했다고 생각했는데 실행파일을 만들어서 실행하거나, DrRacket에서 run 버튼으로 실행할 때 다음과 같은 오류가 났다.
fn-name: unbound identifier;
also, no #%top syntax transformer is bound in: fn-name
eval을 쓸때 REPL에서하는 것과 그냥 실행하는 것에 차이가 있다 (phase에 따른 namespace의 문제. 자세한건 링크 참조).
빨리 해결하려는 맘에 (define ns (make-base-namespace)) (eval ... ... ns)의 형태로 변경하라는 예제를 보고 그렇게 했더니 아래와 같은 다른 에러가 났다. 아예 정의가 안됐다는 에러.
(나중에 찬찬히 읽어보니 make-base-namespace는 racket/base module이 export하는 symbol들만 resolve가능하게 해주는 것이었다)
fn-name: undefined;
cannot reference undefined identifier
해결책은 namespace anchor를 사용하는 것이었다. 참고 링크의 맨 마지막에 있다(역시 끝까지 읽어보는 것이 중요하다).
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
......
(eval ... ... ns)
ref: http://docs.racket-lang.org/guide/eval.html
happy hackin'