2008년 1월 2일 수요일

ASDF (Another System Definition Facility)

커먼 리습 프로그래밍을 하다보면 홈 폴더가 아닌 다른 폴더에 저장된 .lisp 파일을 로드해 올 수는 없을까 하는 의문이 생기게 된다. load가 파일을 읽어들여오는 path 설정은 도대체 어디서 하는거지? 라고 고민할 수 있다. 결론적으로 말하면 load는 파일을 로드하기 위해서 복수의 디렉토리를 살펴볼 능력이 없다. 하지만 방법이 없는 것은 아니다. asdf를 사용하면 원하는 일을 할 수 있다. SBCL이나 OpenMCL 같은 경우에는 asdf가 기본적으로 포함되어 있기 때문에 별도의 설치가 필요 없다. asdf를 사용할 때 다음과 같이 해주기만 하면 된다.

(require 'asdf)

asdf는 사실 프로그램이 복수의 파일들로 나뉘어서 짜여질 때 파일들 사이의 의존관계를 지켜가며 컴파일하도록 도와주는 C의 make와 비슷한 것이라 보면 된다. 이러한 의존관계는 .asd 파일로 만들어진다. 다음 cow.asd 파일의 예를 보면 tail.lisp 파일은 legs.lisp 파일에 의존적이다.

;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-

(defpackage #:cow-asd
(:use :cl :asdf))

(in-package :cow-asd)

(defsystem cow
:name "cow"
:version "0.0.0"
:maintainer "T. God"
:author "Desmon Table"
:licence "BSD sans advertising clause (see file COPYING for details)"
:description "Cow"
:long-description "Lisp implementation of our favorite ruminant"
:components ((:file "tail"
:depends-on ("package" "legs"))
(:file "legs"
:depends-on ("package"))
(:file "head"
:depends-on ("package"))
(:file "package")))

cow.asd 및 tail.lisp, legs.lisp 등의 파일이 ~/work/cow 폴더에 저장되어 있다고 하자. 그러면 이 시스템을 사용하기 위해서는 자신이 사용하는 리습의 스타트업 파일(홈폴더 아래에 만들면 되며 SBCL은 .sbclrc OpenMCL은 openmcl-init.lisp)에 다음과 같이 추가하면 된다.

(require 'asdf)
(push #p"~/work/cow" asdf:*central-registry*)

이렇게 추가한 뒤에는 SBCL에서는 그저 (require 'cow)라고 하는 것만으로 파일들이 차례대로 로드된다. 다른 리습 구현에서는 (asdf:operate 'asdf:load-op 'cow)라고 해야 하지만.

따라서 asdf를 이용하게 되면 홈 폴더가 아닌 곳에 리습 파일을 놓고 로드할 수가 있다. 리습 파일을 원하는 폴더에 위치시키고 그 폴더를 asdf:*central-registry*에 등록시킨 다음, 폴더 안에 있는 .lisp 파일들을 어떤 식으로 로드할 것인지를 .asd 파일로 만들어 역시 같은 폴더 안에 위치시키면 된다. 만일 로드하고자 하는 리습 파일이 lisp-unit.lisp파일 하나뿐이라면 lisp-unit.asd 파일은 다음과 같은 것으로 충분할 것이다.

(defpackage #:lisp-unit-asd
(:use :cl :asdf))

(in-package :lisp-unit-asd)

(defsystem lisp-unit
:name "lisp-unit"
:components ((:file "lisp-unit")))

아무튼, 여기서 다 설명할 수는 없지만, asdf는 현재 Common Lisp에서 시스템을 구성하는 일반적인 방법이다. 그리고 asdf-install은 Common Lisp 라이브러리를 설치하는데 가장 널리 사용되는 도구다. 둘 다 Common Lisp의 교과서들을 끝내고 실제 세상으로 나갈 때 반드시 사용하게 되는 도구라고 할 수 있다.

댓글 없음: