|
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
이현민
가입: 2008년 9월 4일 올린 글: 18
|
올려짐: 2008년9월12일 22:42 주제: if문에 대한 질문입니다. |
|
|
처음에 하노이타워를 if문을 이용해서 짯었습니다.
코드: | (define (move-tower n from to rest)
(if (= n 1) (print-move from to)
((move-tower (- n 1) from rest to)
(print-move from to)
(move-tower (- n 1) rest to from))
)) |
그런데 실행시에 에러가 나길래,
솔루션을 보니 cond 문을 사용했더라구요.
그래서 몇 가지 실험해보았는데,
코드: | (define (test x)
(if (= x 1) ((display 1) (display 2))
((display 3) (display 4))
)) |
위와 같이 짜면
(test 1)
(test 2) 에 대해 모두 에러가 나고,
코드: | (define (test2 x)
(cond ((= x 1) (display 1) (display 2))
(else (display 3) (display 4))
)) |
cond를 이용했을 경우에는 올바르게 작동하더라구요.
혹시 실습시간에 말하셨는데 제가 못들었을 수도 있지만,
if문에서는 분기한 후에 2가지 명령을 수행하지 못하는건가요? 아니면, 2가지 이상의 명령 실행을 위해서 문법적으로 추가해줘야 할 것이 있나요? |
|
위로 |
|
|
최원태
가입: 2006년 9월 16일 올린 글: 369
|
올려짐: 2008년9월13일 16:37 주제: 순차적으로 여러 식을 실행시키는 방법 |
|
|
여러개의 expression을 순차적으로 실행시키는 문법구조로 begin 이란 녀석이 있습니다.
코드: | (begin 1 2 3 4)
((lambda () 1 2 3 4)) |
begin을 사용한 식 부터 봅시다.
이렇게 사용하면 제일 앞에 식 부터 하나씩 실행시키다가 가장 마지막 식의 값을 돌려주지요.
위의 경우에는 4을 돌려줄겁니다.
lambda를 사용한 코드도 begin을 쓴 코드와 똑같은 기능을 합니다.
(사실은, begin을 이용한 코드는 아래 코드의 sugar입니다)
그럼 본론으로 넘어가 볼 까요?
코드: | (cond ((case1) code1)) (else code2))
(if (case1) (begin code1) (begin code2))
(if (case1) code1 code2) |
첫 식은 세 번재 식이 아니라 두 번째 식과 같습니다.
begin을 쓸 일이 없을거라 생각했기 때문에 간단하게 세 번째 것과 같다고 설명했는데 사실은 그렇지 않습니다.
code1의 생김이 exp1 exp2 꼴이라면,
두 번째 식에서는 (begin exp1 exp2)가 되어 순차적으로 실행이 되겠지만
세 번째 식에서는 (exp1 exp2)가 되어 exp1을 함수로 보고 exp2를 인자로 함수호출을 하게 됩니다.
의미가 완전히 달라지는거죠. |
|
위로 |
|
|
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|