314초는 읽는이의 흥미여부에 따라 차이가 클 수 있다.;뒤에 글을 적으면 주석이 된다. (실행에 영향을 미치지 않는 글자들 설명적어둘 때 씀)
===다운로드===http://racket-lang.org/download/프로그램 다운받고 설치하고 DrRacket실행한다. 언어설정은 왼쪽아래에 있는 버튼 눌러서 use the language declared in the source누르고 첫줄에 #lang scheme적고 둘째줄부터 코딩 시작한다.==============
코딩한 후에 F5누르거나 오른쪽 위에 Run누르면 된다. 오른쪽 아래 졸라맨이 달려가면 실행중이고 한없이 달려가면 한없이 실행중 즉 무한루프라고 보면 된다.그럴때에는 오른쪽 위의 Stop버튼을 눌러서 졸라맨을 쉬게해주자.
자 이제 필요한 상황을 만들어서 어떻하나 물음을 주고 해결책을 제시하겠다.
1부터 10까지 더해보자간단하다 (+ 1 2 3 4 5 6 7 8 9 10)실행하면 55 나온다. 힌트>>실행은 F5또는 Run버튼 누르면 된다.
+가 함수다. 1 2 3 4 5 6 7 8 9 10은 함수에 건내주는 데이터다. 이것만 알아도 97%정도는 이해했다고 보면 된다. (하지만 아직 313초나 남았으니 더 읽어보자.)그러니까 함수에 데이터를 넣으면 결과가 나온다.(* 1 2 3 4) 힌트>>*는 곱하기라는 뜻이다.24가 나올테고(/ 1 2 3)1/6이 나올거다넣는 데이터를 이제부터 인자(파라미터)라고 부르겠다(- 1 2 3 4 5 6 7 8 9)해보면 알다시피 인자를 많이 넣어줘도 된다.
===주의===(/ 1 0)이렇게 0으로 나누진 말자. 다른 언어에서와 같이 오류난다.인간세상,수학세상에서도 0으로 나누는건 오류난다==========
중첩해서(+ (* 2 2) 2)와 같은 꼴도 해보자그럼 꼭 괄호치고 함수적고 인자 적어야 되나?그렇다 함수 실행하고 싶으면 그렇게만 하면 된다. 간단하지 않은가? 후후..
===그럼 그냥 숫자나 문자열 출력하는건 어떻게 하나?===그냥 괄호없이 숫자만 넣으면 그값이 나온다(리턴된다)그러면 글자는?글자는 그냥 적으면 변수로 취급하므로 " "로 감싸주거나 앞에'를 붙여주자. '는 뒤에배울 리스트이고 ""로 감싸는건 문자열 이라는 뜻이다. 괄호없이 그냥 다음과 같이 쳐보자'아햏햏 띄어쓰기가 있으면 안되는걸 깨달았다면 다음과 같이 해보자"후 후 후..."""로 묶으면 띄어쓰기 해도된다. 이건 문자열이다.그럼 숫자는? 그냥 숫자 적으면 된다 -_-;;3.141592653589793238462643383279502884197169399적고 f5누르면 그대로 나온다. 나중에 (printf "문장")나 (print "문장")대신에 쓸수 있으니 알아두면 좋다.=====================================================
자 그럼(= 1 1) 이건 뭘까?#t가 나올것이다.(= 10 (+ 7 3)) 이건 뭘까?이것도 #t나온다.(= 1 2) 이거는 #f나온다#t는 사실이라는 뜻이다. #f는 거짓이라는 뜻이다.당연한거다..;; 1하고 1하고 똑같은 숫자니깐, 10하고 7더하기 3하고 같은 숫자니깐, 1하고 2는 다르니깐!;;숫자 두개가 같은지 비교할때 쓴다.물론 숫자가 아니라 변수가 와도 된다. 변수는 약 42초뒤에 배우도록 하자.
===여기서 잠깐 그럼 비교연산은 어디에다 쓰나?===요렇게 쓴다.(if (= 998001 (* 999 999)) "사실이군" "거짓이군")물론 그냥 문자열 덜렁 써서 나오게 하고싶지 않다면 다음과 같이 써도 된다.(if (= 998001 (* 999 999)) (printf "사실이군") (printf "거짓이군"))if는 만약이라는 뜻으로 구조는 다음과같다.(if (조건) (사실이면 요 괄호실행) (거짓이면 요 괄호실행))팁>> 실행이라는 단어보다 사실 평가(evaluate)라고 더 많이 쓴다.cond라는 조건실행 함수도 있지만 나중에 배우자 ================================================
===그럼 함수이름은 꼭 기호여야 하나?===아니다 스킴에서 제공하는 또는 자신이 만든 함수 이름이어도 된다.함수 직접 만드는건 좀 있다 배우도록 하자.(min 31 22 98 74 33)min은 가장 작다는 뜻으로 22가 리턴된다.(max 31 22 98 74 33)max는 가장 크다는 뜻으로 98이 리턴된다.좀있다 리스트를 배울텐데 배워두면 유용하다. 우선 이정도만 알아두자팁>>사실 Lisp은 List Processing의 약자다 Scheme은 Lisp의 사투리격 언어다.(거의 같다.) 스킴이나 리습이나 둘다 리스트 많이 쓴다.========================================
변수 대입 (define 변수이름 변수값)적어주면 된다 예로..(define pi 3.14)하면 pi에 3.14가 들어간다(* 2 pi 10) 해보면 pi에 3.14가 들어가서 계산이되서 잘 나온다
===실습해보자!!===a에 99 b에 33 c에 11 d에 88 e에 123을 대입해서 다 더해보자!힌트>>대입 다 한후에 계산할때는 (+ a b c d e)라고 하면 된다.후기>>일일이 대입하느라 힘들었을거다. 더 간단하게 대입하고 그걸로 실행까지 할수있고 함수 안에서도 대입이가능한 let이라는 함수가 있다.나중에 배우든가 직접 찾아보도록 하자. 참고로 직접 찾을때에는 구글에서 let scheme를 검색하는걸 추천하고 영어좀 읽을수 있어야 할거다 'ㅅ'===답은 제일 뒤에 적어둘까 말까? ㅋ===
후후.. 그럼 이제 함수를 직접 만들어보자.함수 만드는건 엄청 많이 쓸것이므로 자주 보게 될 것이다.보기좋게 코드를 쓰려면 define하고 첫번째 괄호 닫은뒤에 엔터를 한번 쳐주자. 긴 코드 적을때에는 훨씬 보기가 편하다.(define (함수이름 변수) (내용))변수에는 전달된 데이터가 들어온다(define (제곱하기 x) (* x x))제곱하기를 호출하고 x를 건내주면 x에다 x곱해서 리턴된다.즉 (제곱하기 2) 하면 4가 나오고 (제곱하기 3)하면 9가 나온다다음과 같이 내용을 적은 괄호가 여러개여도 된다 즉 함수 몸체가 여러개여도 된다!(define (함수이름 변수) (내용1) (내용2) (내용3) (내용4))
===만약 괄호 한 쌍만 쓰고 싶다면?===괄호 하나에 내용을 여러개 넣으면 된다. (define (함수이름 변수) ((내용1) (내용2) (내용3) (내용4)))그러나 주의할점이 있다.!! 괄호 제일앞에 오는건 기본적으로 함수이름으로 인식한다즉 (내용1)의 리턴값이 a라면 a라는 함수를 실행하려고 하다가 a라는 함수가 없을테니깐 에러를 뱉을것이다.그럼 그냥 순서대로 실행은 어떻게 하느냐?(define (함수이름 변수) (begin (내용1) (내용2) (내용3) (내용4))) 요렇게 하면 된다. 그냥 괄호 제일 앞에 begin만 붙였다.=============================================
===잠깐-_-;;=== 혹시 함수를 정의만 해놓고 안돌아간다고 끙끙대고 있다면 다음과 같이 함수를 호출해보라.(함수이름 인자) 마치 (+ 1 2 3)했던 것처럼..계속 말하지만 인자 칸에는 함수에 넘겨줄 데이터가 들어간다. 함수는 그 데이터를 함수 이름 뒤에 적은 변수로 받아서 함수가 계산을 하는것이다.===============
===연습문제===아직 282초나 남았으니 연습문제 하나 풀고가자함수를 만들어 보아라.함수이름은 곱하고나누고빼고더하기 (함수이름은 공백이 들어가면 안되니까 정 띄어쓰고 싶으면 -(하이픈)을 쓰자. 곱하고-나누고-빼고-더하기 처럼.)인자(함수에 넘겨주는 데이터)는 a b c d e 다섯개의 변수에다가 받고a와 b는 곱하고 그 결과하고 c는 나누고 그결과하고 d는 빼고 그결과하고 e는 더해보자a b c만 알려주자면 다음과 같이 된다.(/ (* a b) c)==============
===또 다른 연습문제를 풀기전에===여기서 read와 printf 함수를 알려주겠다.우선 printf..(printf "출력할 내용") 하면 "출력할 내용"이 출력된다.그 다음.. (read)..간단하다. 그냥 사용자에게 입력받아서 그 값을 리턴해준다. 그 리턴한 값은 변수에 대입하든 함수 인자로 쓰든 알아서 하면 된다.(define name (read))라고 해보자 name에 사용자가 입력한 값이 들어간다.(define age (read))도 해보자 age에 사용자가 입력한 값이 들어간다.그럼 이걸 어디다가 쓰나?다음과 같이 해보자(printf "이름을 입력해주세요")(define name (read))(printf "나이를 입력해주세요")(define age (read))(printf "당신의 나이는 ~a이고 이름은 ~a이군요? 반가워요 ~a님" age name name)이라고 해보자.첫번째 ~a에 ""뒤에 있는 첫번째 변수가 들어간다. 두번째 ~a에는 두번째 변수가 세번째 ~a는 세번째 변수가 들어간다.=================================
===자 그럼 재귀호출을 사용해보자. 좀 어려울 수 도있다.===>>힌트 함수를 정의만 하고 실행을 안하면 소용이 없다. 실행하려면 (함수이름 인자) 인자가 없다면 (함수이름) 으로 호출해주자.재귀호출은 a라는 함수가 있으면 a함수안에서 a함수를 부르는 것이다.그럼 함수가 무한히 반복될 것이다. 하지만 특정 조건을 걸어서 그조건일때에는 더이상 호출을 하지않으면? 그 조건일때 함수는 멈추게 된다.=========================================================
===우선 무한 반복 하는걸 해보자.===(define (끝이없구만) (끝이없구만))이걸 실행하면 무한반복된다. 실행은 (끝이없구만) 으로 한다.졸라맨이 힘들어 할테니 Stop버튼을 눌러서 멈춰주자.====================================
===그러면 뭔가 보이는 무한반복을 해보자===(define (끝이안보여) (printf "끝이안보여n") (끝이안보여))>>팁 n은 다음줄로 바꾸라는 뜻이다.그런데 이걸 실행하면 정말 너무 빠르게 출력되어서 졸라맨도 힘들고 컴터도 힘들어 할것이다.0.5초에 한번씩 실행해보도록 하자(define (끝이안보여) (begin (printf "끝이안보여n") (sleep 0.5) (끝이안보여)))printf의 리턴값을 함수이름으로 인식해서 또 실행되니까 begin을 써서 그러지 않도록 했다.===========================================
===이제 숫자가 1씩 커지면서 그 숫자를 출력하는 함수를 만들어보자.===(define (1씩증가 x) (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1))물론 실행도 해야겠지 -_-;;(1씩증가 0) 0부터 1씩 증가한다.(1씩증가 43) 43부터 1씩 증가한다.====================================================================
===멈추고 싶을때는 어떻게 하는지 궁금한 사람이 있을꺼다.===x가 50이 되면 멈추도록 해보자 그냥 재귀호출을 하지 않으면 멈춰진다.(define (1씩증가 x) (begin (if (= x 50) (printf "끝") (begin (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1))))if는 괄호 3개를 쓴다. 첫번째는 조건 두번째는 조건이 참일때 세번째는 조건이 거짓일때. 그래서 if뒤에 괄호들을 3개로 만드려고 (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1)) 이 부분을 괄호 두르고 begin을 앞에 적은 것.저렇게 탈출조건을 걸어줬으면 그냥 한방에 다 출력하고 끝내는것도 좋을것이다. (sleep 0.5)를 제거해보자.===========================================================
자 이쯤 되면 머릿속에서 응용을 마구마구 하고있는 사람이 있을것이다.그럼 연습문제 ㄱㄱ~!구구단함수를 만들어보아라.다음과 같이 호출하고 결과를 내놓는다.>>힌트 1. (printf "~ax~a=~a" x y (* x y))2. (구구단 x (+ y 1))3. (begin (??) (??))4. (if (= y 10) (printf "끝") (??))(구구단 2 2) 2x2부터 시작 2x2=42x3=62x4=82x5=102x6=122x7=142x8=162x9=18끝 (구구단 5 4) 5x4부터 시작5x4=205x5=255x6=305x7=355x8=405x9=45끝 레벨업을 위한 가이드 1. 배껴서 실행해봤으면 삭제하고 다시 혼자힘으로 작성해본다.2. 문제가 생기면 프로그래밍으로 어떻게 풀어야 할지 생각해 본다.3. 질문하고 찾아본다.(영어로 구글링 하면 아주아주 잘나옴,아니면 네이버카페 lisper그룹에라도 가서 질문 ㄱㄱ)==========================================================================================================================이제 리스트를 배워보자리스트는 괄호앞에 '를 붙이면 된다.'(1 2 3 4 5 6 7 8 9)이건 리스트다 .'(+ 1 2 3 4 5 6 7 8 9)이것도 리스트다. 음.. 뭐 '(뚫훍) 이것도 리스트다.'이 붙는순간 코드든지 데이터든지 다 리스트 형식의 데이터가 된다.숫자 1앞에 있는 그 `가 아니라 엔터 왼쪽에 있는 그 '라는걸 주의하자.(length '(1 2 3 4 5 6 7 8 9))해보자. 9가 나올꺼다. length함수는 리스트의 길이를 출력해준다.그럼 리스트의 원소를 직접 쓰지 않고 계산해서 나온 값을 넣고 싶을때가 있을거다.'(1 2 3 (+ 2 2) 5 6 7 8 9) 그러나 이렇게 하면 안된다.이건 글자그대로 '(1 2 3 (+ 2 2) 5 6 7 8 9)인 리스트가 된다.그럴때에는 list함수를 쓰자.(list (1 2 3 (+ 2 2) 5 6 7 8 9) 여기서는 '를 안붙여도 된다.이렇게 적으면 '(1 2 3 4 5 6 7 8 9)인 리스트와 똑같이 된다 리스트를 알아두면 엄청나게 많은 일을 할수 있다. 리스트는 나중에 더 알아보도록 하자.
(define (gugu1 x);일일이 노가다 .. 함수 몸체가 여러개임 (printf "~a 곱하기 ~a 는 ~an" x 2 (* 2 x)) (printf "~a 곱하기 ~a 는 ~an" x 3 (* 3 x)) (printf "~a 곱하기 ~a 는 ~an" x 4 (* 4 x)) (printf "~a 곱하기 ~a 는 ~an" x 5 (* 5 x)) (printf "~a 곱하기 ~a 는 ~an" x 6 (* 6 x)) (printf "~a 곱하기 ~a 는 ~an" x 7 (* 7 x)) (printf "~a 곱하기 ~a 는 ~an" x 8 (* 8 x)) (printf "~a 곱하기 ~a 는 ~an" x 9 (* 9 x)))
(define (gugu2 x);함수 몸체가 하나 그런데 printf리턴값을 rr이라고 치면 저게 끝나고 나서 printf들을 싸고있는 괄호가 (rr rr rr rr rr rr rr rr)이 됨 그래서 가장 처음의 rr을 함수 그 뒤의것들을 데이터로 인식해서 또 rr이라는 함수를 실행하려고 하는데 그냥 순서대로 진행시키는 함수가 바로 begin인것임! (begin (printf "~a 곱하기 ~a 는 ~an" x 2 (* 2 x));리턴값을 함수로 인식해서 그 함수값에 뒤의 리턴값들을 합쳐서 또 실행시키려고 하기때문에 오류가 남 (printf "~a 곱하기 ~a 는 ~an" x 3 (* 3 x));그럴때 begin을 쓰면 됨! (printf "~a 곱하기 ~a 는 ~an" x 4 (* 4 x)) (printf "~a 곱하기 ~a 는 ~an" x 5 (* 5 x)) (printf "~a 곱하기 ~a 는 ~an" x 6 (* 6 x)) (printf "~a 곱하기 ~a 는 ~an" x 7 (* 7 x)) (printf "~a 곱하기 ~a 는 ~an" x 8 (* 8 x)) (printf "~a 곱하기 ~a 는 ~an" x 9 (* 9 x)) ))
;이 함수는 재귀호출 함수입니다 저기 if문을 안넣어주면 무한루프 되니까 넣어주세요 (define (gugu3 x y);재귀호출(자기자신을 부르는 함수)을 통해서 매우 간단해진 함수 그러나 함수 부를때 인자를 두개씩 넣어줘야한다.즉 2단 출력하고프면 (gugu2 2 2)라고해야한다 (if (= y 10) 'end (begin (printf "~a곱하기 ~a는 ~a" x y (* x y)) (gugu3 x (+ y 1)))))
(define (gugu4 x [y 2]);y가 전달되지 않으면 2가 자동으로 된다. 즉 2단 출력하고프면 (gugu3 2)라고만 해도 된다 (if (= y 10) 'end (begin (printf "~a곱하기 ~a는 ~a" x y (* x y)) (gugu3 x (+ y 1)))))
(gugu1 2)(gugu2 2)(gugu3 2 2)(gugu4 2)
후훗.. 314초가 넘었는가?프로그래밍은 원래 그런거다흥미있게 배우면 314초만에 배워야 한다는 생각은 자동으로 없어지게된다.하지만 흥미가 없으면 314초 도 지루하게 느껴진다.
===다운로드===http://racket-lang.org/download/프로그램 다운받고 설치하고 DrRacket실행한다. 언어설정은 왼쪽아래에 있는 버튼 눌러서 use the language declared in the source누르고 첫줄에 #lang scheme적고 둘째줄부터 코딩 시작한다.==============
코딩한 후에 F5누르거나 오른쪽 위에 Run누르면 된다. 오른쪽 아래 졸라맨이 달려가면 실행중이고 한없이 달려가면 한없이 실행중 즉 무한루프라고 보면 된다.그럴때에는 오른쪽 위의 Stop버튼을 눌러서 졸라맨을 쉬게해주자.
자 이제 필요한 상황을 만들어서 어떻하나 물음을 주고 해결책을 제시하겠다.
1부터 10까지 더해보자간단하다 (+ 1 2 3 4 5 6 7 8 9 10)실행하면 55 나온다. 힌트>>실행은 F5또는 Run버튼 누르면 된다.
+가 함수다. 1 2 3 4 5 6 7 8 9 10은 함수에 건내주는 데이터다. 이것만 알아도 97%정도는 이해했다고 보면 된다. (하지만 아직 313초나 남았으니 더 읽어보자.)그러니까 함수에 데이터를 넣으면 결과가 나온다.(* 1 2 3 4) 힌트>>*는 곱하기라는 뜻이다.24가 나올테고(/ 1 2 3)1/6이 나올거다넣는 데이터를 이제부터 인자(파라미터)라고 부르겠다(- 1 2 3 4 5 6 7 8 9)해보면 알다시피 인자를 많이 넣어줘도 된다.
===주의===(/ 1 0)이렇게 0으로 나누진 말자. 다른 언어에서와 같이 오류난다.인간세상,수학세상에서도 0으로 나누는건 오류난다==========
중첩해서(+ (* 2 2) 2)와 같은 꼴도 해보자그럼 꼭 괄호치고 함수적고 인자 적어야 되나?그렇다 함수 실행하고 싶으면 그렇게만 하면 된다. 간단하지 않은가? 후후..
===그럼 그냥 숫자나 문자열 출력하는건 어떻게 하나?===그냥 괄호없이 숫자만 넣으면 그값이 나온다(리턴된다)그러면 글자는?글자는 그냥 적으면 변수로 취급하므로 " "로 감싸주거나 앞에'를 붙여주자. '는 뒤에배울 리스트이고 ""로 감싸는건 문자열 이라는 뜻이다. 괄호없이 그냥 다음과 같이 쳐보자'아햏햏 띄어쓰기가 있으면 안되는걸 깨달았다면 다음과 같이 해보자"후 후 후..."""로 묶으면 띄어쓰기 해도된다. 이건 문자열이다.그럼 숫자는? 그냥 숫자 적으면 된다 -_-;;3.141592653589793238462643383279502884197169399적고 f5누르면 그대로 나온다. 나중에 (printf "문장")나 (print "문장")대신에 쓸수 있으니 알아두면 좋다.=====================================================
자 그럼(= 1 1) 이건 뭘까?#t가 나올것이다.(= 10 (+ 7 3)) 이건 뭘까?이것도 #t나온다.(= 1 2) 이거는 #f나온다#t는 사실이라는 뜻이다. #f는 거짓이라는 뜻이다.당연한거다..;; 1하고 1하고 똑같은 숫자니깐, 10하고 7더하기 3하고 같은 숫자니깐, 1하고 2는 다르니깐!;;숫자 두개가 같은지 비교할때 쓴다.물론 숫자가 아니라 변수가 와도 된다. 변수는 약 42초뒤에 배우도록 하자.
===여기서 잠깐 그럼 비교연산은 어디에다 쓰나?===요렇게 쓴다.(if (= 998001 (* 999 999)) "사실이군" "거짓이군")물론 그냥 문자열 덜렁 써서 나오게 하고싶지 않다면 다음과 같이 써도 된다.(if (= 998001 (* 999 999)) (printf "사실이군") (printf "거짓이군"))if는 만약이라는 뜻으로 구조는 다음과같다.(if (조건) (사실이면 요 괄호실행) (거짓이면 요 괄호실행))팁>> 실행이라는 단어보다 사실 평가(evaluate)라고 더 많이 쓴다.cond라는 조건실행 함수도 있지만 나중에 배우자 ================================================
===그럼 함수이름은 꼭 기호여야 하나?===아니다 스킴에서 제공하는 또는 자신이 만든 함수 이름이어도 된다.함수 직접 만드는건 좀 있다 배우도록 하자.(min 31 22 98 74 33)min은 가장 작다는 뜻으로 22가 리턴된다.(max 31 22 98 74 33)max는 가장 크다는 뜻으로 98이 리턴된다.좀있다 리스트를 배울텐데 배워두면 유용하다. 우선 이정도만 알아두자팁>>사실 Lisp은 List Processing의 약자다 Scheme은 Lisp의 사투리격 언어다.(거의 같다.) 스킴이나 리습이나 둘다 리스트 많이 쓴다.========================================
변수 대입 (define 변수이름 변수값)적어주면 된다 예로..(define pi 3.14)하면 pi에 3.14가 들어간다(* 2 pi 10) 해보면 pi에 3.14가 들어가서 계산이되서 잘 나온다
===실습해보자!!===a에 99 b에 33 c에 11 d에 88 e에 123을 대입해서 다 더해보자!힌트>>대입 다 한후에 계산할때는 (+ a b c d e)라고 하면 된다.후기>>일일이 대입하느라 힘들었을거다. 더 간단하게 대입하고 그걸로 실행까지 할수있고 함수 안에서도 대입이가능한 let이라는 함수가 있다.나중에 배우든가 직접 찾아보도록 하자. 참고로 직접 찾을때에는 구글에서 let scheme를 검색하는걸 추천하고 영어좀 읽을수 있어야 할거다 'ㅅ'===답은 제일 뒤에 적어둘까 말까? ㅋ===
후후.. 그럼 이제 함수를 직접 만들어보자.함수 만드는건 엄청 많이 쓸것이므로 자주 보게 될 것이다.보기좋게 코드를 쓰려면 define하고 첫번째 괄호 닫은뒤에 엔터를 한번 쳐주자. 긴 코드 적을때에는 훨씬 보기가 편하다.(define (함수이름 변수) (내용))변수에는 전달된 데이터가 들어온다(define (제곱하기 x) (* x x))제곱하기를 호출하고 x를 건내주면 x에다 x곱해서 리턴된다.즉 (제곱하기 2) 하면 4가 나오고 (제곱하기 3)하면 9가 나온다다음과 같이 내용을 적은 괄호가 여러개여도 된다 즉 함수 몸체가 여러개여도 된다!(define (함수이름 변수) (내용1) (내용2) (내용3) (내용4))
===만약 괄호 한 쌍만 쓰고 싶다면?===괄호 하나에 내용을 여러개 넣으면 된다. (define (함수이름 변수) ((내용1) (내용2) (내용3) (내용4)))그러나 주의할점이 있다.!! 괄호 제일앞에 오는건 기본적으로 함수이름으로 인식한다즉 (내용1)의 리턴값이 a라면 a라는 함수를 실행하려고 하다가 a라는 함수가 없을테니깐 에러를 뱉을것이다.그럼 그냥 순서대로 실행은 어떻게 하느냐?(define (함수이름 변수) (begin (내용1) (내용2) (내용3) (내용4))) 요렇게 하면 된다. 그냥 괄호 제일 앞에 begin만 붙였다.=============================================
===잠깐-_-;;=== 혹시 함수를 정의만 해놓고 안돌아간다고 끙끙대고 있다면 다음과 같이 함수를 호출해보라.(함수이름 인자) 마치 (+ 1 2 3)했던 것처럼..계속 말하지만 인자 칸에는 함수에 넘겨줄 데이터가 들어간다. 함수는 그 데이터를 함수 이름 뒤에 적은 변수로 받아서 함수가 계산을 하는것이다.===============
===연습문제===아직 282초나 남았으니 연습문제 하나 풀고가자함수를 만들어 보아라.함수이름은 곱하고나누고빼고더하기 (함수이름은 공백이 들어가면 안되니까 정 띄어쓰고 싶으면 -(하이픈)을 쓰자. 곱하고-나누고-빼고-더하기 처럼.)인자(함수에 넘겨주는 데이터)는 a b c d e 다섯개의 변수에다가 받고a와 b는 곱하고 그 결과하고 c는 나누고 그결과하고 d는 빼고 그결과하고 e는 더해보자a b c만 알려주자면 다음과 같이 된다.(/ (* a b) c)==============
===또 다른 연습문제를 풀기전에===여기서 read와 printf 함수를 알려주겠다.우선 printf..(printf "출력할 내용") 하면 "출력할 내용"이 출력된다.그 다음.. (read)..간단하다. 그냥 사용자에게 입력받아서 그 값을 리턴해준다. 그 리턴한 값은 변수에 대입하든 함수 인자로 쓰든 알아서 하면 된다.(define name (read))라고 해보자 name에 사용자가 입력한 값이 들어간다.(define age (read))도 해보자 age에 사용자가 입력한 값이 들어간다.그럼 이걸 어디다가 쓰나?다음과 같이 해보자(printf "이름을 입력해주세요")(define name (read))(printf "나이를 입력해주세요")(define age (read))(printf "당신의 나이는 ~a이고 이름은 ~a이군요? 반가워요 ~a님" age name name)이라고 해보자.첫번째 ~a에 ""뒤에 있는 첫번째 변수가 들어간다. 두번째 ~a에는 두번째 변수가 세번째 ~a는 세번째 변수가 들어간다.=================================
===자 그럼 재귀호출을 사용해보자. 좀 어려울 수 도있다.===>>힌트 함수를 정의만 하고 실행을 안하면 소용이 없다. 실행하려면 (함수이름 인자) 인자가 없다면 (함수이름) 으로 호출해주자.재귀호출은 a라는 함수가 있으면 a함수안에서 a함수를 부르는 것이다.그럼 함수가 무한히 반복될 것이다. 하지만 특정 조건을 걸어서 그조건일때에는 더이상 호출을 하지않으면? 그 조건일때 함수는 멈추게 된다.=========================================================
===우선 무한 반복 하는걸 해보자.===(define (끝이없구만) (끝이없구만))이걸 실행하면 무한반복된다. 실행은 (끝이없구만) 으로 한다.졸라맨이 힘들어 할테니 Stop버튼을 눌러서 멈춰주자.====================================
===그러면 뭔가 보이는 무한반복을 해보자===(define (끝이안보여) (printf "끝이안보여n") (끝이안보여))>>팁 n은 다음줄로 바꾸라는 뜻이다.그런데 이걸 실행하면 정말 너무 빠르게 출력되어서 졸라맨도 힘들고 컴터도 힘들어 할것이다.0.5초에 한번씩 실행해보도록 하자(define (끝이안보여) (begin (printf "끝이안보여n") (sleep 0.5) (끝이안보여)))printf의 리턴값을 함수이름으로 인식해서 또 실행되니까 begin을 써서 그러지 않도록 했다.===========================================
===이제 숫자가 1씩 커지면서 그 숫자를 출력하는 함수를 만들어보자.===(define (1씩증가 x) (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1))물론 실행도 해야겠지 -_-;;(1씩증가 0) 0부터 1씩 증가한다.(1씩증가 43) 43부터 1씩 증가한다.====================================================================
===멈추고 싶을때는 어떻게 하는지 궁금한 사람이 있을꺼다.===x가 50이 되면 멈추도록 해보자 그냥 재귀호출을 하지 않으면 멈춰진다.(define (1씩증가 x) (begin (if (= x 50) (printf "끝") (begin (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1))))if는 괄호 3개를 쓴다. 첫번째는 조건 두번째는 조건이 참일때 세번째는 조건이 거짓일때. 그래서 if뒤에 괄호들을 3개로 만드려고 (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1)) 이 부분을 괄호 두르고 begin을 앞에 적은 것.저렇게 탈출조건을 걸어줬으면 그냥 한방에 다 출력하고 끝내는것도 좋을것이다. (sleep 0.5)를 제거해보자.===========================================================
자 이쯤 되면 머릿속에서 응용을 마구마구 하고있는 사람이 있을것이다.그럼 연습문제 ㄱㄱ~!구구단함수를 만들어보아라.다음과 같이 호출하고 결과를 내놓는다.>>힌트 1. (printf "~ax~a=~a" x y (* x y))2. (구구단 x (+ y 1))3. (begin (??) (??))4. (if (= y 10) (printf "끝") (??))(구구단 2 2) 2x2부터 시작 2x2=42x3=62x4=82x5=102x6=122x7=142x8=162x9=18끝 (구구단 5 4) 5x4부터 시작5x4=205x5=255x6=305x7=355x8=405x9=45끝 레벨업을 위한 가이드 1. 배껴서 실행해봤으면 삭제하고 다시 혼자힘으로 작성해본다.2. 문제가 생기면 프로그래밍으로 어떻게 풀어야 할지 생각해 본다.3. 질문하고 찾아본다.(영어로 구글링 하면 아주아주 잘나옴,아니면 네이버카페 lisper그룹에라도 가서 질문 ㄱㄱ)==========================================================================================================================이제 리스트를 배워보자리스트는 괄호앞에 '를 붙이면 된다.'(1 2 3 4 5 6 7 8 9)이건 리스트다 .'(+ 1 2 3 4 5 6 7 8 9)이것도 리스트다. 음.. 뭐 '(뚫훍) 이것도 리스트다.'이 붙는순간 코드든지 데이터든지 다 리스트 형식의 데이터가 된다.숫자 1앞에 있는 그 `가 아니라 엔터 왼쪽에 있는 그 '라는걸 주의하자.(length '(1 2 3 4 5 6 7 8 9))해보자. 9가 나올꺼다. length함수는 리스트의 길이를 출력해준다.그럼 리스트의 원소를 직접 쓰지 않고 계산해서 나온 값을 넣고 싶을때가 있을거다.'(1 2 3 (+ 2 2) 5 6 7 8 9) 그러나 이렇게 하면 안된다.이건 글자그대로 '(1 2 3 (+ 2 2) 5 6 7 8 9)인 리스트가 된다.그럴때에는 list함수를 쓰자.(list (1 2 3 (+ 2 2) 5 6 7 8 9) 여기서는 '를 안붙여도 된다.이렇게 적으면 '(1 2 3 4 5 6 7 8 9)인 리스트와 똑같이 된다 리스트를 알아두면 엄청나게 많은 일을 할수 있다. 리스트는 나중에 더 알아보도록 하자.
(define (gugu1 x);일일이 노가다 .. 함수 몸체가 여러개임 (printf "~a 곱하기 ~a 는 ~an" x 2 (* 2 x)) (printf "~a 곱하기 ~a 는 ~an" x 3 (* 3 x)) (printf "~a 곱하기 ~a 는 ~an" x 4 (* 4 x)) (printf "~a 곱하기 ~a 는 ~an" x 5 (* 5 x)) (printf "~a 곱하기 ~a 는 ~an" x 6 (* 6 x)) (printf "~a 곱하기 ~a 는 ~an" x 7 (* 7 x)) (printf "~a 곱하기 ~a 는 ~an" x 8 (* 8 x)) (printf "~a 곱하기 ~a 는 ~an" x 9 (* 9 x)))
(define (gugu2 x);함수 몸체가 하나 그런데 printf리턴값을 rr이라고 치면 저게 끝나고 나서 printf들을 싸고있는 괄호가 (rr rr rr rr rr rr rr rr)이 됨 그래서 가장 처음의 rr을 함수 그 뒤의것들을 데이터로 인식해서 또 rr이라는 함수를 실행하려고 하는데 그냥 순서대로 진행시키는 함수가 바로 begin인것임! (begin (printf "~a 곱하기 ~a 는 ~an" x 2 (* 2 x));리턴값을 함수로 인식해서 그 함수값에 뒤의 리턴값들을 합쳐서 또 실행시키려고 하기때문에 오류가 남 (printf "~a 곱하기 ~a 는 ~an" x 3 (* 3 x));그럴때 begin을 쓰면 됨! (printf "~a 곱하기 ~a 는 ~an" x 4 (* 4 x)) (printf "~a 곱하기 ~a 는 ~an" x 5 (* 5 x)) (printf "~a 곱하기 ~a 는 ~an" x 6 (* 6 x)) (printf "~a 곱하기 ~a 는 ~an" x 7 (* 7 x)) (printf "~a 곱하기 ~a 는 ~an" x 8 (* 8 x)) (printf "~a 곱하기 ~a 는 ~an" x 9 (* 9 x)) ))
;이 함수는 재귀호출 함수입니다 저기 if문을 안넣어주면 무한루프 되니까 넣어주세요 (define (gugu3 x y);재귀호출(자기자신을 부르는 함수)을 통해서 매우 간단해진 함수 그러나 함수 부를때 인자를 두개씩 넣어줘야한다.즉 2단 출력하고프면 (gugu2 2 2)라고해야한다 (if (= y 10) 'end (begin (printf "~a곱하기 ~a는 ~a" x y (* x y)) (gugu3 x (+ y 1)))))
(define (gugu4 x [y 2]);y가 전달되지 않으면 2가 자동으로 된다. 즉 2단 출력하고프면 (gugu3 2)라고만 해도 된다 (if (= y 10) 'end (begin (printf "~a곱하기 ~a는 ~a" x y (* x y)) (gugu3 x (+ y 1)))))
(gugu1 2)(gugu2 2)(gugu3 2 2)(gugu4 2)
후훗.. 314초가 넘었는가?프로그래밍은 원래 그런거다흥미있게 배우면 314초만에 배워야 한다는 생각은 자동으로 없어지게된다.하지만 흥미가 없으면 314초 도 지루하게 느껴진다.