2009-04-16 5 views
6

그의 기사 The Nature of Lisp에서 Slava Akhmechet은 Ant/NAnt를 예로 들어 설명 할 사람들을 소개합니다. Ant/NAnt의 구현이 lisp에 있습니까? 어디에서 xml 대신 실제 리스프 코드를 사용하여 물건을 정의 할 수 있습니까? 나는 NAnt에 추가 사항을 만드는 것에 대처해야했고, Slava 쇼가 수행 될 수있는 방식으로 xml 시스템을 우회 할 수있는 방법을 원했습니다.Lisp의 Ant (또는 NAnt)

답변

12

개미은 일부 XML 언어로 작성된 명령을 해석하는 프로그램입니다. 당신은 그의 대답에서 언급 한 justinhj가 XML 파서 (언급 된 XMLisp와 같은)를 사용하고 어떤 종류의 Lisp 데이터에서 XML 설명을 변환 한 다음 Lisp에 추가 코드를 작성할 수 있습니다. Ant 해석의 일부를 다시 구현해야합니다.

개미의 기본 요소 대부분은 Lisp에서 필요하지 않습니다. 어떤 파일 조작은 Lisp (delete-file, rename-file, probe-file, ...)에 내장되어있다. 일부는 누락되어 구현해야합니다. 기존 라이브러리 중 하나를 사용할 수도 있습니다. 또한 Lisp 파일을 Lisp에 LOAD하고 실행 코드 (REPL도 있음)를 사용할 수 있으므로 이미 Java와 달리 대화식 프론트 엔드가 제공됩니다.

Common Lisp의 상위 레벨 빌드 시스템은 일반적으로 'SYSTEM'이라는 추상화를 구현하고 있습니다. 그 중 몇 가지가 있습니다. ASDF이 인기가 있지만 다른 것들도 있습니다. 시스템에는 서브 시스템과 파일이 있습니다. 시스템에는 몇 가지 옵션이 있습니다. 그 구성 요소에는 옵션도 있습니다. 시스템은 구성 요소에 대한 구조적 설명, 종속성에 대한 설명 또는 'actions'에 대한 종류 설명과 그 종속성을 갖습니다. 일반적으로 이러한 것들은 객체 지향적 인 방식으로 구현되며 Lisp (일반) 함수로 '액션'을 구현할 수 있습니다. 또한 Lisp 컴파일러를 사용하여 파일을 컴파일하는 COMPILE-FILE과 같은 기능을 제공합니다. 코드에 C 파일이 있으면 C 컴파일러를 호출해야합니다. 일반적으로 외부 프로그램 (여기서는 C 컴파일러)을 호출 할 수있는 구현 기능을 사용합니다.

마찬가지로, dmitry-vk에서 언급 한 것처럼 ASDF이 인기가 있습니다. LispWorks는 Common Defsystem을 제공합니다. Allegro CL에는 자체 DEFSYSTEM이 있습니다. 그것의 DEFSYSTEM manual은 또한 그것을 확장하는 방법을 설명합니다.

모든 Lisp 솔루션은 일반적으로 시스템을 설명하는 매크로로 구현 된 Lisp 구문 (XML 구문 아님)을 사용하고 있습니다. Lisp으로 읽혀지면, 그것은 시스템, 모듈 등에 대한 CLOS 인스턴스와 함께 데이터 표현으로 바뀝니다. 그런 다음 Lisp 함수도 동작합니다. 그런 다음 일부 고차원 함수는 구성 요소 그래프/트리를 거쳐 필요한 작업을 실행합니다. 다른 도구는 컴포넌트 그래프/트리를 거쳐 동작에 대한 표현을 반환합니다. 제안 된 계획입니다. 그러면 사용자는 Lisp이 전체 계획 또는 계획의 일부를 실행하게 할 수 있습니다.리스프 머신에

간단한 시스템 설명은 다음과 같습니다

(sct:defsystem scigraph 
    (:default-pathname "sys:scigraph;" 
    :required-systems "DWIM") 
    (:serial "package" "copy" "dump" "duplicate" "random" 
      "menu-tools" "basic-classes" "draw" "mouse" 
      "color" "basic-graph" "graph-mixins" "axis" 
      "moving-object" "symbol" "graph-data" "legend" 
      "graph-classes" "present" "annotations" "annotated-graph" 
      "contour" "equation" "popup-accept" "popup-accept-methods" 
      "duplicate-methods" "frame" "export" "demo-frame")) 

는 위 시스템 SCIGRAPH를 정의하고 모든 파일이 일련 위해 컴파일 및로드해야합니다.

지금은 리스프 머신이 컴파일 된 코드를 업데이트하기 위해 무엇을 할 것이라고 볼 수 있습니다

 
Command: Compile System (a system [default Scigraph]) Scigraph (keywords) 
         :Simulate (compiling [default Yes]) Yes 

    The plan for constructing Scigraph version Newest for the Compile 
     operation is: 
    Compile RJNXP:>software>scigraph>scigraph>popup-accept-methods.lisp.newest 
    Load RJNXP:>software>scigraph>scigraph>popup-accept-methods.ibin.newest 

그것은 하나 개의 파일을 컴파일 및로드 것 - 나는 소프트웨어를로드 지금까지 만이 파일을 변경할 수 있습니다.

ASDF의 경우 CLIKI 페이지에 언급 된 설명서를 참조하십시오.

+0

답변을 보내 주셔서 감사합니다! Ant에서 가장 큰 쇠고기는 XML을 사용하고 있기 때문에 기본 언어의 힘을 직접 사용하여 일부 작업을 수행 할 수 없다는 것입니다. XML 측에 "포팅 된"연산 (함수) 만 사용할 수 있습니다. Lisp으로 구현 된 시스템에서 볼 수있는 아름다움은 모든 혀짤음을 사용할 수 있으며 네이티브 함수에 XML 래퍼를 만들 필요가 없다는 것입니다. – Daniel

1

아마도 lisp에서 물건을 정의하고 NAnt에 전달한 시점에 XML로 변환 할 수 있습니다.

XMLisp과 같은 두 가지 표현은 앞뒤로 쉽게 이동합니다.

편집 : 실제로는 xml-emitter이 더 적합합니다.

+0

기사가 가져온 것은 XML이 메타 언어 였기 때문에 실제로 구현 언어를 사용할 수 없게되었습니다. Ant/NAnt가 lisp을 사용하여 구현 되었다면, 모든 노드에서 lisp의 힘을 모두 사용할 수 있습니다 ... 그래서 매력적입니다! – Daniel

+0

사실입니다. Scons가이 빌드 시스템에서 임의의 파이썬을 실행할 수 있기 때문에 Scons가 이에 대한 예라고 생각합니다. 한편, 코드 작성을 위해 간결하고 표현 언어가 진화 된 make, jam과 같은 성숙한 빌드 시스템은 lisp 개미의 개념이 덜 유용하다고 생각합니다. – justinhj

1

Common Lisp의 ASDF (Another System Definition Facility)는 Make/Ant와 비슷하지만 (완전한 아날로그는 아니지만 make 나 ant와 같은 일반적인 시스템이 아닌 lisp 프로그램을 만드는 것을 목표로합니다.) 그것은 Lisp 코드 (시스템, 컴포넌트, 시스템에 연산을 추가하는 서브 클래스 화)로 확장 가능합니다. 예를 들어 C 소스 파일을 시스템에 포함 (및 컴파일) 할 수있는 asdf-ecs 확장이 있습니다.

4

스튜어트 할로 웨이 (Stuart Halloway)의 책인 Programming ClojureLancet의 구성을 예제 앱으로 사용합니다. Lancet은 (선택적으로) Ant와 직접 통합되는 Clojure 빌드 시스템입니다. 소스 코드 및 예제는 available입니다.

Lisp 코드를 사용하여 Ant XML 파일을 생성하려면 Clojure에 clj-html, Common Lisp에 CL-WHO을 사용할 수 있습니다. Lisp에서 XML 생성하기 s-exps는 재미 있고 쉽습니다.