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
- #!/usr/bin/env clisp
- (defun parse-number (v)
- (with-input-from-string (s v) (read s)))
- (defun main()
- "명령행 인자(command-line argument) 개수 출력"
- (format t "Count of arguments: ~D~%" (length ext:*args*))
- (setf sum (apply #'+ 0 (mapcar #'parse-number ext:*args*)))
- (format t "The sum of arguments is ~F~%" sum))
- (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
- ; #!/usr/bin/env clisp ; clozure cl 의 wx86cl64 명령은 이를 이식하지 못함
- (defun parse-number (v)
- (with-input-from-string (s v) (read s)))
- (defun main()
- ;; 명령행 인자(command-line argument) 개수 출력
- (let ((arr (list))
- (sum 0))
- (setf arr *unprocessed-command-line-arguments*)
- (format t "Count of arguments: ~D~%" (length arr))
- (setf sum (apply #'+ 0 (mapcar #'parse-number arr)))
- (format t "The sum of arguments is ~F~%" sum)
- (quit) ))
- (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
- (defun parse-number (v)
- (with-input-from-string (s v) (read s)))
- (defun main()
- ;; 명령행 인자(command-line argument) 개수 출력
- (let ((arr (list))
- (sum 0))
- (setf arr (last *command-line-argument-list* (- (length *command-line-argument-list*) 4)))
- (format t "Count of arguments: ~D~%" (length arr))
- (setf sum (apply #'+ 0 (mapcar #'parse-number arr)))
- (format t "The sum of arguments is ~F~%" sum)
- (quit) ))
- (main)
실행> wx86cl64 -l testArguments-3.lisp -- 2 3 4 5 6
Count of arguments: 5
The sum of arguments is 20.0
'프로그래밍 > Common Lisp' 카테고리의 다른 글
80컬럼 컨솔에 19단표 출력하기 예제 for Common Lisp (0) | 2013.08.29 |
---|---|
(최대공약수 구하기) while... 반복문 예제 for Common Lisp (0) | 2013.08.29 |
if...else... 조건문 사용 예제 for Common Lisp (0) | 2013.08.29 |
구구단 출력 예제 for Common Lisp (0) | 2013.08.29 |
Hello 예제 for Common Lisp (2) | 2013.08.29 |