1. DOTIMES 와 DOLIST 함수
1) DOTIMES
- 리슾의 내장함수로서 반복문으로 사용된다.
- 구조
(DOTIMES (i n 결과값)
...)
ex)
(DOTIMES (i 4 'end)
(format t "~&I is ~S." i))
- 출력 화면
* 시작변수 값 0부터 시작하여 4회 반복한다는 의미
* format문(9Chpter 내용)
(format t "입력값") = "입력값" (반환값으로 기본값 nil도 같이 출력)
~& : 줄의 맨 앞으로 가라 / ~% : 엔터 / ~S : 변수 지시어
2) DOLIST
- 리스트안의 내용을 반복하는 함수
- 구조
(DOLIST (index-var 리스트 [결과 값(result-form)])
반복할 내용)
ex) 색깔 리스트를 입력받아 꽃의 색깔 출력
(defun rose (Colors)
(dolist (x Colors ‘flowers)
(format t “~&Roses are ~S.” x)))
ex) 가장 큰 원소 찾기
(defun find-largest (lst)
(let ((largest (first lst)))
(dolist (element (rest lst) largest)
(when (> element largest) (setf largest element)))))
설명 :
let으로 largest 초기값을 lst(리스트)의 첫번째 값으로 지정을 해두고,
(rest lst), 즉 first를 뺀 나머지 부분의 리스트를 반복문으로 돌려준다.
입력을 '(3 9 8 4) 받았을 때, largest의 초기값을 3으로 지정하고 (9 8 4)에서 largest보다 크면 값을 변경해 주는 식
3) return
- 반복문을 빠져나가는 함수
ex) 홀수를 찾으면 종료하는 함수
(defun find-first-odd (list-of-numbers)
(dolist (e list-of-numbers)
(format t "~&Testing ~S..." e)
(when (oddp e)
(format t "found an odd number.")
(return e))))
결과 화면 :
2. DO와 DO*
1) DO
- 다른 언어에서 쓰던 반복문과 비슷하다.
- 구조
(DO ((var1 초기값1 v변화식1)
(var2 초기값2 v변화식2)
...)
(종료 조건)
반복할 내용)
구조가 헷갈려 보일 수있는데 예시를 보면 이해가 갈 것이다.
% 주의사항 : 종료 조건이 없으면 안됨
ex) 로켓발사 타이머(입력값 숫자)
(defun launch (n)
(do ((cnt n (- cnt 1)))
((zerop cnt) (format t "Blast off!"))
(format t "~S..." cnt)))
n에 5가 들어가면, do문에서 5부터 시작해서 1씩 감소하다가 0이되면 blast off! 를 출력하게 된다.
ex) 교집합 구하기 (입력값 리스트)
(defun it-intersection (x y)
(do ((x1 x (rest x1))
(result nil (if (member (first x1) y)
(cons (first x1) result)
result)))
((null x1) result)))
함수에 '(a b c) '(d c e) 가 들어갔다고 하면,
do문에서 x(초기값)에 (a b c)가 들어가고, 변화식이 (rest x1)이므로 x1은 (a b c), (b c), (c), nil 으로 변화 될 것이다.
따라서 만약에 x1가 y의 멤버이면 cons셀에 넣어준다. x1이 nil이되면 result를 출력.
*member 함수 : CLHS: Function MEMBER, MEMBER-IF, MEMBER-IF-NOT (lispworks.com)
2) DO*
- 변수를 순차적으로 만들고 업데이트 할 수있다.(create and update the variables sequentially)
- DO문과의 차이는, DO문의 조건식안에 있는 변수의 값을 이용해 새로운 변수를 만들 수 있다는 점이다.
(let과 let*의 차이와 같은 원리)
ex) 첫번째 홀수 찾기
(defun ffo-with-do* (list-of-numbers)
(do* ((x list-of-numbers (rest x))
(e (first x) (first x)))
((null x) nil)
(if (oddp e) (return e))))
3) 무한반복문
ex) 사용자의 입력을 받아 숫자를 출력하기
(defun read-a-number ()
(do ((answer nil))
(nil)
(format t "~&Please type a number: ")
(setf answer (read)) //read는 내장함수로 사용자의 입력을 받는다.
(if (numberp answer)
(return answer))
(format t "~&Sorry, ~S is not a number. Try again." answer)))
3. prog 함수
1) prog1, prog2, progn : returns the value of the (first/second/last) expression
(prog2 (setf x ‘foo)
(setf x ‘bar)
(setf x ‘baz)
(format t “~&X is ~S” x))
//출력
X is BAZ
BAR
4. Lamda-list Keywords(람다 리스트 키워드)
1) &optional : 매개변수를 입력해도, 안해도 되는 키워드
2) &key : 매개변수를 여러개 받을 때, 기본값을 지정할수 있다.
( when a function accepts a large no. of optional arguments )
3) &rest : 임의개의 매개변수를 하나의 리스트로 받을 때 사용(매개변수가 몇개인지 모를때)
4) &aux : let*와 동일함
'Major > Lisp' 카테고리의 다른 글
[Lisp] Ch 7 Applicative Programming(실용적인 프로그래밍) (0) | 2021.05.29 |
---|---|
[Lisp] Ch 6 - 리스트 자료구조 (List Data Structures) (0) | 2021.04.21 |
[Lisp] Ch 5 - Variables and Side Effects (0) | 2021.04.13 |
[Lisp] Ch 3 - Eval Notation (0) | 2021.04.13 |
[Lisp] Ch 4 - 조건문 (Conditionals) (0) | 2021.04.10 |