-
리스프 개발 팁: 명령창 결과 저장하기Programmer/Programming 2014. 6. 27. 10:38
리스프에서 개발하기 가장 좋은 도구는 REPL 명령창이다.
따라서 저장할 내용을 표준 출력으로 보내면 개발이 수월할 것이다.예를 들어, 당신은 `MY-SAVE' 함수를 개발하고 있다.
이 함수는 인자 `FNAME'으로 받은 파일명에 당신의 데이타를 저장한다.
개발 과정에서 수시로 파일을 열어서 내용을 확인해야 한다.
불편하다.
REPL 명령창에 저장할 내용을 바로 확인하면 개발이 훨씬 편하겠다.데이타를 저장할 형태로 가공하여 REPL 표준 출력하는 함수 `MY-WRITE'를 작성하자.
이 함수의 구현과 검증은 REPL을 벗어날 필요가 없다.
이제 함수 `MY-SAVE'는 단지 표준 출력을 저장할 파일에 연결한 후에
`MY-WRITE'를 호출하면 된다.(defun my-save (fname) (with-open-file (*standard-output* fname :direction :output :if-exists :supersede) (my-write)))
원리는 다음과 같다.
LET이나 이것을 사용한 매크로는 동적 변수(dynamic variable)와 같은 이름이 존재하면 1
새 값으로 바인딩(binding)하고 이전의 값은 감춘다(shadow).
MY-SAVE 함수에서 표준 출력 *STANDARD-OUTPUT*는 FNAME의 파일 스트림으로 대체가 된다.
따라서, MY-WRITE가 *STANDARD-OUTPUT*에 쓰는 모든 내용은 FNAME의 파일 스트림으로 저장된다.SETF 함수를 사용하여 똑같은 효과를 낼 수도 있다.
그러나, SETF 함수는 사용 후에 이전 값으로 되돌리는 과정이 필요하다.
반면, LET은 스코프(scope)를 벗어나면 감추어진 이전의 값으로 자동으로 복원이 된다.2016/02/18 - [Practice/Lisp] - Lisp에서 lexical과 dynamic 변수 타입
2016/02/18 - [Practice/Lisp] - Lisp에서 클로저(closures)
- WITH-OPEN-FILE은 LET을 사용하는 대표적인 매크로이다. [본문으로]
'Programmer > Programming' 카테고리의 다른 글
리습(Lisp)을 위한 SyntaxHighlighter 3.0 플러그인 작성 (0) 2015.03.17 초반에는 문제의 원인을 충분히 넓게 잡아라. (1) 2014.07.15 리습의 개발 방법을 배우자: 함수의 구현 (0) 2014.06.26 리습의 개발 방법을 배우자: 함수와 하위 함수의 개발 (3) 2014.06.24 리습의 개발 방법을 배우자: 대도 웜퍼스 게임의 설계 (0) 2014.06.20 댓글