[Lisp] Ch 11 - 반복문과 블록구조 (Iteration and Block Structure)

2021. 4. 15. 03:52·Major/Lisp
728x90

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*와 동일함

728x90
저작자표시 비영리

'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
'Major/Lisp' 카테고리의 다른 글
  • [Lisp] Ch 7 Applicative Programming(실용적인 프로그래밍)
  • [Lisp] Ch 6 - 리스트 자료구조 (List Data Structures)
  • [Lisp] Ch 5 - Variables and Side Effects
  • [Lisp] Ch 3 - Eval Notation
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    lisp
    데브코스
    C++
    react
    파일처리
    자료구조
    Algorithm
    백준
    리팩토링
    프로그래머스
  • hELLO· Designed By정상우.v4.10.2
BeNI
[Lisp] Ch 11 - 반복문과 블록구조 (Iteration and Block Structure)
상단으로

티스토리툴바