-
테스트 주도 방식으로 리스프 매크로 작성하기Programmer/Programming 2014. 6. 5. 11:34
Lisp에서 매크로를 작성하는 방법을 "Peter Seibel"의 "Practical Common Lisp"에 따르면 다름과 같은 순서로 진행한다. (비록 쓸모는 없지만 쉽게 이해할 수 있는 두 숫자를 더하는 매크로를 작성하겠다.) 우선 호출할 예제 폼을 작성한다. (add 3 5) 위 예제 폼으로 확장될 코드를 작성한다. (+ 3 5) 매크로를 구현하다. (defmacro add (x y) `(+ ,x ,y)) 테스트 주도 방식을 적용하면 대략 다음과 같다. 2013/05/07 - [Programming/Project Management] - 테스트 주도 개발 - 둘째날 우선 호출할 예제 폼을 작성한다. 위 예제 폼으로 확장될 코드를 작성한다. 테스트 케이스를 작성한다. (테스트 프레임워크는 생략한다...
-
MAPCAR와 그 친구들(MAPC, MAPCAN)Programmer/Programming 2014. 5. 30. 16:05
MAPCAR는 리스트의 값에 동일한 작업을 처리하는데 유용하다. MAPCAR의 인자는 적용할 함수와 한 개 이상의 리스트를 인자로 가진다. 인자 함수는 리스트의 개수만큼 인자를 받을 수 있어야 한다. MAPCAR는 인자 함수의 결과를 리스트로 묶어서 반환한다. 리스트의 모든 값에 10을 더해보다. (인자 함수가 한개의 인자를 가지는 것을 주목한다.) (mapcar #'(lambda (x) (+ x 10)) (list 1 2 3)) ; => (11 12 13) 두개의 리스트의 값을 더해보다. (인자 함수가 두개의 인자를 가지는 것을 주목한다.) (mapcar #'(lambda (x y) (+ x y)) (list 1 2 3) (list 4 5 6)) ; => (5 7 9) MAPC, MAPCAN는 반환값(..
-
창의적인 일을 찾지 말고 창의적으로 일을 하라.Leader/Developer Leading 2014. 3. 31. 13:56
창의성은 평소에 행하는 삶의 태도이다. 즉, 다른 먼 곳의 이야기가 아니라는 것이다. 평소에 삶과 가까운 것을 개선하는데 노력해보자. 창의성에 대한 사전적 정의는 "새롭고 남다른 것을 생각해내는 성질"이다. 풀어서 설명하자면, 관습적이고 상투적인 생각에서 벗어나서 새로운 사고를 하는 것이다. 개발자들은 반복적인 회사 업무에 싫증을 느끼며 개발자 천국이라고 알려진 회사를 동경한다. 몸은 지금의 회사에 있지만 마음은 이미 동경하는 회사에 있다. 회사 업무는 배울 것이 없고 창의력을 갈아먹는 일이라 여기고 설계나 코드 품질 등을 적당히 수준에서 타협하고 끝마친다. 당신은 여러가지 핑계를 대며 현재의 업무에서 그것을 발휘하지 않고 있다. 다른 멋진 회사나 팀을 동경하고 상상하고 있다. 누군가 만들어 놓은 창의적..
-
프로젝트 초반에 완벽한 설계에 공들이 필요가 없는 이유Programmer/Etc 2014. 3. 19. 10:38
프로젝트 초반에 설계에 많은 시간과 공을 들이는 것에 대해서 부정적으로 생각한다. 혹시나 오해하는 분이 계실까봐서 미리 말하자면, 설계가 필요없다는 것은 아니다. 프로젝트의 과정을 간단히 말하면 "설계-구현-테스트"의 반복이며 각각의 비중은 같다. 즉, 설계와 테스트의 단계 역시 구현과 동일하게 중요하다. 하지만, 아래 설명할 몇가지 이유로 프로젝트 초반에 설계를 결정지으려고 하기보다는, 프로젝트 초반에는 대략적인 스케치로 시작해서 프로젝트 전반에 걸쳐 반복 작업을 통해서 구체화하여야한다. 프로젝트 전반에 걸쳐서 설계는 수시로 변할 수 밖에 없다. 그 이유를 몇가지 나열하자면, 프로젝트를 수행하면서 프로젝트에 대한 이해가 넓고 깊어진다. 프로젝트의 배경 지식과 더불어 개발의 지식과 경험도 늘어간다. 프로..
-
간단한 데이타베이스를 TDD 로 개발하기 소스 코드Programmer/Programming 2014. 3. 19. 10:04
아래는 간단한 데이타베이스를 TDD로 개발하기의 최종 결과물이다. cd-db.lisp (defpackage :cd-db (:use :common-lisp) (:export #:dump-db #:drop-db #:make-record #:add-record #:save-db #:load-db #:where #:select #:update #:make-comparison-expr #:make-comparisons-list #:delete-records)) (in-package :cd-db) (defvar *db* nil) (defun dump-db () *db*) (defun drop-db () (setf *db* nil)) (defun make-record (title artist rating ripped..
-
간단한 데이타베이스를 TDD 로 개발하기 3회: add-recordProgrammer/Programming 2014. 3. 19. 10:02
이번 강의에서는 CD 레코드를 DB에 추가하는 함수 add-record를 개발한다. 이 함수는 인자로 CD 레코드를 받는다. 비어있는 DB에 add-record로 레코드를 추가하면, (add-record (make-cd "Home" "Dixie Chicks" 9 t)) dump-db는 다음과 같은 결과를 출력한다. '((:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t)) 1차 테스트의 구현과 통과는 쉽고 간단함으로 빠르게 진행하자. (define-test add-record-test (add-record (make-cd "Home" "Dixie Chicks" 9 t)) (assert-equal '((:title "Home" :artist "Dixie ..
-
간단한 데이타베이스를 TDD 로 개발하기 2회: make-cdProgrammer/Programming 2014. 3. 19. 09:57
이번에는 CD의 레코드를 만드는 함수를 만들어보자. 함수의 이름은 make-cd이며 인자로 제목, 아티스트, 순위, 리핑 여부를 전달한다. (make-cd "Home" "Dixie Chicks" 9 t) 반환값은 이전 강의에서 언급한 속성 리스트를 출력한다. (:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t) 우리가 예상하는 동작을 토대로 테스트를 작성하자. (define-test make-cd-test (assert-equal '(:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t) (make-cd "Home" "Dixie Chicks" 9 t))) 우선 가장 단순한 방법으로 위 테스트를 통과시키자...
-
간단한 데이타베이스를 TDD 로 개발하기 1회: dump-dbProgrammer/Programming 2014. 3. 19. 09:47
앞으로 몇번에 걸쳐서 연재할 내용은 Peter Seibel가 쓴 “Practical Common Lisp” 중에 3장 “A Simple Database”를 테스트 주도 개발(Test-Driven Development: TDD)로 재구성한 것이다. 책과 비교해서 프로그램의 작성 순서만 달리할 뿐 소스는 책의 것과 같다. 이번 연재에는 테스트 프레임워크로 lisp-unit을 이용한다 CD 데이타베이스인 cd-db 패키지와 테스트가 있는 cd-tests 패키지로 분리하여 개발을 시작한다. (defpackage :cd-db (:use :common-lisp) (:export #:dump-db)) (in-package :cd-db) (defpackage :cd-tests (:use :common-lisp :lis..