Common Lisp 언어 의 명령행 인자 처리 방법은 Common Lisp 의 구현체 마다 각각 그 방법이 다르다. 아래의 에제는 CLISP 에서 동작하는 명령행 처리 예제이다.

CLISP 에서는 ext:*args* 라는 리스트(list)형 전역변수로 받는다.
(length ext:*args*) 는 명령문에서 인자의 개수이다.

parse-number 는 대부분의 Coomon Lisp 구현체에서 동작하는 (매우 짧은) 함수로서 스트링(string)을 부동소수점수(floating point number)로 변환하는 일을 한다.

mapcar 와 apply 함수를 사용하여 (반복문 없이) 그 합을 구할 수 있게 하였다.

GNU CLisp 에서는 명령행에서 실행시 명령행 인자들은 ext:*args* 라는 리스트 타입 변수로 받을 수 있다.  예를 들어,

          프롬프트> clisp lest.lisp 1 2 3 4 5

라고 실행하면, (lengh ext:*args*) 의 값은 5 이고,  변수 ext:*args* 는 '(1 2 3 4 5) 라는 리스트를 참조하게 된다. 




 (CLisp 용) 소스파일명: testArguments.lisp
  1. #!/usr/bin/env clisp
  2. (defun parse-number (v)
  3.      (with-input-from-string (s v) (read s)))
  4. (defun main()
  5.     "명령행 인자(command-line argument) 개수 출력"
  6.     (format t "Count of arguments: ~D~%" (length ext:*args*))
  7.     (setf sum (apply #'+ 0 (mapcar #'parse-number ext:*args*)))
  8.     (format t "The sum of arguments is ~F~%" sum))
  9. (main)

 

실행> clisp testArguments.lsp 1 2 3 4
Count of arguments: 4
The sum of arguments is 10


실행> clisp testArguments.lsp 1 2 3 4.1
Count of arguments: 4
The sum of arguments is 10.1


실행> clisp  testArguments.lsp 2.5 3.1E1 -1.5e-4
Count of arguments: 3
he sum of arguments is 33.49985



Closure CL 에서는 명령행에서 실행시 명령행 인자들은 *unprocessed-command-line-arguments* 라는 리스트 타입의 전역 변수로 받을 수 있다.  예를 들어,

          프롬프트> wx86cl64 -l test.lisp -- 1 2 3 4 5

라고 실행하면, (lengh *unprocessed-command-line-arguments* ) 의 값은 5 이고,  전역변수 *unprocessed-command-line-arguments* 는 '("1" "2" "3" "4" "5") 라는 리스트를 참조하게 된다. 

wx86cl64, wx86cl, ccl, ccl64, dx86cl64, dx86cl 등의 명령으로 Common Lisp 소스파일을 싱행시킬 때는 그 소스파일명 직전에 반드시 옵션 -l 또는 --load 를 추가해야 하며, 명령행 인자들은 반드시 두 개의 마이너스 기호 -- 다음에 입력하여야 한다. 



(Clozure CL 용) 소스파일명: testArguments-2.lisp

  1.  ; #!/usr/bin/env clisp    ;  clozure cl 의 wx86cl64 명령은 이를 이식하지 못함
  2.  
  3. (defun parse-number (v)
  4.       (with-input-from-string (s v) (read s)))
  5. (defun main()
  6.       ;; 명령행 인자(command-line argument) 개수 출력
  7.     (let ((arr (list))
  8.            (sum 0))
  9.         (setf arr *unprocessed-command-line-arguments*)
  10.         (format t "Count of arguments: ~D~%" (length arr))
  11.         (setf sum (apply #'+ 0 (mapcar #'parse-number arr)))
  12.         (format t "The sum of arguments is ~F~%" sum)
  13.         (quit) ))
  14. (main)


실행> wx86cl64 -l testArguments-2.lisp -- 2 3 4 5 6
Count of arguments: 5
The sum of arguments is 20.0



Closure CL 에서는 명령행에서 실행시 명령행 인자들을 프로그램 소스에서 받을 때 전역변수  *unprocessed-command-line-arguments* 대신  전역변수  *command-line-argument-lst* 로도 받을 수 있다.  예를 들어,

          프롬프트> wx86cl64 -l test.lisp -- 1 2 3 4 5

라고 실행하면, (lengh *command-line-argument-list* ) 의 값은 9 이고,  전역변수 *unprocessed-command-line-arguments* 는 '("wx86cl64" "-l"  " test.lisp"  "--" "1" "2" "3" "4" "5") 라는 리스트를 참조하게 된다. 


(Clozure CL 용) 소스파일명: testArguments-3.lisp

  1. (defun parse-number (v)
  2.     (with-input-from-string (s v) (read s)))
  3. (defun main()
  4.     ;; 명령행 인자(command-line argument) 개수 출력
  5.      (let ((arr (list))
  6.             (sum 0))
  7.         (setf arr (last *command-line-argument-list* (- (length *command-line-argument-list*) 4)))
  8.         (format t "Count of arguments: ~D~%" (length arr))
  9.         (setf sum (apply #'+ 0 (mapcar #'parse-number arr)))
  10.         (format t "The sum of arguments is ~F~%" sum)
  11.         (quit) ))
  12. (main)


실행> wx86cl64 -l testArguments-3.lisp -- 2 3 4 5 6
Count of arguments: 5
The sum of arguments is 20.0

 

Posted by Scripter
,