2016-08-31 1 views

답변

7

unix-options을 사용해보십시오.

(ql:quickload :unix-options) 

(defpackage :test 
    (:use :cl) 
    (:import-from :unix-options 
       :&parameters 
       :&free 
       :with-cli-options)) 

당신은 아마 패키지를 :use 할,하지만 당신은 그것에서 심볼을 가져 선호하는 경우, 약 &free&parameters을 잊지 마세요. 라이브러리는 전통적인 getopt 유틸리티와 유사한 getopt 기능을 정의합니다. 그러나 또한 with-cli-options을 정의합니다. 조금 더 희미합니다.

  • 첫 번째 심볼 세트는 옵션, 즉 부재 또는 존재하는 플래그를 정의합니다.
  • &parameters 다음의 기호는 매개 변수를 정의하며 그 뒤에 값이 와야합니다. 두 옵션이나 매개 변수로 인식되지
  • 인수는 예를 들어 &free

에 의해 지정된 변수에 바인딩 목록에서 사용할 수 있습니다

여기
(in-package :test) 

(defun my-program (&rest cli-args) 
    (with-cli-options (cli-args) 
     (x y z &parameters a b &free other) 
    (list x y z a b other)))) 

나는 프로그램의 진입 점을 정의 .

(with-cli-options() <bindings> <body>) 

을 ... 그리고 옵션은 리스프 구현의 실제 명령 행 인수에서 이식 가져온 것입니다 : 실제 프로그램에서, 당신은 단순히 다음과 같이 비어있는 첫 번째 목록을 남길 수 있습니다. (uiop:command-line-arguments)을 호출하여 전체 명령 줄을 호출 할 수도 있습니다.이 명령 줄은 더 많은 구현을 지원하고 첫 번째 요소로 프로그램 이름을 포함합니다. 위 함수를 사용하면 파서의 동작을 테스트 할 수 있습니다. 짧은 옵션은 분리 또는 결합 할 수있는 예를 들어 참고 :

(my-program "-xyz" "-a" "2" "-b" "3" "--" "something") 
=> (T T T "2" "3" ("something")) 

(my-program "-x" "-y" "-z" "-a" "2" "-b" "3" "--" "something") 
=> (T T T "2" "3" ("something")) 

매개 변수로 선언하지만 실제 값을 제공하지 않는 옵션에 대한주의 (아마도 그들이 나, 경우는 모호) :

(my-program "-a" "-b") 
=> (NIL NIL NIL "-b" NIL NIL) 

알 수없는 매개 변수에 대한 경고가 있습니다

(ignore-errors (my-program "-w")) 
; WARNING: Invalid option: w 
=> (NIL NIL NIL NIL NIL NIL) 

은 자세한 내용은 문서를 참조하십시오.

+0

감사합니다. 이것은 꽤 멋져 보인다, 나는이 해결책을 들여다 볼 것이다. – MatthewRock

+4

또한이 파일을 실행 파일로 보냄으로써 uiop의'command-line-arguments' 함수를 볼 수도 있습니다. – Baggers

+0

@Baggers Updated, thanks. – coredump

관련 문제