U E D R , A S I H C RSS

Scala/대화


PM linflus: 오늘은 위키 정리가 애매하면 이 채널에 내가 오늘 뭘 봤다 무슨 내용이었다 내용 요약이라도 올리겠읍니다.

PM linflus: 데캠의 노예 스칼라의 노예 선언을 해놓고 너무 나태한 노예질을 하는 것 같아서

PM linflus: ...

--- Tuesday, May 20th, 2014 ---

AM linflus: 오늘의 Scala

AM linflus: Martin Odersky(어려우므로 이하 스칼라 아저씨)의 강의를 들었읍니다.

AM linflus: 스칼라 아저씨의 강의는 매우 친절! 거북이처럼 느리게 들었더니 프로그래밍의 기초를 배우고 있었읍니다.

AM linflus: 오늘 들은 내용의 핵심은 evaluation

AM smksyj: 엑

AM smksyj: 쓰다가 잘랐네

AM linflus: ?

AM linflus: 얼음 먹으러..

AM linflus: Call by value는 함수 실행 시 argument를 먼저 evaluate

AM linflus: Call by name은 함수 body?를 먼저 대체한 다음 값을 evaluate

AM linflus: 같은 함수에 대해 Call by value와 Call by name을 단계별로 트레이스하면서 몇단계를 거치는지 열심히 설명하기에 이게 프랙티컬한 측면에서 굉장히 유의미한 것인지 조금 궁금해졌다

AM linflus: finite 할 경우에 그렇다는 이야기

AM linflus: (=call by value로도 terminate call by name으로도 terminate일때)

AM linflus: call by value로 terminate일 경우 call by name으로도 terminate임이 보장되지만 그 반대의 경우는 보장되지 않는다

AM linflus: 스칼라는 기본적으로 evaluation에 call by value를 쓴다

AM linflus: 이유는 exponentially 효율적인 경우가 더 많아서라고..

AM linflus: 하지만 call by name을 강제할 수 있따

AM linflus: def sum(x:Int, y: *=>* Int) = x+y

AM linflus: _(앗 =>에 bold를 적용했지만 티가 잘 안 나잖아!)_

AM linflus: 어쨌든 => 를 사용하면 y는 call by name으로 evaluation 하겠다는 뜻

AM linflus: 주간회의 세미나에서 얼핏 봤지만 이번 영상을 보면서 스칼라에서 함수 정의하는 문법이 좀 더 눈에 익었다

AM linflus: 아 맞다 call by value가 기본인 이유 중에 스칼라는 imperative하게 사용될 수 있어서 call by value가 기본인 쪽이 사이드 이펙트를 고려할 경우 더 자연스럽다(:question:)는 이유도 있었음

AM linflus: ~오늘의 스칼라 끝~

AM smksyj: 고생하셨습니다

AM linflus: 애매한 내용 지적은 감사합니다

AM linflus: 해주시면 내일 월급도둑질 하면서 봄..

AM smksyj: 그럼 call-by-value로 할 때는

AM smksyj: 어떤 식으로 함수 정의를 하면 되나요?

AM linflus: ?!

AM linflus: 그냥 쓰면 call by value..

AM linflus: 그니까 위에 sum에서 x는 call by value y는call by name

AM linflus: 이 얘기가 아닌가

AM linflus: terminate 관련된 얘긴가?!

AM linflus: 그건 좀 더 공부해야함!!ㅋㅋㅋ

AM smksyj: 아

AM smksyj: ㅇㅇ

AM smksyj: 그냥 쓰면 되는군

--- Wednesday, May 21st, 2014 ---

AM smksyj: @linflus: 혹시 오늘도 오늘의 스칼라는 연재 하나요?

AM linflus: 머리 감고 와서 할듯?

AM linflus: 머리 감고 와서 영상을 본 뒤..

AM lyuha: 자고 내일 아침에 봐야지...

AM linflus: 아직 다 안 봤지만 오늘의 뻘소리 : 스칼라 아저씨는 x를 iks라고 발음한다. 그게 독일식 발음인듯???

AM linflus: 아주 짧은 오늘의 스칼라

AM linflus: 조건문이 나왔다. 사실 조건문은 어떻게 보면 매우 익숙한 내용인데...

AM linflus: 아저씨는 자바의 조건문과 비슷하지만 statement가 아닌 expression에 대해 사용한다고 설명

AM linflus: Boolean 값에 대해서도 설명했다

AM linflus: 그리고 반가운(?) Short-circuit evaluation에 대해서도.. 이건 새싹 수업할때도 조건문 부분에서 하는 내용이지만

AM linflus: a || b 에서 a가 true일 경우 b 값과 상관없이 expression 값은 true로 evaluation 할 수 있기 때문에 b 값을 evaluation 하지 않고

AM linflus: 마찬가지로 a && b에서는 a가 false일 경우 b 값과 상관없이 expression 값을 false로 evaluation 할 수 있기 때문에 b 값을 evaluation 하지 않고

AM linflus: 새싹 수업할때는 C언어 조건문을 다루는 부분이라 true || a++ 이런 식의 문장을 주고 a++가 evaluation 되지 않기 때문에 a 값이 증가하지 않는다는 걸 샘플로 보여주곤 했는데

AM linflus: 이 강의는 스칼라로 알아보는 functional programming에 대한 내용이라 저런 mutable variable은 다루지 않는다

AM linflus: 대신에 terminate 되지 않는 expression을 뒤에 두고 evaluation하지 않는 것을 샘플로 설명하더라..

AM linflus: 조건문 다음에 value definition에 대한 부분이 나왔다

AM linflus: 어제 본 부분에서는 call by value와 call by name 즉, argument의 evaluation에 대한 내용을 다루었는데 value definition 부분에서는 definition에 대한 같은 접근을 다루고 있다

AM linflus: def는 by name / val은 by value

AM linflus: val x = sum(2, 3) //이 때 sum은 두 argument의 합을 반환하는 function

AM linflus: 이라면 val을 사용한 definition은 by value이므로 val x = 5로 evaluation 된다

AM linflus: terminate되지 않는 경우를 생각해보면

AM linflus: def loop: Boolean = loop

AM linflus: 와 같은 terminate 되지 않는 function loop가 있을 때

AM linflus: def x = loop

AM linflus: 라고 정의하면 by name으로 정의하기 때문에 x를 evaluation하지 않는다

AM linflus: 하지만 val x = loop 라고 정의하면 by value로 정의하기 때문에 x를 evaluate하려고 하고 infinite loop에 빠지게 된다

AM linflus: 스칼라 아저씨가 친절히 쉘에 해당 expression을 쳐서 와장창... 뻗는 모습을 보여주심

AM linflus: 영상 후반부에는 퀴즈 내고 그거 설명하는 게 거의 전부였는데 사실 되게 간단한거

AM linflus: and(x, y) == x && y

AM linflus: or(x, y) == x || y

AM linflus: 가 성립되는 and와 or function을 &&, || 연산자 없이 정의해보라는 것이다

AM linflus: 오늘 조건문 배웠으니까 그냥 그거 쓰면 된다

AM linflus: 근데 이 내용을 굳이 쓰는 이유가

AM linflus: def and(x: Boolean, y: Boolean) = if(x) y else false

AM linflus: def or(x: Boolean, y: Boolean) = if(x) true else y

AM linflus: 이렇게 정의하면 트랩카드라서

AM linflus: 왜냐면 저 경우엔 y가 call by value라서 short circuit evaluation 하지 않는다

AM linflus: def and(x: Boolean, y: => Boolean) = if(x) y else false

AM linflus: def or(x: Boolean, y: => Boolean) = if(x) true else y

AM linflus: 위와 같이 두번째 argument y에 대해 call by name을 강제해야 한다

AM linflus: 직접 스칼라 코드를 짜게 되면 이런 점을 간과해서 많은 시간을 소비하게 되리라는 불길한 예감과 함께 오늘의 스칼라 끝끝

AM linflus: 그리고 오늘의 뻘소리 2 : 이번편은 영자막이 없어서 당황과 분노

--- Thursday, May 22nd, 2014 ---

AM linflus: 오늘의 스칼라

AM linflus: 는 간단한 예제 구현과 그에 대한 설명이라서 IDE 셋팅을 했다

AM linflus: 난 Intellij를 사용하기로 함

AM linflus: 예제는 newton's method를 이용하여 제곱근 구하는 함수 만들기였음

AM linflus: newton's method나 제곱근 구하기가 스칼라랑 딱히 상관이 없으니 이 부분 설명은 패스

AM linflus: 궁금하다면 검색 혹은 수치해석과 그래픽스가 여러분을 환영

AM linflus: 첫 영상은 대체로 같이 구현해보는 시간이라 크게 적을 것이 없다...

AM linflus: 제곱근 구하는 함수를 재귀적으로 호출하게 되는데

AM linflus: 그동안 오늘의 스칼라에 쓴 함수들 보면 바로 위에 썼던

AM linflus: def and(x: Boolean, y: => Boolean) = if(x) y else false

AM linflus: 만 하더라도 return type을 명시적으로 정의해주고 있지 않다

AM linflus: 보통 return type은 optional

AM linflus: 하지만 재귀적으로 호출하는 함수의 경우 명시적 return type의 정의가 필요하다

AM linflus: 이 부분에 대한 설명은 나중에 스칼라의 type inference에 대해 찾아보고 좀 더 자세히 쓸 예정

AM linflus: 그리고 바로 다음 영상에서는 이미 짰던 제곱근 구하는 함수를 좀 더 깔끔하게 바꾸면서 block과 scope에 이야기 함

AM linflus: block은 아마 따로 설명 듣지 않아도 다들 코드 훑으면 감으로 파악할 수 있는 그런 부분

AM linflus: { ... } 처럼 중괄호로 감싸줘서 만들 수 있다

AM linflus: val x = 1
val block = { val x = 2; val y = 1; x+y } + x

AM linflus: block 내부에서 정의된 symbol은 block 외부에서 접근할 수 없고

AM linflus: symbol이 겹칠 경우 block 내부의 정의가 우선이다

AM linflus: 즉, 위 코드에서 block 밖에서 y에 접근하는 것은 불가능

AM linflus: 그리고 block의 evaluation 값은 4

AM linflus: =(2+1)+1

AM linflus: 끝부분에 세미콜론 얘기 나오는데 스칼라에서 식 끝의 세미콜론은 optional이다

AM linflus: 필수인 경우는 한 줄에 여러 식을 함께 쓸 경우

AM linflus: 위에 쓴 val x = 2; val y = 1; x+y 처럼

AM linflus: 세미콜론이 필수가 아니라서 하나의 긴 식을 여러줄에 나눠 썼을 때 원하는대로 evaluation 되지 않을 수 있다

AM linflus: expr1
+ expr2

AM linflus: 일 경우 두 식을 각각 evaluation 하는 경우가 생김

AM linflus: 이 때 쓸 수 있는 방법은

AM linflus: (expr1
+ expr2)

AM linflus: 괄호 짱짱맨b

AM linflus: 혹은

AM linflus: expr1 +
expr2

AM linflus: 오늘의 스칼라는 끝

AM linflus: 아 오늘은 세시에 잘 수 있다...

AM lyuha: 뭐랄까 여러가지 짬뽕된 느낌...

AM linflus: 스칼라가?

AM linflus: 아니면 적어둔 강의 내용이?

AM lyuha: 스칼라요

AM linflus: pure functional language가 아니라서 그렇게 느끼는 것일지도..

AM linflus: 하지만 강의 영상은 스칼라로 배워보는 functional programming이라 functional한 측면에 focusing하고 있다고 생각하는데..

AM linflus: 사실 이건 딴소리지만 진정한 짬뽕의 맛은 ruby에서 느낄 수 있습니다

AM linflus: (라고 개인적으로 생각...)

--- Friday, May 23rd, 2014 ---

AM linflus: 오늘의 스칼라

AM linflus: 는 Tail recursion

AM linflus: 오

AM linflus: Tail recursion 관련해서 위키피디아를 한번 찾아봤는데 한국어 페이지가 없다

AM linflus: 역시 검색은 한국어로 하면 안돼... 이건 이 채널 주제랑은 다르지만 어쩌면 날 검색대행자로 써먹는 분들은 평소에 네이버에 한글로 검색해서 아무것도 못 찾는 걸지도...

AM linflus: 흠 이게 사실 난 되게 쓸 게 없다고 생각했는데 왜냐면 Tail recursion이 스칼라에만 있는 것도 아니고 해서

AM linflus: 하지만 생각해보면 이 세상에 오직 스칼라에만 있는게 몇개나 된다고..

AM linflus: 아무튼 그런 의미에서 간단히 Tail recursion 이야기

AM linflus: 이거 관련해서는 얼마 전에 #offtopic쪽에서도 얘기 했었는데..

AM linflus: 함수 호출하면 스택에 parameter 등 함수 호출과 관련된 데이터를 쌓는다

AM linflus: 리턴하면 쌓았던 데이터를 빼고

AM linflus: 라고 말하고 보니 쌓고 빼고 이 단어가 마음에 안들지만 아무튼 지금 크게 중요한 게 아니니 패스

AM linflus: 만약 a 함수 실행 중에 b 함수를 호출하면 a 데이터가 스택에 쌓였다가 b 호출할 때 b 데이터를 스택에 쌓고 b 리턴되면 b 데이터를 빼고 a 리턴되면 a 데이터를 빼고

AM linflus: 근데 재귀함수면 종료조건에 도달하기 전까지 리턴이 안되고 종료조건 도달해야지만 리턴리턴리턴되니까 데이터를 계속 쌓기만해서 스택 잡아먹음

AM linflus: 이걸 재귀호출 이후 다른 연산이 없도록 tail recursive하게 짜면 스택프레임을 겁내 양산하지 않고 재활용한다

AM linflus: 재귀 호출 이후 다른 연산이 없도록 이란 말은 사실 예제를 보면 한큐에 알 수 있다

AM linflus: 재귀계의 국민예제 factorial 나와라 얍!

AM linflus: def factorial(n: Int):Int = if(n == 0) 1 else n * factorial(n-1)

AM linflus: 이 경우 종료조건 도달하기 이전에 factorial(n-1)을 재귀적으로 호출한 뒤 n과 곱하는 연산이 필요함 => tail recursive하지 않음

AM linflus: def factorial(n: Int):Int = {
def sub(result: Int, n: Int): Int = if(n == 0) result else sub(n * result, n-1)
sub(1, n)
}

AM linflus: 이 경우 sub(n*result, n-1)을 재귀적으로 호출한 뒤 다른 연산을 수행하지 않음 => tail recursive

AM linflus: 사실 영상을 하나 더볼까 했었지만 네시엔 자야겠기에 끝....

PM lyuha: tail recursive 반복적인 프로세스로 진행하는 재귀함수 인건가요.?

--- Saturday, May 24th, 2014 ---

AM linflus: 오늘은 ctrlcv 끝나고 늦게 들어와서

AM linflus: 스킵하긴 뭐하고 해서

AM linflus: http://scalatutorials.com/tour/
Interactive Scala Tutorial

AM linflus: 이걸 쭉 훑으면서 따라감

AM linflus: 지금 보고있는 coursera 강의는 스칼라 언어 문법 강의가 아니라 스칼라로 설명하는 함수형 프로그래밍 이라서

AM linflus: 내용에 함수형 프로그래밍 개념도 많이 섞여있고 스칼라도 굉장히 함수형 프로그래밍 언어스럽게 쓰고있는데

AM linflus: 저 튜토리얼은 그런거 없어서 새삼 아 그렇군 내가 듣고있는 강의가 함수형 프로그래밍 강의였군 하는 걸 깨달음

--- Sunday, May 25th, 2014 ---

AM linflus: 오늘의 스칼라

AM linflus: 는 Higher order function에 대한 내용

AM linflus: 아저씨 말로는 함수형 프로그래밍에서 중요한 개념이라고 한다

AM linflus: 대충 검색해보면 cs에서만 쓰이는 용어는 아니고 원래 mathematics에서 쓰이던 용어인듯

AM linflus: 아

AM linflus: 그러고보니 당연히 그런듯

AM linflus: order란 말이 한국어로 몇차 할때 차였던 것 같은데?!?!

AM linflus: 그럼 한국어로 고차함수란 뜻인가?

AM lyuha: 대충...

AM lyuha: 그런거같네요

AM linflus: ㅋㅋㅋ아 그런거였네

AM linflus: 암튼 다음 두 조건 중 하나를 만족하는 경우 higher order function

AM linflus: 1. 함수를 parameter로 받거나

AM linflus: 2. 함수를 return 하거나

AM linflus: 크.. 사실 난 math하는 사람이 아니니깐 higher order function 보다는 first class function 얘기를 하는 게 좋을 것 같다

AM linflus: first class function은 function을 first class object로 취급하겠다는건데

AM linflus: 학교 커리큘럼 따라서 C C++ Java 대충대충 짜다가 Javascript 책 보기 시작하고 처음에 되게 골때리는 부분이 여기였던 것 같다

AM linflus: 이게 말도 생소하고 또 번역하면 일급객체 이런 식이 돼서...

AM linflus: 일급객체... 흠좀... 뭔가 급이라는 말이 갖는 그 느낌이.....흠....

AM lyuha: 아..

AM lyuha: 일급객체 하면

AM lyuha: 느낌 이상하고 뭔가

AM linflus: 하지만 사실 심플하게 생각하면 그냥 function을 다른 function의 argument로 넘겨줄 수도 있고 return 값으로 쓸 수도 있다

AM linflus: 는 것. 찾아보면 다들 이렇게 설명하지만 읽고나면 그래서 왜 이게 일급인지 이해할 수 없기때문에 처음엔 난감

AM linflus: 번역이 잘못했네

AM lyuha: first class object 라는 건

AM lyuha: 인자와 리턴값으로 쓸수 있다 정도인가요.

AM linflus: 앗 정의를 그렇게 내리면 좀 허접한 정의가 되는듯

AM linflus: c c++ java에서 흔히 코딩하던 방식과의 차이라서 그렇게 얘기한것뿐

AM linflus: 틀린 말이라기보단 음... first class object가 뭐다 하려면 사실

AM linflus: 인자와 리턴값으로 쓸 수 있다는 얘기 한줄만 하는 것보다는 ~ class object 얘기 자체를 하는게 좋을 것 같기도 하고..

AM lyuha: 뭔가 조건 4개가 있는데

AM lyuha: 그중 2개가 저것 이긴 하네요

AM linflus: 크.. 그걸 다 묶어서 깔끔하게 정의하는 게 더 좋은데 대체로 아래의 조건을 만족하면 first class object다 이런식으로 설명하네..

AM linflus: 위키피디아를 보면 애초에 처음 그 개념을 언급한 사람이

AM lyuha: 위키피디아에서 정의한건 2개는 보자마자 감이 안 오네요.

AM linflus: 알골에서의 객체를 구분지어 말하면서 나온 거라 그런지

AM linflus: 엄밀하고 깔끔한 그런 느낌은 기대하면 안될 것 같기도...

AM linflus: 이게 어쩌면 수학쟁이가 만든 말이 아니라 컴퓨터쟁이가 만든 말이라 그런것이 아닐까하는 슬픈 추측을 잠시 했으나 찾아보니 그는 수학쟁이였읍니다

AM linflus: 감이 안 온다는 2개는 어떤건가요?

AM lyuha: 한국어 위키에 설명된
변수나 데이터 구조안에 담을 수 있다.
할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.

AM linflus: 일단 변수나 데이터 구조한에 담을 수 있다

AM linflus: 이건 말 그대로예요

AM lyuha: assigned to a variable

AM lyuha: 이 의미인가요

AM linflus: 네

AM linflus: 이것도 번역이 잘못했나

AM linflus: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

AM lyuha: ㅋㅋㅋㅋㅋ

AM lyuha: 안에 담을 수 있다보단

AM lyuha: 안에 담을 수 있다....

AM lyuha: 뭔가 맞는 번역이긴한데

AM lyuha: 봤을때는 뭔지 고민했네요

AM linflus: 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다 이건 뭘 번역한거지...

AM lyuha: 모르겠어요...그건...

AM linflus: 딱히 영문 문서들에 정의내릴때 그런 표현은 안 쓰는 것 같은데..

AM linflus: 더 찾아보고 무슨 의도인지 알것같으면 여기 멘션걸고 쓸게요

AM linflus: 정의할때 꼭 필요한 조건이라기보다 그 페이지 정리하던 사람이 부연해서 쓴 것 같은 느낌이라

AM lyuha: 네..

AM linflus: 아무튼 다시 원래대로 돌아가서

AM linflus: 자바스크립트에서 흔히 first class function을 느껴보기 좋은 경우가 콜백함수 parameter로 넘겨줄때

AM linflus: c만 짜던 사람한테는 함수포인터 얘기를 하게 됨

AM linflus: 강의에서는 간단한 예제를 사용했는데

AM linflus: def sumInts(a: Int, b: Int): Int = if(a>b) 0 else a + sumInts(a+1, b)

AM linflus: 이게 a와 b 사이에 있는 정수를 다 더해서 리턴하는 함수

AM linflus: 이때 a와 b사이에 있는 정수들을 모두 3제곱한 채 더하고 싶으면

AM linflus: def cube(x: Int):Int = x * x * x (edited)

AM linflus: 오.. 크 수정했다 (edited)

AM linflus: def sumCubes(a: Int, b: Int):Int = if(a>b) 0 else cube(a) + subCubes(a+1, b)

AM linflus: 근데 function을 parameter로 넘겨줄 수 있으니 굳이 매번 이렇게 만들 필요가 없음

AM linflus: def sum(f: Int => Int, a: Int, b: Int):Int = if(a>b) 0 else f(a) + sum(f, a+1, b)

AM linflus: def id(x:Int): Int = x

AM linflus: def cube(x:Int):Int = x * x * x

AM linflus: 해서

AM linflus: sum(id, a, b)

AM linflus: sum(cube, a, b)

AM linflus: 이런식으로 호출해주면 된다

AM linflus: f: Int => Int 이 부분은 f라는 function이 Int 값 하나를 parameter로 받아 Int를 반환하는 함수라는 뜻

AM linflus: 이걸 이제 익명함수를 쓰면

AM linflus: sum(x => x, a, b)

AM linflus: sum(x => x * x * x, a, b)

AM linflus: 이렇게 쓸 수 있다. id, cube같은 함수 정의도 필요 없음

AM linflus: parameter로 한번 넘기고 말 function이라면 익명으로 쓰는게 나은것같다

AM linflus: 오늘의 스칼라는 끝 (edited)

AM linflus: 내일 볼 영상이 기대된다. 주제가 Currying이라서...

AM linflus: 전에 분명 읽어봤는데 뭔 말인지 기억이 안 나는 Currying......

AM lyuha: 언제나

AM lyuha: 올라오면 두근두근하면서 보게되는 #scala

AM linflus: 늦게까지 안 자네요!!

AM linflus: 그나저나 ㅋㅋ

AM lyuha: 뜨끔...

AM lyuha: 과제 한다는 이유로 안 자다가

AM lyuha: 과제 진행도는 0....

AM linflus: ㅠㅠㅠㅠㅠㅠㅠ

AM linflus: 과제 시즌..

AM lyuha: 과제는

AM lyuha: 시즌이 없습니다

AM lyuha: 안 나오는 시즌이 존재할 뿐이죠

AM linflus: ㅋㅋㅋㅋㅋㅋ

AM lyuha: ㅋㅋㅋㅋ.....

AM linflus: 그런가...

AM linflus: 하긴 플젝이 시즌이고 과제는 조금씩 자주 나왔던 것 같네요

AM lyuha: 시험 기간 / 방학기간....

AM linflus: 하지만 진짜 시즌이 없는 것은 출근입니다.......망

AM lyuha: ...아....

AM lyuha: 간접체험 중이죠 ...

AM lyuha: 시즌없는 직장...

AM linflus: 학부시절에 더 많은 꿀을 빨고 졸업하길 바라요..

AM lyuha: 졸업이 아직 멀답니다. 제 머릿속에선

AM lyuha: 실제로도 멉니다!

AM linflus: 졸업보다 군대가 가까울 나이라..

AM linflus: 1학년때 너무 열심히 안해도 돼요

AM lyuha: 군대라니....

AM lyuha: 신검도 아직 안 받았다고요..ㅠㅠ

AM linflus: 대충하라는 말이라기보단 음.. 과제 하나하나에 목매다 진짜 하고싶은게 멀어질 수 있다?!

AM linflus: 이런 느김

AM lyuha: 그런것보단

AM lyuha: 과제 펴놓고 딴짓부터 그만해야죠...

AM linflus: ㅋㅋㅋㅋ그건 누구나 하는거라

AM lyuha: 과제 하나하나 목 매는 스타일도 아니고.

AM lyuha: 넘어가면 넘어가고.

AM lyuha: 뭐 이런느낌이라 이번 학기는...

AM linflus: ㅋㅋㅋㅋ아무튼 과제중이라니 너무 방해하면 안될것같은 느낌

AM linflus: 난 이제 자러...

AM linflus: 과제 얼른 마치고 자러가요!!

AM lyuha: 방해해도 괜찮습니다

--- Monday, May 26th, 2014 ---

AM smksyj: 오늘의 scala?

AM smksyj: currying은 그렇게 특이한 건 아니지 싶은데

AM smksyj: 내가 알기로는

AM smksyj: 이미 있는 함수에

AM smksyj: 부분 인수를 적용해서

AM smksyj: 새 함수를 만드는 걸

AM smksyj: currying이라고 하는 걸로 알고 있는데

AM smksyj: scala에서 지원하고 haskel에서 지원하고

AM smksyj: function add(a, b) {
return a + b;
}

AM linflus: 오

AM smksyj: 이럴 때

AM linflus: 특이해서 기대된다고 쓴 적 없음

AM smksyj: 그렇군

AM linflus: 분명히 봤는데 뭐더라 해서 기대되는것뿐

AM linflus: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

AM smksyj: function addOne(value) {
return add(1, value);
}

AM smksyj: 이런 거?

AM smksyj: 해서 addOne(10)

AM smksyj: 이렇게 쓰는 걸로 기억하는데

AM lyuha: 특이하네요

AM lyuha: 특이해요!

AM smksyj: ㄷㄷ

AM smksyj: 개인적으로는 왜 쓰는지나 쓰면 뭐가 좋은지 등을 잘 모르겠음

AM smksyj: 그래서 오늘의 linflus가 정리해 주는 걸 기대해 봐야지

AM smksyj: 두근두근

AM lyuha: 두근두근

AM lyuha: 여기 scala는 두근두근하ㅈ

AM linflus: 오늘의 스칼라

AM linflus: 는 어제 말한대로 Currying

AM linflus: 음식얘기가 아니라는 드립인지 아닌지 모르겠는 멘트로 시작한 강의...

AM linflus: Currying은 한줄로 심플하게 말하면 multiple argument를 받는 function을 바꾸는 것

AM linflus: 뭐로?

AM linflus: single argument를 받는 function의 chain으로

AM linflus: function의 chain이란 말을 갑자기 쓰는게 애매한가..

AM linflus: 위에 민관이가 말한 경우를 보면

AM linflus: def add(a:Int, b:Int):Int = a + b

AM linflus: 는 a, b 두개의 argument를 받고있지만 아래에서는

AM linflus: def addOne(value:Int):Int =add(1, value)

AM linflus: 해서 addOne 함수의 경우 single argument를 받음

AM linflus: 말한대로 currying이 뭐다 자체는 진짜 이게 끝인듯?

AM linflus: 근데 currying을 쓸거면 저런식으로 안 쓰겠지 싶은 생각은 듬 (edited)

AM linflus: 크..

AM linflus: 단어를 찾기 어렵군....

AM linflus:
`def add(a:Int, b:Int):Int = a + b
def mul(a:Int, b:Int):Int = a * b

def execute(f: (Int, Int) => Int)(a:Int, b:Int):Int = f(a, b)

execute(add)(1, 2)
execute(mul)(1, 2)
`
(edited)

AM linflus: 비슷한 예제라면 차라리 이런쪽을 들고오고 싶은데..

AM linflus: 물론 이 경우엔 execute(add)(1,2)에서 뒤에 (1,2) 넘겨주는 부분은 single argument가 아니지만

AM linflus: 사실 좀 궁금한건 그럼 저기서 execute(add)로 바꾸는 부분까지만 currying이라는 건지 그게 궁금.. 대충 내가 이해하기론 그런데..

AM linflus: 그 부분은 추후 좀 더 알아보기로 하고 Currying 써서 좋아보이는 건 중복되는 부분을 제거하고 일반화 시킬 수 있다는거?

AM linflus: 위에 사실 코드가 쓰다만 셈이 됐는데

AM smksyj: 특정 함수에서 인자 일부를 고정시켜서 새 함수를 만드는 것을 currying이라고 하는 거 아냐?

AM smksyj: def execute 만든 부분이

AM smksyj: currying 적용시킨 것 같은데

AM linflus: ㅇㅇ 그니까 거기까지만 currying인게 맞나

AM linflus: 그게 궁금

AM smksyj: 내가 알기론 그래

AM linflus: 아하 그렇군.. 땡큐 ㅋㅋ

AM linflus: execute((x, y) => x+y)(1, 2)

AM linflus: execute((x, y) => x*y)(1, 2)

AM linflus: 이렇게 써주면 쓸데없이 add, mul function을 정의할 필요가 사라짐

AM linflus: Currying이 늘 좋으냐고 하면 그건 아니라고 보고..

AM linflus: strategy pattern 쓰는 느낌이란 생각도 들었는데...

AM linflus: 이 정도로만 이점을 설명하는게 내 얄팍한 시야 내에서 설명하는 것일 수 있음

AM linflus: 오늘의 스칼라는 끝.

AM smksyj: ...

AM smksyj: 잠은 언제들 자는 거지

AM smksyj: 김태진도 지금 깨어 있던데

AM linflus: 아마 내일 내용이 앞에 봤던 두 영상 내용을 다른 예제 하나로 더 보는거라

AM lyuha: ...오전에요?

AM linflus: 설명이 더 있을 수도 있다는 생각은 듬

AM smksyj: linflus의 출근시간이 오후일 리는 없을테고

AM linflus: 난 원래 세시에 잠

AM linflus: 오늘은 네시에 자니까 내일 피곤하겠지

AM smksyj: ...

AM linflus: 오늘의 스칼라 시작하면서 네시에 자는 날이 많아서

AM linflus: 회사에선 거의 멍때리는듯

AM lyuha: ....

AM smksyj: 원준이는 언제 수업인지 모르겠군

AM lyuha: 12시요!

AM lyuha: 그니까 느긋하죠

AM smksyj: ...

AM lyuha: 아 맞다 접속한 사람들 뜨지....

AM smksyj: 헉 근데 이 채널은 3명 뿐인 건가?

AM lyuha: 그렇게 되네요...

AM smksyj: ... 남이 나 대신 스터디 해 주는

AM smksyj: 이렇게 좋은 채널을 두고

AM lyuha: ㅋㅋㅋㅋ

AM lyuha: 진짜 적절합니다 비유가

AM lyuha: 아 위에꺼 다 사라져간다

AM smksyj: 업데이트 빈도도 매일매일이고

AM smksyj: 정말 좋은 채널인데

AM smksyj: /애도

AM lyuha: 가끔 맥앱은 위에를 짤라버려서 refresh는 위대합니다(?)

--- Yesterday May 27th, 2014 ---

AM linflus: 오늘의 스칼라

AM linflus: 는 어제 말한대로 example인데 음...

AM linflus: 그걸 직접 짜보는 데 의의가 있고 짜본것을 설명하는데 의의가 있는 영상이 아니었다

AM linflus: 여기에 옮길만한 말은 Currying의 이점에 대한 것인데

AM linflus: 스칼라 아저씨도 abstract와 재사용에 의의가 있다고 함

AM linflus: 그리고 짱짱 abstraction이 꼭 옳은 것은 아니라는 말도 덧붙임

AM linflus: 때때로 concrete한 게 더 적절할 때가 있으나 abstraction techniques를 알아둬야 한다고

AM linflus: 그 다음 영상은 짤막한 스칼라의 syntax 리뷰였다

AM linflus: EBNF로 스칼라 문법을 설명했다

AM linflus: Linflus(은)는 지금 하고있는 것이 #scala인지 #compiler인지 혼란스러웠다 !

AM linflus: 내가 보는 것은 의미가 있었으나 그것도 여기 다 옮겨적을 내용은 아니라서 패스

AM linflus: 어쩐지 하나 더 봐야할 것 같아서 다음 영상도 봤다. 두번째 영상이 엄청 짧긴 했지만 영상 세개나 본 날은 처음..

AM linflus: 오늘은 일찍 보기 시작해서 가능한 일이군..

AM linflus: 드디어 Class가 나왔는데 스칼라로 처음 프로그래밍을 배우는 사람이라면 모르겠으나

AM linflus: 굳이 Java 아니더라도 기존 문법상 class를 지원하는 언어들을 사용해본 사람이라면

AM linflus: 그냥 스칼라의 class는 immutable class여

AM linflus: 하고 생각하면 될 것 같은 내용이었다

AM linflus: 그래도 예제가 없으면 섭섭하니까 예제...

AM linflus: 이건 새로 짜와야한다. 왜냐면 영상 예제는 분수라서 그냥 여기에 샘플로 던져놓기엔 좀 읽기 짜증난다.

AM linflus: c++ class의 단골예제 Complex 소환!

AM linflus:
`class Complex(a:Int, b:Int) {
def real = a
def imaginary = b

def add(that: Complex) = new Complex(real + that.real, imaginary + that.imaginary)
def neg = new Complex(-real, -imaginary)
def sub(that: Complex) = add(that.neg)
override def toString = real + " + " + imaginary + "i"
}
`

AM linflus:
`val a = new Complex(1, 3) //a: Complex = 1 + 3i
val b = new Complex(4, 5) //b: Complex = 4 + 5i
a.add(b) // Complex = 5 + 8i
b.add(a) // Complex = 5 + 8i
a.sub(b) // Complex = -3 + -2i
b.sub(a) // Complex = 3 + 2i
`

AM linflus: 스칼라로 functional programming 할 경우 mutable variable로 상태를 갖는 게 아니기때문에 메서드들이 모두 새 instance를 반환하고 있음

AM linflus: 이게 포인트라고 생각하고..

AM linflus: 그 외의 부분은 다른 것과 다른게 없다..

AM linflus: 오버라이드 할때는 override def라고 씀

AM linflus: 아마 이제부터 본격적으로 코드를 짜게될 것 같다

AM linflus: 그래서 intellj를 적극적으로 쓰려고 하는데 intellj 스칼라 플러그인에서 evaluation worksheet이 제대로 동작하지 않는다

AM linflus: 버그가 고쳐졌다는 버전보다 상위 버전을 쓰고있는데.. 버그가 돌아오셨나? 아윌비백?

AM linflus: 아무튼 오늘의 불평불만을 포함한 오늘의 스칼라 끝

AM linflus: 앞으로는 내용 정리보다는 코드를 적극적으로 짜보는 게 이해에 더 도움이 될 것 같다는 생각이 들어서

AM linflus: 이 채널에 내용이 많이 올라오지는 않을 것 같다는 생각도 듬

AM lyuha: 그건 좀 아쉽네요...

AM smksyj: 모두 새 인스턴스를 반환하면

AM smksyj: 생성 비용이 너무 크지 않나?

AM linflus: 상황따라 그럴 수도 있을듯?

AM smksyj: functional하게 짜서 그런가

AM smksyj: 원래는 상태도 가지고 그럴텐데

AM lyuha: 애초에 class가 immutable 이여야 하는 이유가 있는걸까요...?

AM smksyj: 내가 봤던 걸로는

AM linflus: functional programming이라서...

AM smksyj: 굳이 저렇게 immutable하게 만들지는 않았음

AM smksyj: functional이라서가 맞는 것 같네

AM linflus: 강의가 functional programming 강의..

AM smksyj: ㅇㅇ

AM linflus: 자바에 껴넣을 수 있으니

AM linflus: 당연히 스칼라 자체는 상태를 가질 수 있음

AM smksyj: 다만 clojure의 경우

AM linflus: 아니면 짜졌겠지

AM smksyj: 복사 시에 겹치는 상태는 공유하는 방식을 이용하였지만

AM smksyj: scala는 아니겠지...

AM linflus: 짜졌겠지 == 웹개발에서 스칼라 못쓸듯

AM linflus: 오 그런 깊은 이야기까지는 모르겠다.. 그건 더 알아봐야 할 부분

AM linflus: 근데 이 강의는 사실 핵심이 스칼라가 아니라

AM linflus: 스칼라로 배우는 함수형 프로그래밍이라

AM smksyj: 함수형

AM linflus: 나오는 개념이 줄창 함수형 프로그래밍 ㅋㅋ

AM linflus: 개인적으론 그래서 지금까지는 질리지 않고 매일 볼 수 있는 것 같음

AM linflus: 스칼라로 웹개발 해보아요 였으면 진작 gg치고 채널 먹튀했을듯;

AM smksyj: 꽤 아쉽네

AM smksyj: 개인적으로 스칼라가 자랑할 만한 건

AM smksyj: 함수형도 있지만

AM smksyj: 액터 모델이나

AM smksyj: trait이나

AM smksyj: 같은 것들이라고 생각하는데

AM linflus: 그런건 functional한 부분을 먼저 훑고 나서 봐도 될 것 같음

AM linflus: ㅋㅋ

AM smksyj: 그것도 강의 있음?

AM linflus: 아니

AM linflus: 찾아보면 되지

AM lyuha: 뭔가

AM lyuha: 따라가기 힘들어졌다

AM lyuha: 액테 모델 trait?

AM smksyj: Actor라고 해서

AM lyuha: 엑터 모델 ... trait?..

AM smksyj: 스레드를 조금 더 쓰기 편하게?

AM linflus: 강의 수준의 샘플 진도 따라잡으면

AM smksyj: 그런 게 있음

AM linflus: 단타 example말고 토이 프로그램을 하나 짤건데

AM linflus: 그럴때 어쩔 수 없이 찾아보게 되겠지

AM smksyj: Actor 모델은 Erlang에서 가져왔다고 하는 것 같던데

AM smksyj: trait은

AM smksyj: 구현을 가지고 있는 Interface

AM linflus: ?!

AM linflus: abstract class랑 차이점이 뭐지

AM smksyj: 그건

AM smksyj: trait의 구현 부분은

AM smksyj: 특정 클래스의 세부사항이 안 드러나게?

AM smksyj: 만들어질걸

AM smksyj: 그래서 인터페이스처럼 어디에든 끼워 넣을 수 있음

AM smksyj: 다만 인터페이스처럼

AM linflus: trait의 instance가 생성 가능하다는건가?

AM smksyj: 그걸 구현하는 애들은 몇몇 메소드를 구현해야 함

AM smksyj: 그건 아니고

AM smksyj: trait에 메소드가 여러 개가 있으면

AM smksyj: 그 중 일부는 trait 내부의 메소드를 이용해서 구현되어 있다고 해야 하나

AM smksyj: 대신 몇몇은 trait을 extend 하는 클래스가 override를 해 줘야 함

AM smksyj: 그래서 몇 개만 override를 해 주면

AM smksyj: 나머지 메소드들은 trait 안에서 이미 trait 자체의 메소드를 이용해서 정의가 되어 있기 때문에

AM smksyj: 전부 다 override 안 해도 된다는 얘기

AM smksyj:
`trait Similarity {
def isSimilar(x: Any): Boolean
def isNotSimilar(x: Any): Boolean = !isSimilar(x)
}
`

AM smksyj: 여기서 isNotSimilar 같은 경우는

AM smksyj: isSimilar를 이용해서 구현이 되어 있고

AM smksyj:
`class ExampleClass extends Similarity {
}
`

AM smksyj: 이런 애가 있으면

AM smksyj: 얘는 isSimilar만 override 해 주면

AM linflus: ?! 들을수록 abstract class랑 차이를 잘 모르겠어

AM linflus: abstract class도 일부 메소드는 정의가 되어있고

AM smksyj: 음...

AM linflus: 하지만 모든 메소드가 정의되어있는 건 아니라서 instance는 못만들고

AM smksyj: 생각해보니 그런 것 같네...

AM linflus: 상속받는 class에서 정의해야하는 거 아님?

AM linflus: 내가 기억 잘못하는걸지도

AM linflus: abstract class를 시험지에 적어내던 것이 언제적일인가 싶긴 함

AM smksyj: 아 근데

AM smksyj: abstract class는

AM smksyj: 복수 상속이 안 되잖아

AM linflus: 아

AM linflus: 그렇군

AM linflus: 그건 중대한 차이군

AM linflus: !!

AM linflus: 다중상속이 된다면 그건 차이가 있네 ㅋㅋ

AM linflus: 크 오늘은 일찍 자려고 일찍 보기 시작했는데

AM linflus: 예제파티하다보니 결국 자는 시간은 똑같아

AM smksyj: 많이 봐서 늦게 자는군

AM linflus: ㅋㅋㅋㅋ

AM linflus: 대신 이미 나온 영상 진도 더 빨리 따라잡고 다른걸 할 수 있겠지

AM linflus: 자러가야겠다..

AM linflus: 학부생들도 좋은밤되세요....

AM lyuha: 안녕히 주무세요

AM smksyj: ㅂㅂ

AM smksyj: 진짜 ZP의 귀감이군...

AM lyuha: .....그러게요

AM linflus: 그럴리가

AM lyuha: 3:33분에

AM lyuha: 야식 끝.



AM smksyj: 스레드의 대안으로 actor 모델이라는 것을 사용하였음

AM smksyj: 확실히 멀티코어 환경이 보편화 되면서

AM smksyj: 보다 안정적인 스레드의 사용은

AM smksyj: 많이들 고려를 하나보지

AM smksyj: clojure의 STM도 스레드의 대안으로 만들어진 물건임

AM skylibrary: joined #scala

--- Today May 28th, 2014 ---

AM linflus: 오늘의 스칼라도 예제파티...

AM linflus: 하지만 오늘은 버그노예질을 하고 집에 택시타고 들어왔기때문에 영상 하나만 봤다

AM linflus: 솔직히 말해서 Java개발을 해본 사람에게 크게 새로운 내용은 없었음

AM linflus: 그래서 특별히 언급하고 싶은 건 require와 assert

AM linflus: 음 둘 다 testing에 사용할 수 있는 function

AM linflus: 사실 강의 영상은 스칼라 아저씨가 설명하고 싶은 부분을 설명하기때문에 그 이후에 다시 검색해야하는 부분이 생긴다

AM linflus: 이를테면 강의 영상을 보면 require와 assert의 차이를 조건을 만족시키지 못했을 때 require는 IllegalArgumentException을 발생시키고 (edited)

AM linflus: assert는 AssertionError를 발생시킨다는 것

AM linflus: 그래서 require는 function을 call할때의 전제조건을 강제하는 데 쓰이고(강의에서는 분수의 분모는 0이 될 수 없다는 전제로 예를 듬)

AM linflus: assert는 function 자체에 대한 테스트에 쓴다

AM linflus: 정도로 이해하게 되는데 이게 맞나 싶은 생각이 듬

AM linflus: 아 그리고 또 하나는 constructor 문법 (edited)

AM linflus: class Complex(a:Int, b:Int) 에서 a, b 두 인자를 받는 constructor 외에 인자를 아예 받지 않거나 하나만 받는 다른 contructor를 정의하고 싶다면 class 내에

AM linflus: def this(a:Int) = Complex(a, 0)

AM linflus: 이런식으로 this라는 키워드를 사용해 정의해줄 수 있다

AM linflus: Intellij 문제는 아직 해결법을 몰라서 내일 좀 더 손을 대거나 그냥 이클립스를 다시 깔 생각

AM linflus: 사실 오늘부터 코드짜는데 시간을 좀 더 들이려고 노트북을 들고나갔는데 10시까지 버그노예하는 바람에...

AM linflus: 내일은 야근만 안 하게 된다면 좀 더 구색을 갖춘 예제를 가져올 수 있기를 바라며 오늘의 스칼라는 끝 (edited)

AM smksyj: 기억이 맞다면

AM smksyj: scala는 생성자가 복수 개 있으면

AM smksyj: 기본 생성자가 아닌 것들은

AM smksyj: 반드시 내부에서 기본 생성자를 호출하게? 그런 제약이 있었던 걸로 기억하는데

AM linflus: 아하 진짜?

AM smksyj: 그런 얘기는 혹시 뭐 없었나요

AM smksyj: 당시에 보면서

AM smksyj: 뭐 저렇게 불편하게 만들었지

AM smksyj: 하는 생각을 했던 것 같은데

AM linflus: 영상 예제에서 기본 생성자를 호출하긴 했지만 딱히 그런 말 들은 기억이 없는데 영어니까 놓쳤을 수 있음

AM linflus: 다시 그 부분 봐야지

AM linflus: 일단 다시 봤을때 기본 생성자는 class body에 있는 statement를 모두 실행한다는 말도 있군

AM smksyj:
`class Employee(val firstName:String, val lastName:String){
var age:Int = 0
var city:String = _

def this(firstName:String, lastName: String,
city:String, age:Int){
this(firstName, lastName, city)
this.age = age

}
def this(firstName:String, lastName: String, city:String){
this(firstName,lastName)
this.city = city

}
}
`

AM smksyj: def this(firstName:String, lastName: String, city:String){
this(firstName,lastName)
this.city = city
}

AM smksyj: 아마 Employee(val firstName:String, val lastName:String)

AM smksyj: 이게 디폴트 생성자지 싶은데

AM smksyj:
`def this(firstName:String, lastName: String, city:String){
this(firstName,lastName)
this.city = city
}
`

AM smksyj: 저 안에서 this(firstName, lastName)의 호출이

AM smksyj: 의무였던 걸로 기억함

AM linflus: 아; 다시 봐도 그런 말은 없네

AM smksyj: 그런가

AM linflus: 그게 틀렸다기보다 그 얘기를 별로 그 타이밍에 하고싶지 않았던것같기도

AM smksyj: ㅇㅇ

AM linflus: 별로 흐름이랑 상관없어서..

AM smksyj: 근데 나도 정확하게 기억은 안 나서

AM smksyj: 생성자 얘기 하길래

AM smksyj: 혹시 그런 얘기가 있었나 궁금해서 그럼

AM linflus: ㅇㅇ 나도 궁금해져서 검색중

AM smksyj: Auxiliary Constructor


AM linflus: Secondary constructors like this() need to delegate to another constructor to work (Thanks @Synesso).

AM smksyj: Secondary constructors like this() need to delegate to another constructor to work

AM linflus: 이 말은 반드시 그 호출하는게 기본생성자여야 하는건지

AM linflus: 그런 느낌은 아닌데

AM smksyj: 굳이 기본생성자는 아니어도 됨

AM linflus: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

AM smksyj: 근데

AM linflus: 같은문장

AM smksyj: 걔가 호출한 다른 Auxiliary Constructor가 (edited)

AM smksyj: 타고타고 가면

AM smksyj: 반드시 기본 생성자를 호출해야 할 걸

AM linflus: 결국 class body의 모든 문장을 언젠가 실행해야한다

AM linflus: 그런 맥락에서?

AM smksyj: Auxiliary constructors can contain more than a single invocation of another constructor, but their first statement must be said invocation.

AM linflus: 그런거면 이해가 감.. 하지만 모든 constructor가 반드시 직빵으로 primary constructor를 호출해야한다면 비효율적이란 느낌도 들고..

AM smksyj: 생성 시에 디폴트 생성자에 있는 변수는 초기화가 되어야 하지 싶음

AM linflus: 아 이 부분은 사실 좀 더 찾아보고 싶긴 하다 문법적인 면에서라기 보다는

AM linflus: 스칼라에서 생성자 호출할때에 대해서 좀 더 찾아봐야겠다는 생각이 듬

AM smksyj: 내가 이거에 관심 있는 이유는

AM smksyj: 이거 엄청 불편할 것 같은데

AM smksyj: 정말 이렇게 한 거 맞나 궁금해서 -_-;;

AM linflus: 이 부분은 영상과 별도로 내일 찾아보고 추가적으로 써야겠음 ㅋㅋ

AM linflus: 채널을 활용하길 잘했네.. 혼자 위키에 몇줄 대충 쓰는것보다

AM smksyj: http://stackoverflow.com/questions/10426146/constructors-in-scala-primary-auxiliary-default-primary

constructors in scala (primary/auxiliary/default primary)
A quite simple exercise from Cay Horstmann's book « Scala for the impatient » keeps puzzling me. It's about primary,auxiliary and default primary constructors : ex 5.10 : Consider the class

AM linflus: 쓰기도 편하고 공부하기에도 더 좋아

AM smksyj: every constructor invocation in Scala will end up eventually calling the primary constructor of the class.

AM linflus: 그렇군

AM linflus: 복잡하게 짜려다가 폭망

AM linflus: 할 수 있다

AM linflus: 뭐 그런 생각들이 머리를 스침

AM linflus: 아 난 이렇게 짜고싶은데 왜 안 돼!! 같은 그림이..

AM smksyj: 오늘도 3시는 넘는군

AM linflus: 어쩔 수 없음 10시까지 야근해서

AM smksyj: 슬슬 원준이가 나올 것 같은 분위기인데

AM smksyj: 오늘은 안 나오네

AM linflus: ㅋㅋㅋㅋㅋ

AM linflus: 난 자러가야지..

AM smksyj: 오늘도 고생하셨습니다

AM smksyj: ㄳㄳ

AM linflus: 좋은 피드백 ㄳㄳ

AM smksyj: 음... primary constructor의 val 변수의 초기화 때문에

AM smksyj: 저런 정책을 취했나보네

AM smksyj: val은 반드시 초기값이 들어있어야 하니까

AM syjsmk: joined #scala from an invitation by @smksyj

AM lyuha: 음...나오기 어려운

AM lyuha: 주제였습니다?

AM syjsmk: 헉 잠 안자는 사람들의 채널인가요

AM lyuha: 보통 다들 늦게 자죠...

PM jereneal: joined #scala

PM flyjsw: joined #scala
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:27:59
Processing time 0.2351 sec