[4:23 PM] linflus: ì˜¤ëŠ˜ì€ ìœ„í‚¤ ì •ë¦¬ê°€ ì• ë§¤í•˜ë©´ ì´ ì±„ë„ì— ë‚´ê°€ 오늘 ë˜ ë´¤ë‹¤ 무슨 ë‚´ìš©ì´ì—ˆë‹¤ ë‚´ìš© 요약ì´ë¼ë„ ì˜¬ë¦¬ê² ì니다. [4:23 PM] linflus: ë°ìº ì˜ ë…¸ì˜ˆ 스칼ë¼ì˜ 노예 ì„ ì–¸ì„ í•´ë†“ê³ ë„ˆë¬´ 나태한 ë…¸ì˜ˆì§ˆì„ í•˜ëŠ” 것 같아서 [4:23 PM] linflus: ... ----- Tuesday, May 20th, 2014 ----- [3:05 AM] linflus: ì˜¤ëŠ˜ì˜ Scala [3:05 AM] linflus: Martin Odersky(ì–´ë ¤ìš°ë¯€ë¡œ ì´í•˜ ìŠ¤ì¹¼ë¼ ì•„ì €ì”¨)ì˜ ê°•ì˜ë¥¼ 들었ì니다. [3:05 AM] linflus: ìŠ¤ì¹¼ë¼ ì•„ì €ì”¨ì˜ ê°•ì˜ëŠ” 매우 ì¹œì ˆ! ê±°ë¶ì´ì²˜ëŸ¼ ëŠë¦¬ê²Œ 들었ë”니 프로그래ë°ì˜ 기초를 ë°°ìš°ê³ ìžˆì—ˆì니다. [3:06 AM] linflus: 오늘 ë“¤ì€ ë‚´ìš©ì˜ í•µì‹¬ì€ evaluation [3:07 AM] smksyj: ì—‘ [3:07 AM] smksyj: 쓰다가 잘ëžë„¤ [3:08 AM] linflus: ? [3:08 AM] linflus: ì–¼ìŒ ë¨¹ìœ¼ëŸ¬.. [3:10 AM] linflus: Call by value는 함수 실행 ì‹œ argument를 ë¨¼ì € evaluate [3:11 AM] linflus: Call by nameì€ í•¨ìˆ˜ body?를 ë¨¼ì € 대체한 ë‹¤ìŒ ê°’ì„ evaluate [3:11 AM] linflus: ê°™ì€ í•¨ìˆ˜ì— ëŒ€í•´ Call by value와 Call by nameì„ ë‹¨ê³„ë³„ë¡œ íŠ¸ë ˆì´ìŠ¤í•˜ë©´ì„œ 몇단계를 거치는지 열심히 ì„¤ëª…í•˜ê¸°ì— ì´ê²Œ 프랙티컬한 측면ì—ì„œ 굉장히 ìœ ì˜ë¯¸í•œ 것ì¸ì§€ 조금 ê¶ê¸ˆí•´ì¡Œë‹¤ [3:12 AM] linflus: finite í• ê²½ìš°ì— ê·¸ë ‡ë‹¤ëŠ” ì´ì•¼ê¸° [3:12 AM] linflus: (=call by valueë¡œë„ terminate call by nameìœ¼ë¡œë„ terminateì¼ë•Œ) [3:13 AM] linflus: call by valueë¡œ terminateì¼ ê²½ìš° call by nameìœ¼ë¡œë„ terminateìž„ì´ ë³´ìž¥ë˜ì§€ë§Œ ê·¸ ë°˜ëŒ€ì˜ ê²½ìš°ëŠ” 보장ë˜ì§€ 않는다 [3:14 AM] linflus: 스칼ë¼ëŠ” 기본ì 으로 evaluationì— call by value를 쓴다 [3:15 AM] linflus: ì´ìœ 는 exponentially 효율ì ì¸ ê²½ìš°ê°€ ë” ë§Žì•„ì„œë¼ê³ .. [3:15 AM] linflus: 하지만 call by nameì„ ê°•ì œí• ìˆ˜ 있따 [3:16 AM] linflus: def sum(x:Int, y: *=>* Int) = x+y [3:16 AM] linflus: _(ì•— =>ì— bold를 ì 용했지만 í‹°ê°€ 잘 안 나잖아!)_ [3:17 AM] linflus: ì–´ì¨Œë“ => 를 사용하면 y는 call by name으로 evaluation í•˜ê² ë‹¤ëŠ” 뜻 [3:17 AM] linflus: ì£¼ê°„íšŒì˜ ì„¸ë¯¸ë‚˜ì—ì„œ ì–¼í• ë´¤ì§€ë§Œ ì´ë²ˆ ì˜ìƒì„ ë³´ë©´ì„œ 스칼ë¼ì—ì„œ 함수 ì •ì˜í•˜ëŠ” ë¬¸ë²•ì´ ì¢€ ë” ëˆˆì— ìµì—ˆë‹¤ [3:19 AM] linflus: ì•„ 맞다 call by valueê°€ ê¸°ë³¸ì¸ ì´ìœ ì¤‘ì— ìŠ¤ì¹¼ë¼ëŠ” imperative하게 사용ë 수 있어서 call by valueê°€ ê¸°ë³¸ì¸ ìª½ì´ ì‚¬ì´ë“œ ì´íŽ™íŠ¸ë¥¼ ê³ ë ¤í• ê²½ìš° ë” ìžì—°ìŠ¤ëŸ½ë‹¤(:question:)는 ì´ìœ ë„ ìžˆì—ˆìŒ [3:19 AM] linflus: ~ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ ë~ [3:19 AM] smksyj: ê³ ìƒí•˜ì…¨ìŠµë‹ˆë‹¤ [3:20 AM] linflus: ì• ë§¤í•œ ë‚´ìš© 지ì ì€ ê°ì‚¬í•©ë‹ˆë‹¤ [3:20 AM] linflus: 해주시면 ë‚´ì¼ ì›”ê¸‰ë„둑질 하면서 ë´„.. [3:20 AM] smksyj: 그럼 call-by-valueë¡œ í• ë•ŒëŠ” [3:20 AM] smksyj: ì–´ë–¤ ì‹ìœ¼ë¡œ 함수 ì •ì˜ë¥¼ 하면 ë˜ë‚˜ìš”? [3:20 AM] linflus: ?! [3:20 AM] linflus: 그냥 ì“°ë©´ call by value.. [3:20 AM] linflus: 그니까 ìœ„ì— sumì—ì„œ x는 call by value y는call by name [3:20 AM] linflus: ì´ ì–˜ê¸°ê°€ 아닌가 [3:21 AM] linflus: terminate ê´€ë ¨ëœ ì–˜ê¸´ê°€?! [3:21 AM] linflus: 그건 좀 ë” ê³µë¶€í•´ì•¼í•¨!!ã…‹ã…‹ã…‹ [3:24 AM] smksyj: ì•„ [3:24 AM] smksyj: ㅇㅇ [3:24 AM] smksyj: 그냥 ì“°ë©´ ë˜ëŠ”êµ° ----- Wednesday, May 21st, 2014 ----- [1:07 AM] smksyj: @linflus: 혹시 ì˜¤ëŠ˜ë„ ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ëŠ” 연재 하나요? [1:07 AM] linflus: 머리 ê°ê³ 와서 í• ë“¯? [1:07 AM] linflus: 머리 ê°ê³ 와서 ì˜ìƒì„ 본 ë’¤.. [1:07 AM] lyuha: ìžê³ ë‚´ì¼ ì•„ì¹¨ì— ë´ì•¼ì§€... [2:25 AM] linflus: ì•„ì§ ë‹¤ 안 봤지만 ì˜¤ëŠ˜ì˜ ë»˜ì†Œë¦¬ : ìŠ¤ì¹¼ë¼ ì•„ì €ì”¨ëŠ” x를 [iks]ë¼ê³ ë°œìŒí•œë‹¤. 그게 ë…ì¼ì‹ ë°œìŒì¸ë“¯??? [3:01 AM] linflus: 아주 ì§§ì€ ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ [3:01 AM] linflus: ì¡°ê±´ë¬¸ì´ ë‚˜ì™”ë‹¤. 사실 ì¡°ê±´ë¬¸ì€ ì–´ë–»ê²Œ ë³´ë©´ 매우 ìµìˆ™í•œ ë‚´ìš©ì¸ë°... [3:02 AM] linflus: ì•„ì €ì”¨ëŠ” ìžë°”ì˜ ì¡°ê±´ë¬¸ê³¼ 비슷하지만 statementê°€ ì•„ë‹Œ expressionì— ëŒ€í•´ ì‚¬ìš©í•œë‹¤ê³ ì„¤ëª… [3:03 AM] linflus: Boolean ê°’ì— ëŒ€í•´ì„œë„ ì„¤ëª…í–ˆë‹¤ [3:04 AM] linflus: ê·¸ë¦¬ê³ ë°˜ê°€ìš´(?) Short-circuit evaluationì— ëŒ€í•´ì„œë„.. ì´ê±´ 새싹 ìˆ˜ì—…í• ë•Œë„ ì¡°ê±´ë¬¸ 부분ì—ì„œ 하는 ë‚´ìš©ì´ì§€ë§Œ [3:05 AM] linflus: a || b ì—ì„œ aê°€ trueì¼ ê²½ìš° b ê°’ê³¼ ìƒê´€ì—†ì´ expression ê°’ì€ trueë¡œ evaluation í• ìˆ˜ 있기 ë•Œë¬¸ì— b ê°’ì„ evaluation 하지 ì•Šê³ [3:06 AM] linflus: 마찬가지로 a && bì—서는 aê°€ falseì¼ ê²½ìš° b ê°’ê³¼ ìƒê´€ì—†ì´ expression ê°’ì„ falseë¡œ evaluation í• ìˆ˜ 있기 ë•Œë¬¸ì— b ê°’ì„ evaluation 하지 ì•Šê³ [3:07 AM] linflus: 새싹 ìˆ˜ì—…í• ë•ŒëŠ” C언어 ì¡°ê±´ë¬¸ì„ ë‹¤ë£¨ëŠ” 부분ì´ë¼ true || a++ ì´ëŸ° ì‹ì˜ ë¬¸ìž¥ì„ ì£¼ê³ a++ê°€ evaluation ë˜ì§€ 않기 ë•Œë¬¸ì— a ê°’ì´ ì¦ê°€í•˜ì§€ 않는다는 걸 샘플로 보여주곤 í–ˆëŠ”ë° [3:08 AM] linflus: ì´ ê°•ì˜ëŠ” 스칼ë¼ë¡œ 알아보는 functional programmingì— ëŒ€í•œ ë‚´ìš©ì´ë¼ ì €ëŸ° mutable variableì€ ë‹¤ë£¨ì§€ 않는다 [3:10 AM] linflus: ëŒ€ì‹ ì— terminate ë˜ì§€ 않는 expressionì„ ë’¤ì— ë‘ê³ evaluation하지 않는 ê²ƒì„ ìƒ˜í”Œë¡œ 설명하ë”ë¼.. [3:10 AM] linflus: 조건문 다ìŒì— value definitionì— ëŒ€í•œ ë¶€ë¶„ì´ ë‚˜ì™”ë‹¤ [3:13 AM] linflus: ì–´ì œ 본 부분ì—서는 call by value와 call by name 즉, argumentì˜ evaluationì— ëŒ€í•œ ë‚´ìš©ì„ ë‹¤ë£¨ì—ˆëŠ”ë° value definition 부분ì—서는 definitionì— ëŒ€í•œ ê°™ì€ ì ‘ê·¼ì„ ë‹¤ë£¨ê³ ìžˆë‹¤ [3:14 AM] linflus: def는 by name / valì€ by value [3:16 AM] linflus: val x = sum(2, 3) //ì´ ë•Œ sumì€ ë‘ argumentì˜ í•©ì„ ë°˜í™˜í•˜ëŠ” function [3:16 AM] linflus: ì´ë¼ë©´ valì„ ì‚¬ìš©í•œ definitionì€ by valueì´ë¯€ë¡œ val x = 5ë¡œ evaluation ëœë‹¤ [3:16 AM] linflus: terminateë˜ì§€ 않는 경우를 ìƒê°í•´ë³´ë©´ [3:16 AM] linflus: def loop: Boolean = loop [3:17 AM] linflus: 와 ê°™ì€ terminate ë˜ì§€ 않는 function loopê°€ ìžˆì„ ë•Œ [3:17 AM] linflus: def x = loop [3:17 AM] linflus: ë¼ê³ ì •ì˜í•˜ë©´ by name으로 ì •ì˜í•˜ê¸° ë•Œë¬¸ì— x를 evaluation하지 않는다 [3:18 AM] linflus: 하지만 val x = loop ë¼ê³ ì •ì˜í•˜ë©´ by valueë¡œ ì •ì˜í•˜ê¸° ë•Œë¬¸ì— x를 evaluateí•˜ë ¤ê³ í•˜ê³ infinite loopì— ë¹ ì§€ê²Œ ëœë‹¤ [3:19 AM] linflus: ìŠ¤ì¹¼ë¼ ì•„ì €ì”¨ê°€ ì¹œì ˆížˆ ì‰˜ì— í•´ë‹¹ expressionì„ ì³ì„œ 와장창... 뻗는 ëª¨ìŠµì„ ë³´ì—¬ì£¼ì‹¬ [3:19 AM] linflus: ì˜ìƒ 후반부ì—는 퀴즈 ë‚´ê³ ê·¸ê±° 설명하는 게 ê±°ì˜ ì „ë¶€ì˜€ëŠ”ë° ì‚¬ì‹¤ ë˜ê²Œ 간단한거 [3:19 AM] linflus: and(x, y) == x && y [3:20 AM] linflus: or(x, y) == x || y [3:20 AM] linflus: ê°€ 성립ë˜ëŠ” and와 or functionì„ &&, || ì—°ì‚°ìž ì—†ì´ ì •ì˜í•´ë³´ë¼ëŠ” 것ì´ë‹¤ [3:20 AM] linflus: 오늘 조건문 ë°°ì› ìœ¼ë‹ˆê¹Œ 그냥 그거 ì“°ë©´ ëœë‹¤ [3:21 AM] linflus: ê·¼ë° ì´ ë‚´ìš©ì„ êµ³ì´ ì“°ëŠ” ì´ìœ ê°€ [3:21 AM] linflus: def and(x: Boolean, y: Boolean) = if(x) y else false [3:22 AM] linflus: def or(x: Boolean, y: Boolean) = if(x) true else y [3:22 AM] linflus: ì´ë ‡ê²Œ ì •ì˜í•˜ë©´ 트랩카드ë¼ì„œ [3:23 AM] linflus: 왜ëƒë©´ ì € 경우엔 yê°€ call by valueë¼ì„œ short circuit evaluation 하지 않는다 [3:23 AM] linflus: def and(x: Boolean, y: => Boolean) = if(x) y else false [3:23 AM] linflus: def or(x: Boolean, y: => Boolean) = if(x) true else y [3:23 AM] linflus: 위와 ê°™ì´ ë‘번째 argument yì— ëŒ€í•´ call by nameì„ ê°•ì œí•´ì•¼ 한다 [3:24 AM] linflus: ì§ì ‘ ìŠ¤ì¹¼ë¼ ì½”ë“œë¥¼ 짜게 ë˜ë©´ ì´ëŸ° ì ì„ ê°„ê³¼í•´ì„œ ë§Žì€ ì‹œê°„ì„ ì†Œë¹„í•˜ê²Œ ë˜ë¦¬ë¼ëŠ” 불길한 예ê°ê³¼ 함께 ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ ëë [3:25 AM] linflus: ê·¸ë¦¬ê³ ì˜¤ëŠ˜ì˜ ë»˜ì†Œë¦¬ 2 : ì´ë²ˆíŽ¸ì€ ì˜ìžë§‰ì´ 없어서 당황과 분노 ----- Thursday, May 22nd, 2014 ----- [2:26 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ [2:27 AM] linflus: 는 간단한 ì˜ˆì œ 구현과 ê·¸ì— ëŒ€í•œ 설명ì´ë¼ì„œ IDE ì…‹íŒ…ì„ í–ˆë‹¤ [2:27 AM] linflus: ë‚œ Intellij를 사용하기로 함 [2:28 AM] linflus: ì˜ˆì œëŠ” newton's method를 ì´ìš©í•˜ì—¬ ì œê³±ê·¼ 구하는 함수 ë§Œë“¤ê¸°ì˜€ìŒ [2:28 AM] linflus: newton's method나 ì œê³±ê·¼ 구하기가 스칼ë¼ëž‘ 딱히 ìƒê´€ì´ 없으니 ì´ ë¶€ë¶„ ì„¤ëª…ì€ íŒ¨ìŠ¤ [2:28 AM] linflus: ê¶ê¸ˆí•˜ë‹¤ë©´ 검색 í˜¹ì€ ìˆ˜ì¹˜í•´ì„ê³¼ 그래픽스가 ì—¬ëŸ¬ë¶„ì„ í™˜ì˜ [2:30 AM] linflus: 첫 ì˜ìƒì€ 대체로 ê°™ì´ êµ¬í˜„í•´ë³´ëŠ” 시간ì´ë¼ í¬ê²Œ ì ì„ ê²ƒì´ ì—†ë‹¤... [2:30 AM] linflus: ì œê³±ê·¼ 구하는 함수를 재귀ì 으로 호출하게 ë˜ëŠ”ë° [2:31 AM] linflus: ê·¸ë™ì•ˆ ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ì— ì“´ 함수들 ë³´ë©´ 바로 ìœ„ì— ì¼ë˜ [2:31 AM] linflus: def and(x: Boolean, y: => Boolean) = if(x) y else false [2:31 AM] linflus: 만 하ë”ë¼ë„ return typeì„ ëª…ì‹œì 으로 ì •ì˜í•´ì£¼ê³ 있지 않다 [2:31 AM] linflus: 보통 return typeì€ optional [2:31 AM] linflus: 하지만 재귀ì 으로 호출하는 í•¨ìˆ˜ì˜ ê²½ìš° 명시ì return typeì˜ ì •ì˜ê°€ 필요하다 [2:36 AM] linflus: ì´ ë¶€ë¶„ì— ëŒ€í•œ ì„¤ëª…ì€ ë‚˜ì¤‘ì— ìŠ¤ì¹¼ë¼ì˜ type inferenceì— ëŒ€í•´ ì°¾ì•„ë³´ê³ ì¢€ ë” ìžì„¸ížˆ 쓸 ì˜ˆì • [2:37 AM] linflus: ê·¸ë¦¬ê³ ë°”ë¡œ ë‹¤ìŒ ì˜ìƒì—서는 ì´ë¯¸ ì§°ë˜ ì œê³±ê·¼ 구하는 함수를 좀 ë” ê¹”ë”하게 바꾸면서 blockê³¼ scopeì— ì´ì•¼ê¸° 함 [2:38 AM] linflus: blockì€ ì•„ë§ˆ ë”°ë¡œ 설명 듣지 ì•Šì•„ë„ ë‹¤ë“¤ 코드 훑으면 ê°ìœ¼ë¡œ íŒŒì•…í• ìˆ˜ 있는 그런 부분 [2:39 AM] linflus: { ... } 처럼 중괄호로 ê°ì‹¸ì¤˜ì„œ 만들 수 있다 [2:42 AM] linflus: val x = 1 val block = { val x = 2; val y = 1; x+y } + x [2:44 AM] linflus: block 내부ì—ì„œ ì •ì˜ëœ symbolì€ block 외부ì—ì„œ ì ‘ê·¼í• ìˆ˜ ì—†ê³ [2:45 AM] linflus: symbolì´ ê²¹ì¹ ê²½ìš° block ë‚´ë¶€ì˜ ì •ì˜ê°€ ìš°ì„ ì´ë‹¤ [2:45 AM] linflus: 즉, 위 코드ì—ì„œ block ë°–ì—ì„œ yì— ì ‘ê·¼í•˜ëŠ” ê²ƒì€ ë¶ˆê°€ëŠ¥ [2:46 AM] linflus: ê·¸ë¦¬ê³ blockì˜ evaluation ê°’ì€ 4 [2:46 AM] linflus: =(2+1)+1 [2:46 AM] linflus: ëë¶€ë¶„ì— ì„¸ë¯¸ì½œë¡ ì–˜ê¸° ë‚˜ì˜¤ëŠ”ë° ìŠ¤ì¹¼ë¼ì—ì„œ ì‹ ëì˜ ì„¸ë¯¸ì½œë¡ ì€ optionalì´ë‹¤ [2:47 AM] linflus: í•„ìˆ˜ì¸ ê²½ìš°ëŠ” í•œ ì¤„ì— ì—¬ëŸ¬ ì‹ì„ 함께 쓸 경우 [2:47 AM] linflus: ìœ„ì— ì“´ val x = 2; val y = 1; x+y 처럼 [2:48 AM] linflus: ì„¸ë¯¸ì½œë¡ ì´ í•„ìˆ˜ê°€ 아니ë¼ì„œ í•˜ë‚˜ì˜ ê¸´ ì‹ì„ ì—¬ëŸ¬ì¤„ì— ë‚˜ëˆ ì¼ì„ ë•Œ ì›í•˜ëŠ”대로 evaluation ë˜ì§€ ì•Šì„ ìˆ˜ 있다 [2:48 AM] linflus: expr1 + expr2 [2:49 AM] linflus: ì¼ ê²½ìš° ë‘ ì‹ì„ ê°ê° evaluation 하는 경우가 ìƒê¹€ [2:49 AM] linflus: ì´ ë•Œ 쓸 수 있는 ë°©ë²•ì€ [2:49 AM] linflus: (expr1 + expr2) [2:49 AM] linflus: 괄호 짱짱맨b [2:49 AM] linflus: í˜¹ì€ [2:50 AM] linflus: expr1 + expr2 [2:50 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ëŠ” ë [2:50 AM] linflus: ì•„ ì˜¤ëŠ˜ì€ ì„¸ì‹œì— ìž˜ 수 있다... [2:54 AM] lyuha: ë랄까 여러가지 ì§¬ë½•ëœ ëŠë‚Œ... [2:56 AM] linflus: 스칼ë¼ê°€? [2:56 AM] linflus: 아니면 ì ì–´ë‘” ê°•ì˜ ë‚´ìš©ì´? [2:56 AM] lyuha: 스칼ë¼ìš” [2:57 AM] linflus: pure functional languageê°€ 아니ë¼ì„œ ê·¸ë ‡ê²Œ ëŠë¼ëŠ” 것ì¼ì§€ë„.. [2:57 AM] linflus: 하지만 ê°•ì˜ ì˜ìƒì€ 스칼ë¼ë¡œ 배워보는 functional programmingì´ë¼ functionalí•œ ì¸¡ë©´ì— focusingí•˜ê³ ìžˆë‹¤ê³ ìƒê°í•˜ëŠ”ë°.. [2:58 AM] linflus: 사실 ì´ê±´ 딴소리지만 ì§„ì •í•œ ì§¬ë½•ì˜ ë§›ì€ rubyì—ì„œ ëŠë‚„ 수 있습니다 [2:58 AM] linflus: (ë¼ê³ ê°œì¸ì 으로 ìƒê°...) ----- Friday, May 23rd, 2014 ----- [3:05 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ [3:05 AM] linflus: 는 Tail recursion [3:07 AM] linflus: 오 [3:08 AM] linflus: Tail recursion ê´€ë ¨í•´ì„œ 위키피디아를 한번 ì°¾ì•„ë´¤ëŠ”ë° í•œêµì–´ 페ì´ì§€ê°€ 없다 [3:08 AM] linflus: ì—ì‹œ ê²€ìƒ‰ì€ í•œêµì–´ë¡œ 하면 안ë¼... ì´ê±´ ì´ ì±„ë„ ì£¼ì œëž‘ì€ ë‹¤ë¥´ì§€ë§Œ 어쩌면 ë‚ ê²€ìƒ‰ëŒ€í–‰ìžë¡œ ì¨ë¨¹ëŠ” ë¶„ë“¤ì€ í‰ì†Œì— 네ì´ë²„ì— í•œê¸€ë¡œ 검색해서 ì•„ë¬´ê²ƒë„ ëª» 찾는 걸지ë„... [3:12 AM] linflus: í ì´ê²Œ 사실 ë‚œ ë˜ê²Œ 쓸 게 ì—†ë‹¤ê³ ìƒê°í–ˆëŠ”ë° ì™œëƒë©´ Tail recursionì´ ìŠ¤ì¹¼ë¼ì—만 있는 ê²ƒë„ ì•„ë‹ˆê³ í•´ì„œ [3:12 AM] linflus: 하지만 ìƒê°í•´ë³´ë©´ ì´ ì„¸ìƒì— ì˜¤ì§ ìŠ¤ì¹¼ë¼ì—만 있는게 몇개나 ëœë‹¤ê³ .. [3:12 AM] linflus: 아무튼 그런 ì˜ë¯¸ì—ì„œ 간단히 Tail recursion ì´ì•¼ê¸° [3:14 AM] linflus: ì´ê±° ê´€ë ¨í•´ì„œëŠ” 얼마 ì „ì— #offtopic쪽ì—ì„œë„ ì–˜ê¸° 했었는ë°.. [3:15 AM] linflus: 함수 호출하면 스íƒì— parameter 등 함수 호출과 ê´€ë ¨ëœ ë°ì´í„°ë¥¼ 쌓는다 [3:16 AM] linflus: 리턴하면 ìŒ“ì•˜ë˜ ë°ì´í„°ë¥¼ ë¹¼ê³ [3:16 AM] linflus: ë¼ê³ ë§í•˜ê³ 보니 ìŒ“ê³ ë¹¼ê³ ì´ ë‹¨ì–´ê°€ 마ìŒì— 안들지만 아무튼 지금 í¬ê²Œ 중요한 게 아니니 패스 [3:18 AM] linflus: 만약 a 함수 실행 ì¤‘ì— b 함수를 호출하면 a ë°ì´í„°ê°€ 스íƒì— 쌓였다가 b í˜¸ì¶œí• ë•Œ b ë°ì´í„°ë¥¼ 스íƒì— ìŒ“ê³ b 리턴ë˜ë©´ b ë°ì´í„°ë¥¼ ë¹¼ê³ a 리턴ë˜ë©´ a ë°ì´í„°ë¥¼ ë¹¼ê³ [3:19 AM] linflus: ê·¼ë° ìž¬ê·€í•¨ìˆ˜ë©´ ì¢…ë£Œì¡°ê±´ì— ë„달하기 ì „ê¹Œì§€ ë¦¬í„´ì´ ì•ˆë˜ê³ 종료조건 ë„달해야지만 리턴리턴리턴ë˜ë‹ˆê¹Œ ë°ì´í„°ë¥¼ ê³„ì† ìŒ“ê¸°ë§Œí•´ì„œ ìŠ¤íƒ ìž¡ì•„ë¨¹ìŒ [3:25 AM] linflus: ì´ê±¸ 재귀호출 ì´í›„ 다른 ì—°ì‚°ì´ ì—†ë„ë¡ tail recursive하게 짜면 스íƒí”„ë ˆìž„ì„ ê²ë‚´ 양산하지 ì•Šê³ ìž¬í™œìš©í•œë‹¤ [3:25 AM] linflus: 재귀 호출 ì´í›„ 다른 ì—°ì‚°ì´ ì—†ë„ë¡ ì´ëž€ ë§ì€ 사실 ì˜ˆì œë¥¼ ë³´ë©´ í•œíì— ì•Œ 수 있다 [3:25 AM] linflus: ìž¬ê·€ê³„ì˜ êµë¯¼ì˜ˆì œ factorial ë‚˜ì™€ë¼ ì–! [3:26 AM] linflus: def factorial(n: Int):Int = if(n == 0) 1 else n * factorial(n-1) [3:27 AM] linflus: ì´ ê²½ìš° 종료조건 ë„달하기 ì´ì „ì— factorial(n-1)ì„ ìž¬ê·€ì 으로 호출한 ë’¤ nê³¼ 곱하는 ì—°ì‚°ì´ í•„ìš”í•¨ => tail recursive하지 ì•ŠìŒ [3:29 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) } [3:30 AM] linflus: ì´ ê²½ìš° sub(n*result, n-1)ì„ ìž¬ê·€ì 으로 호출한 ë’¤ 다른 ì—°ì‚°ì„ ìˆ˜í–‰í•˜ì§€ ì•ŠìŒ => tail recursive [3:30 AM] linflus: 사실 ì˜ìƒì„ 하나 ë”볼까 했었지만 네시엔 ìžì•¼ê² ê¸°ì— ë.... [12:39 PM] lyuha: tail recursive 반복ì ì¸ í”„ë¡œì„¸ìŠ¤ë¡œ 진행하는 재귀함수 ì¸ê±´ê°€ìš”.? ----- Saturday, May 24th, 2014 ----- [3:28 AM] linflus: ì˜¤ëŠ˜ì€ ctrlcv ëë‚˜ê³ ëŠ¦ê²Œ 들어와서 [3:28 AM] linflus: 스킵하긴 ëí•˜ê³ í•´ì„œ [3:28 AM] linflus: http://scalatutorials.com/tour/ Interactive Scala Tutorial [3:28 AM] linflus: ì´ê±¸ ì‰ í›‘ìœ¼ë©´ì„œ ë”°ë¼ê° [3:28 AM] linflus: 지금 ë³´ê³ ìžˆëŠ” coursera ê°•ì˜ëŠ” ìŠ¤ì¹¼ë¼ ì–¸ì–´ 문법 ê°•ì˜ê°€ ì•„ë‹ˆë¼ ìŠ¤ì¹¼ë¼ë¡œ 설명하는 함수형 í”„ë¡œê·¸ëž˜ë° ì´ë¼ì„œ [3:29 AM] linflus: ë‚´ìš©ì— í•¨ìˆ˜í˜• í”„ë¡œê·¸ëž˜ë° ê°œë…ë„ ë§Žì´ ì„žì—¬ìžˆê³ ìŠ¤ì¹¼ë¼ë„ 굉장히 함수형 í”„ë¡œê·¸ëž˜ë° ì–¸ì–´ìŠ¤ëŸ½ê²Œ ì“°ê³ ìžˆëŠ”ë° [3:29 AM] linflus: ì € íŠœí† ë¦¬ì–¼ì€ ê·¸ëŸ°ê±° 없어서 새삼 ì•„ ê·¸ë ‡êµ° ë‚´ê°€ ë“£ê³ ìžˆëŠ” ê°•ì˜ê°€ 함수형 í”„ë¡œê·¸ëž˜ë° ê°•ì˜ì˜€êµ° 하는 걸 ê¹¨ë‹¬ìŒ ----- Sunday, May 25th, 2014 ----- [4:51 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ [4:52 AM] linflus: 는 Higher order functionì— ëŒ€í•œ ë‚´ìš© [4:53 AM] linflus: ì•„ì €ì”¨ ë§ë¡œëŠ” 함수형 프로그래ë°ì—ì„œ 중요한 ê°œë…ì´ë¼ê³ 한다 [4:54 AM] linflus: 대충 검색해보면 csì—서만 ì“°ì´ëŠ” 용어는 ì•„ë‹ˆê³ ì›ëž˜ mathematicsì—ì„œ ì“°ì´ë˜ ìš©ì–´ì¸ë“¯ [4:54 AM] linflus: ì•„ [4:55 AM] linflus: ê·¸ëŸ¬ê³ ë³´ë‹ˆ 당연히 그런듯 [4:55 AM] linflus: order란 ë§ì´ í•œêµì–´ë¡œ 몇차 í• ë•Œ ì°¨ì˜€ë˜ ê²ƒ ê°™ì€ë°?!?! [4:56 AM] linflus: 그럼 í•œêµì–´ë¡œ ê³ ì°¨í•¨ìˆ˜ëž€ 뜻ì¸ê°€? [4:57 AM] lyuha: 대충... [4:57 AM] lyuha: 그런거같네요 [4:57 AM] linflus: ã…‹ã…‹ã…‹ì•„ 그런거였네 [4:58 AM] linflus: 암튼 ë‹¤ìŒ ë‘ ì¡°ê±´ 중 하나를 만족하는 경우 higher order function [4:58 AM] linflus: 1. 함수를 parameterë¡œ 받거나 [4:59 AM] linflus: 2. 함수를 return 하거나 [5:01 AM] linflus: í¬.. 사실 ë‚œ math하는 ì‚¬ëžŒì´ ì•„ë‹ˆë‹ˆê¹ higher order function 보다는 first class function 얘기를 하는 게 ì¢‹ì„ ê²ƒ 같다 [5:02 AM] linflus: first class functionì€ functionì„ first class objectë¡œ ì·¨ê¸‰í•˜ê² ë‹¤ëŠ”ê±´ë° [5:02 AM] linflus: í•™êµ ì»¤ë¦¬í˜ëŸ¼ ë”°ë¼ì„œ C C++ Java 대충대충 짜다가 Javascript ì±… 보기 ì‹œìž‘í•˜ê³ ì²˜ìŒì— ë˜ê²Œ 골때리는 ë¶€ë¶„ì´ ì—¬ê¸°ì˜€ë˜ ê²ƒ 같다 [5:02 AM] linflus: ì´ê²Œ ë§ë„ ìƒì†Œí•˜ê³ ë˜ ë²ˆì—하면 ì¼ê¸‰ê°ì²´ ì´ëŸ° ì‹ì´ ë¼ì„œ... [5:03 AM] linflus: ì¼ê¸‰ê°ì²´... í 좀... ë”ê°€ 급ì´ë¼ëŠ” ë§ì´ 갖는 ê·¸ ëŠë‚Œì´.....í .... [5:03 AM] lyuha: ì•„.. [5:03 AM] lyuha: ì¼ê¸‰ê°ì²´ 하면 [5:03 AM] lyuha: ëŠë‚Œ ì´ìƒí•˜ê³ ë”ê°€ [5:04 AM] linflus: 하지만 사실 심플하게 ìƒê°í•˜ë©´ 그냥 functionì„ ë‹¤ë¥¸ functionì˜ argumentë¡œ 넘겨줄 ìˆ˜ë„ ìžˆê³ return 값으로 쓸 ìˆ˜ë„ ìžˆë‹¤ [5:04 AM] linflus: 는 것. 찾아보면 다들 ì´ë ‡ê²Œ 설명하지만 ì½ê³ 나면 그래서 왜 ì´ê²Œ ì¼ê¸‰ì¸ì§€ ì´í•´í• 수 ì—†ê¸°ë•Œë¬¸ì— ì²˜ìŒì—” ë‚œê° [5:04 AM] linflus: 번ì—ì´ ìž˜ëª»í–ˆë„¤ [5:04 AM] lyuha: first class object ë¼ëŠ” ê±´ [5:05 AM] lyuha: ì¸ìžì™€ 리턴값으로 쓸수 있다 ì •ë„ì¸ê°€ìš”. [5:05 AM] linflus: ì•— ì •ì˜ë¥¼ ê·¸ë ‡ê²Œ 내리면 좀 í—ˆì ‘í•œ ì •ì˜ê°€ ë˜ëŠ”듯 [5:05 AM] linflus: c c++ javaì—ì„œ í”히 ì½”ë”©í•˜ë˜ ë°©ì‹ê³¼ì˜ ì°¨ì´ë¼ì„œ ê·¸ë ‡ê²Œ ì–˜ê¸°í•œê²ƒë¿ [5:08 AM] linflus: 틀린 ë§ì´ë¼ê¸°ë³´ë‹¨ ìŒ... first class objectê°€ ë다 í•˜ë ¤ë©´ 사실 [5:08 AM] linflus: ì¸ìžì™€ 리턴값으로 쓸 수 있다는 얘기 한줄만 하는 것보다는 ~ class object 얘기 ìžì²´ë¥¼ 하는게 ì¢‹ì„ ê²ƒ ê°™ê¸°ë„ í•˜ê³ .. [5:09 AM] lyuha: ë”ê°€ ì¡°ê±´ 4개가 ìžˆëŠ”ë° [5:09 AM] lyuha: 그중 2개가 ì €ê²ƒ ì´ê¸´ 하네요 [5:12 AM] linflus: í¬.. 그걸 다 묶어서 ê¹”ë”하게 ì •ì˜í•˜ëŠ” 게 ë” ì¢‹ì€ë° 대체로 ì•„ëž˜ì˜ ì¡°ê±´ì„ ë§Œì¡±í•˜ë©´ first class object다 ì´ëŸ°ì‹ìœ¼ë¡œ 설명하네.. [5:13 AM] linflus: 위키피디아를 ë³´ë©´ ì• ì´ˆì— ì²˜ìŒ ê·¸ ê°œë…ì„ ì–¸ê¸‰í•œ ì‚¬ëžŒì´ [5:13 AM] lyuha: 위키피디아ì—ì„œ ì •ì˜í•œê±´ 2개는 ë³´ìžë§ˆìž ê°ì´ 안 오네요. [5:13 AM] linflus: 알골ì—ì„œì˜ ê°ì²´ë¥¼ 구분지어 ë§í•˜ë©´ì„œ 나온 ê±°ë¼ ê·¸ëŸ°ì§€ [5:14 AM] linflus: ì—„ë°€í•˜ê³ ê¹”ë”í•œ 그런 ëŠë‚Œì€ 기대하면 안ë 것 같기ë„... [5:15 AM] linflus: ì´ê²Œ 어쩌면 수학ìŸì´ê°€ ë§Œë“ ë§ì´ ì•„ë‹ˆë¼ ì»´í“¨í„°ìŸì´ê°€ ë§Œë“ ë§ì´ë¼ ê·¸ëŸ°ê²ƒì´ ì•„ë‹ê¹Œí•˜ëŠ” 슬픈 ì¶”ì¸¡ì„ ìž ì‹œ 했으나 찾아보니 그는 수학ìŸì´ì˜€ì니다 [5:15 AM] linflus: ê°ì´ 안 온다는 2개는 어떤건가요? [5:17 AM] lyuha: í•œêµì–´ ìœ„í‚¤ì— ì„¤ëª…ëœ ë³€ìˆ˜ë‚˜ ë°ì´í„° êµ¬ì¡°ì•ˆì— ë‹´ì„ ìˆ˜ 있다. í• ë‹¹ì— ì‚¬ìš©ëœ ì´ë¦„ê³¼ ê´€ê³„ì—†ì´ ê³ ìœ í•œ êµ¬ë³„ì´ ê°€ëŠ¥í•˜ë‹¤. [5:19 AM] linflus: ì¼ë‹¨ 변수나 ë°ì´í„° êµ¬ì¡°í•œì— ë‹´ì„ ìˆ˜ 있다 [5:19 AM] linflus: ì´ê±´ ë§ ê·¸ëŒ€ë¡œì˜ˆìš” [5:19 AM] lyuha: assigned to a variable [5:19 AM] lyuha: ì´ ì˜ë¯¸ì¸ê°€ìš” [5:19 AM] linflus: 네 [5:19 AM] linflus: ì´ê²ƒë„ 번ì—ì´ ìž˜ëª»í–ˆë‚˜ [5:19 AM] linflus: ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ [5:19 AM] lyuha: ã…‹ã…‹ã…‹ã…‹ã…‹ [5:19 AM] lyuha: ì•ˆì— ë‹´ì„ ìˆ˜ 있다보단 [5:19 AM] lyuha: ì•ˆì— ë‹´ì„ ìˆ˜ 있다.... [5:19 AM] lyuha: ë”ê°€ 맞는 번ì—ì´ê¸´í•œë° [5:20 AM] lyuha: ë´¤ì„때는 ë”지 ê³ ë¯¼í–ˆë„¤ìš” [5:20 AM] linflus: í• ë‹¹ì— ì‚¬ìš©ëœ ì´ë¦„ê³¼ ê´€ê³„ì—†ì´ ê³ ìœ í•œ êµ¬ë³„ì´ ê°€ëŠ¥í•˜ë‹¤ ì´ê±´ ë˜ ë²ˆì—한거지... [5:21 AM] lyuha: ëª¨ë¥´ê² ì–´ìš”...그건... [5:21 AM] linflus: 딱히 ì˜ë¬¸ ë¬¸ì„œë“¤ì— ì •ì˜ë‚´ë¦´ë•Œ 그런 í‘œí˜„ì€ ì•ˆ 쓰는 것 ê°™ì€ë°.. [5:21 AM] linflus: ë” ì°¾ì•„ë³´ê³ ë¬´ìŠ¨ ì˜ë„ì¸ì§€ 알것같으면 여기 ë©˜ì…˜ê±¸ê³ ì“¸ê²Œìš” [5:22 AM] linflus: ì •ì˜í• ë•Œ ê¼ í•„ìš”í•œ ì¡°ê±´ì´ë¼ê¸°ë³´ë‹¤ ê·¸ 페ì´ì§€ ì •ë¦¬í•˜ë˜ ì‚¬ëžŒì´ ë¶€ì—°í•´ì„œ ì“´ 것 ê°™ì€ ëŠë‚Œì´ë¼ [5:22 AM] lyuha: 네.. [5:22 AM] linflus: 아무튼 다시 ì›ëž˜ëŒ€ë¡œ ëŒì•„가서 [5:23 AM] linflus: ìžë°”스í¬ë¦½íŠ¸ì—ì„œ í”히 first class functionì„ ëŠê»´ë³´ê¸° ì¢‹ì€ ê²½ìš°ê°€ 콜백함수 parameterë¡œ 넘겨줄때 [5:23 AM] linflus: c만 ì§œë˜ ì‚¬ëžŒí•œí…ŒëŠ” 함수í¬ì¸í„° 얘기를 하게 ë¨ [5:25 AM] linflus: ê°•ì˜ì—서는 간단한 ì˜ˆì œë¥¼ ì‚¬ìš©í–ˆëŠ”ë° [5:25 AM] linflus: def sumInts(a: Int, b: Int): Int = if(a>b) 0 else a + sumInts(a+1, b) [5:26 AM] linflus: ì´ê²Œ a와 b 사ì´ì— 있는 ì •ìˆ˜ë¥¼ 다 ë”í•´ì„œ 리턴하는 함수 [5:26 AM] linflus: ì´ë•Œ a와 b사ì´ì— 있는 ì •ìˆ˜ë“¤ì„ ëª¨ë‘ 3ì œê³±í•œ 채 ë”í•˜ê³ ì‹¶ìœ¼ë©´ [5:27 AM] linflus: `def cube(x: Int):Int = x * x * x` (edited) [5:27 AM] linflus: 오.. í¬ ìˆ˜ì •í–ˆë‹¤ (edited) [5:28 AM] linflus: def sumCubes(a: Int, b: Int):Int = if(a>b) 0 else cube(a) + subCubes(a+1, b) [5:28 AM] linflus: ê·¼ë° functionì„ parameterë¡œ 넘겨줄 수 있으니 êµ³ì´ ë§¤ë²ˆ ì´ë ‡ê²Œ 만들 필요가 ì—†ìŒ [5:29 AM] linflus: def sum(f: Int => Int, a: Int, b: Int):Int = if(a>b) 0 else f(a) + sum(f, a+1, b) [5:29 AM] linflus: def id(x:Int): Int = x [5:29 AM] linflus: `def cube(x:Int):Int = x * x * x` [5:29 AM] linflus: í•´ì„œ [5:29 AM] linflus: sum(id, a, b) [5:29 AM] linflus: sum(cube, a, b) [5:29 AM] linflus: ì´ëŸ°ì‹ìœ¼ë¡œ 호출해주면 ëœë‹¤ [5:30 AM] linflus: f: Int => Int ì´ ë¶€ë¶„ì€ fë¼ëŠ” functionì´ Int ê°’ 하나를 parameterë¡œ 받아 Int를 반환하는 함수ë¼ëŠ” 뜻 [5:30 AM] linflus: ì´ê±¸ ì´ì œ ìµëª…함수를 ì“°ë©´ [5:31 AM] linflus: sum(x => x, a, b) [5:31 AM] linflus: `sum(x => x * x * x, a, b)` [5:31 AM] linflus: ì´ë ‡ê²Œ 쓸 수 있다. id, cubeê°™ì€ í•¨ìˆ˜ ì •ì˜ë„ í•„ìš” ì—†ìŒ [5:31 AM] linflus: parameterë¡œ 한번 ë„˜ê¸°ê³ ë§ functionì´ë¼ë©´ ìµëª…으로 쓰는게 나ì€ê²ƒê°™ë‹¤ [5:32 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ëŠ” ë (edited) [5:32 AM] linflus: ë‚´ì¼ ë³¼ ì˜ìƒì´ 기대ëœë‹¤. ì£¼ì œê°€ Curryingì´ë¼ì„œ... [5:32 AM] linflus: ì „ì— ë¶„ëª… ì½ì–´ë´¤ëŠ”ë° ë” ë§ì¸ì§€ ê¸°ì–µì´ ì•ˆ 나는 Currying...... [5:32 AM] lyuha: ì–¸ì œë‚˜ [5:33 AM] lyuha: 올ë¼ì˜¤ë©´ ë‘ê·¼ë‘근하면서 보게ë˜ëŠ” #scala [5:33 AM] linflus: 늦게까지 안 ìžë„¤ìš”!! [5:33 AM] linflus: ê·¸ë‚˜ì €ë‚˜ ã…‹ã…‹ [5:33 AM] lyuha: 뜨ë”... [5:33 AM] lyuha: ê³¼ì œ 한다는 ì´ìœ ë¡œ 안 ìžë‹¤ê°€ [5:33 AM] lyuha: ê³¼ì œ 진행ë„는 0.... [5:34 AM] linflus: ã… ã… ã… ã… ã… ã… ã… [5:34 AM] linflus: ê³¼ì œ 시즌.. [5:34 AM] lyuha: ê³¼ì œëŠ” [5:34 AM] lyuha: ì‹œì¦Œì´ ì—†ìŠµë‹ˆë‹¤ [5:34 AM] lyuha: 안 나오는 ì‹œì¦Œì´ ì¡´ìž¬í• ë¿ì´ì£ [5:34 AM] linflus: ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ [5:34 AM] lyuha: ã…‹ã…‹ã…‹ã…‹..... [5:34 AM] linflus: 그런가... [5:34 AM] linflus: 하긴 플ì ì´ ì‹œì¦Œì´ê³ ê³¼ì œëŠ” 조금씩 ìžì£¼ ë‚˜ì™”ë˜ ê²ƒ 같네요 [5:34 AM] lyuha: 시험 기간 / 방학기간.... [5:34 AM] linflus: 하지만 진짜 ì‹œì¦Œì´ ì—†ëŠ” ê²ƒì€ ì¶œê·¼ìž…ë‹ˆë‹¤.......ë§ [5:35 AM] lyuha: ...ì•„.... [5:35 AM] lyuha: ê°„ì ‘ì²´í—˜ 중ì´ì£ ... [5:35 AM] lyuha: 시즌없는 ì§ìž¥... [5:35 AM] linflus: í•™ë¶€ì‹œì ˆì— ë” ë§Žì€ ê¿€ì„ ë¹¨ê³ ì¡¸ì—…í•˜ê¸¸ ë°”ë¼ìš”.. [5:35 AM] lyuha: ì¡¸ì—…ì´ ì•„ì§ ë©€ë‹µë‹ˆë‹¤. ì œ 머릿ì†ì—ì„ [5:35 AM] lyuha: ì‹¤ì œë¡œë„ ë©‰ë‹ˆë‹¤! [5:35 AM] linflus: 졸업보다 군대가 가까울 나ì´ë¼.. [5:35 AM] linflus: 1학년때 너무 열심히 ì•ˆí•´ë„ ë¼ìš” [5:36 AM] lyuha: 군대ë¼ë‹ˆ.... [5:36 AM] lyuha: ì‹ ê²€ë„ ì•„ì§ ì•ˆ ë°›ì•˜ë‹¤ê³ ìš”..ã… ã… [5:36 AM] linflus: 대충하ë¼ëŠ” ë§ì´ë¼ê¸°ë³´ë‹¨ ìŒ.. ê³¼ì œ í•˜ë‚˜í•˜ë‚˜ì— ëª©ë§¤ë‹¤ 진짜 í•˜ê³ ì‹¶ì€ê²Œ 멀어질 수 있다?! [5:36 AM] linflus: ì´ëŸ° ëŠê¹€ [5:36 AM] lyuha: 그런것보단 [5:36 AM] lyuha: ê³¼ì œ íŽ´ë†“ê³ ë”´ì§“ë¶€í„° ê·¸ë§Œí•´ì•¼ì£ ... [5:36 AM] linflus: ㅋㅋㅋㅋ그건 누구나 í•˜ëŠ”ê±°ë¼ [5:36 AM] lyuha: ê³¼ì œ 하나하나 목 매는 스타ì¼ë„ ì•„ë‹ˆê³ . [5:36 AM] lyuha: 넘어가면 ë„˜ì–´ê°€ê³ . [5:36 AM] lyuha: ë ì´ëŸ°ëŠë‚Œì´ë¼ ì´ë²ˆ 학기는... [5:38 AM] linflus: ㅋㅋㅋㅋ아무튼 ê³¼ì œì¤‘ì´ë¼ë‹ˆ 너무 방해하면 안ë ê²ƒê°™ì€ ëŠë‚Œ [5:38 AM] linflus: ë‚œ ì´ì œ ìžëŸ¬... [5:38 AM] linflus: ê³¼ì œ 얼른 ë§ˆì¹˜ê³ ìžëŸ¬ê°€ìš”!! [5:39 AM] lyuha: ë°©í•´í•´ë„ ê´œì°®ìŠµë‹ˆë‹¤ ----- Monday, May 26th, 2014 ----- [12:38 AM] smksyj: ì˜¤ëŠ˜ì˜ scala? [12:39 AM] smksyj: curryingì€ ê·¸ë ‡ê²Œ 특ì´í•œ ê±´ 아니지 싶ì€ë° [12:39 AM] smksyj: ë‚´ê°€ 알기로는 [12:39 AM] smksyj: ì´ë¯¸ 있는 í•¨ìˆ˜ì— [12:39 AM] smksyj: 부분 ì¸ìˆ˜ë¥¼ ì ìš©í•´ì„œ [12:40 AM] smksyj: 새 함수를 만드는 걸 [12:40 AM] smksyj: curryingì´ë¼ê³ 하는 걸로 ì•Œê³ ìžˆëŠ”ë° [12:40 AM] smksyj: scalaì—ì„œ 지ì›í•˜ê³ haskelì—ì„œ 지ì›í•˜ê³ [12:40 AM] smksyj: function add(a, b) { return a + b; } [12:40 AM] linflus: 오 [12:40 AM] smksyj: ì´ëŸ´ ë•Œ [12:40 AM] linflus: 특ì´í•´ì„œ 기대ëœë‹¤ê³ ì“´ ì ì—†ìŒ [12:41 AM] smksyj: ê·¸ë ‡êµ° [12:41 AM] linflus: 분명히 ë´¤ëŠ”ë° ëë”ë¼ í•´ì„œ 기대ë˜ëŠ”ê²ƒë¿ [12:41 AM] linflus: ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ [12:41 AM] smksyj: function addOne(value) { return add(1, value); } [12:41 AM] smksyj: ì´ëŸ° ê±°? [12:41 AM] smksyj: í•´ì„œ addOne(10) [12:42 AM] smksyj: ì´ë ‡ê²Œ 쓰는 걸로 ê¸°ì–µí•˜ëŠ”ë° [12:44 AM] lyuha: 특ì´í•˜ë„¤ìš” [12:44 AM] lyuha: 특ì´í•´ìš”! [12:44 AM] smksyj: ã„·ã„· [12:45 AM] smksyj: ê°œì¸ì 으로는 왜 쓰는지나 ì“°ë©´ ëê°€ 좋ì€ì§€ ë“±ì„ ìž˜ ëª¨ë¥´ê² ìŒ [12:46 AM] smksyj: 그래서 ì˜¤ëŠ˜ì˜ linflusê°€ ì •ë¦¬í•´ 주는 걸 기대해 ë´ì•¼ì§€ [12:46 AM] smksyj: ë‘ê·¼ë‘ê·¼ [12:46 AM] lyuha: ë‘ê·¼ë‘ê·¼ [12:46 AM] lyuha: 여기 scala는 ë‘ê·¼ë‘근하ㅈ [3:23 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ [3:23 AM] linflus: 는 ì–´ì œ ë§í•œëŒ€ë¡œ Currying [3:24 AM] linflus: ìŒì‹ì–˜ê¸°ê°€ 아니ë¼ëŠ” 드립ì¸ì§€ 아닌지 ëª¨ë¥´ê² ëŠ” 멘트로 시작한 ê°•ì˜... [3:24 AM] linflus: Curryingì€ í•œì¤„ë¡œ 심플하게 ë§í•˜ë©´ multiple argument를 받는 functionì„ ë°”ê¾¸ëŠ” 것 [3:24 AM] linflus: ëë¡œ? [3:24 AM] linflus: single argument를 받는 functionì˜ chain으로 [3:25 AM] linflus: functionì˜ chainì´ëž€ ë§ì„ ê°‘ìžê¸° 쓰는게 ì• ë§¤í•œê°€.. [3:27 AM] linflus: ìœ„ì— ë¯¼ê´€ì´ê°€ ë§í•œ 경우를 ë³´ë©´ [3:31 AM] linflus: def add(a:Int, b:Int):Int = a + b [3:31 AM] linflus: 는 a, b ë‘ê°œì˜ argument를 ë°›ê³ ìžˆì§€ë§Œ 아래ì—서는 [3:32 AM] linflus: def addOne(value:Int):Int =add(1, value) [3:32 AM] linflus: í•´ì„œ addOne í•¨ìˆ˜ì˜ ê²½ìš° single argument를 ë°›ìŒ [3:32 AM] linflus: ë§í•œëŒ€ë¡œ curryingì´ ë다 ìžì²´ëŠ” 진짜 ì´ê²Œ ëì¸ë“¯? [3:32 AM] linflus: ê·¼ë° curryingì„ ì“¸ê±°ë©´ ì €ëŸ°ì‹ìœ¼ë¡œ 안 ì“°ê² ì§€ ì‹¶ì€ ìƒê°ì€ 듬 (edited) [3:33 AM] linflus: í¬.. [3:33 AM] linflus: 단어를 찾기 ì–´ë µêµ°.... [3:38 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) [3:39 AM] linflus: 비슷한 ì˜ˆì œë¼ë©´ ì°¨ë¼ë¦¬ ì´ëŸ°ìª½ì„ ë“¤ê³ ì˜¤ê³ ì‹¶ì€ë°.. [3:39 AM] linflus: ë¬¼ë¡ ì´ ê²½ìš°ì—” execute(add)(1,2)ì—ì„œ ë’¤ì— (1,2) 넘겨주는 ë¶€ë¶„ì€ single argumentê°€ 아니지만 [3:41 AM] linflus: 사실 좀 ê¶ê¸ˆí•œê±´ 그럼 ì €ê¸°ì„œ execute(add)ë¡œ 바꾸는 부분까지만 curryingì´ë¼ëŠ” 건지 그게 ê¶ê¸ˆ.. 대충 ë‚´ê°€ ì´í•´í•˜ê¸°ë¡ 그런ë°.. [3:42 AM] linflus: ê·¸ ë¶€ë¶„ì€ ì¶”í›„ 좀 ë” ì•Œì•„ë³´ê¸°ë¡œ í•˜ê³ Currying ì¨ì„œ 좋아보ì´ëŠ” ê±´ 중복ë˜ëŠ” ë¶€ë¶„ì„ ì œê±°í•˜ê³ ì¼ë°˜í™” 시킬 수 있다는거? [3:42 AM] linflus: ìœ„ì— ì‚¬ì‹¤ 코드가 쓰다만 ì…ˆì´ ëëŠ”ë° [3:42 AM] smksyj: íŠ¹ì • 함수ì—ì„œ ì¸ìž ì¼ë¶€ë¥¼ ê³ ì •ì‹œì¼œì„œ 새 함수를 만드는 ê²ƒì„ curryingì´ë¼ê³ 하는 ê±° ì•„ëƒ? [3:43 AM] smksyj: def execute ë§Œë“ ë¶€ë¶„ì´ [3:43 AM] smksyj: currying ì 용시킨 것 ê°™ì€ë° [3:43 AM] linflus: ㅇㅇ 그니까 거기까지만 curryingì¸ê²Œ 맞나 [3:43 AM] linflus: 그게 ê¶ê¸ˆ [3:43 AM] smksyj: ë‚´ê°€ ì•Œê¸°ë¡ ê·¸ëž˜ [3:43 AM] linflus: 아하 ê·¸ë ‡êµ°.. ë•¡í ã…‹ã…‹ [3:43 AM] linflus: execute((x, y) => x+y)(1, 2) [3:43 AM] linflus: execute((x, y) => x*y)(1, 2) [3:44 AM] linflus: ì´ë ‡ê²Œ ì¨ì£¼ë©´ 쓸ë°ì—†ì´ add, mul functionì„ ì •ì˜í• 필요가 사ë¼ì§ [3:44 AM] linflus: Curryingì´ ëŠ˜ 좋으ëƒê³ 하면 그건 아니ë¼ê³ ë³´ê³ .. [3:45 AM] linflus: strategy pattern 쓰는 ëŠë‚Œì´ëž€ ìƒê°ë„ 들었는ë°... [3:46 AM] linflus: ì´ ì •ë„로만 ì´ì ì„ ì„¤ëª…í•˜ëŠ”ê²Œ ë‚´ ì–„íŒí•œ 시야 ë‚´ì—ì„œ 설명하는 ê²ƒì¼ ìˆ˜ ìžˆìŒ [3:47 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ëŠ” ë. [3:47 AM] smksyj: ... [3:47 AM] smksyj: ìž ì€ ì–¸ì œë“¤ ìžëŠ” 거지 [3:47 AM] smksyj: ê¹€íƒœì§„ë„ ì§€ê¸ˆ 깨어 있ë˜ë° [3:47 AM] linflus: 아마 ë‚´ì¼ ë‚´ìš©ì´ ì•žì— ë´¤ë˜ ë‘ ì˜ìƒ ë‚´ìš©ì„ ë‹¤ë¥¸ ì˜ˆì œ 하나로 ë” ë³´ëŠ”ê±°ë¼ [3:47 AM] lyuha: ...ì˜¤ì „ì—ìš”? [3:47 AM] linflus: ì„¤ëª…ì´ ë” ìžˆì„ ìˆ˜ë„ ìžˆë‹¤ëŠ” ìƒê°ì€ 듬 [3:47 AM] smksyj: linflusì˜ ì¶œê·¼ì‹œê°„ì´ ì˜¤í›„ì¼ ë¦¬ëŠ” ì—†ì„í…Œê³ [3:47 AM] linflus: ë‚œ ì›ëž˜ ì„¸ì‹œì— ìž [3:47 AM] linflus: ì˜¤ëŠ˜ì€ ë„¤ì‹œì— ìžë‹ˆê¹Œ ë‚´ì¼ í”¼ê³¤í•˜ê² ì§€ [3:48 AM] smksyj: ... [3:48 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ ì‹œìž‘í•˜ë©´ì„œ ë„¤ì‹œì— ìžëŠ” ë‚ ì´ ë§Žì•„ì„œ [3:48 AM] linflus: 회사ì—ì„ ê±°ì˜ ë©ë•Œë¦¬ëŠ”듯 [3:48 AM] lyuha: .... [3:48 AM] smksyj: ì›ì¤€ì´ëŠ” ì–¸ì œ 수업ì¸ì§€ ëª¨ë¥´ê² êµ° [3:48 AM] lyuha: 12시요! [3:48 AM] lyuha: 그니까 ëŠê¸‹í•˜ì£ [3:49 AM] smksyj: ... [3:49 AM] lyuha: ì•„ 맞다 ì ‘ì†í•œ 사람들 뜨지.... [4:08 AM] smksyj: í—‰ ê·¼ë° ì´ ì±„ë„ì€ 3명 ë¿ì¸ ê±´ê°€? [4:08 AM] lyuha: ê·¸ë ‡ê²Œ ë˜ë„¤ìš”... [4:08 AM] smksyj: ... ë‚¨ì´ ë‚˜ ëŒ€ì‹ ìŠ¤í„°ë”” í•´ 주는 [4:08 AM] smksyj: ì´ë ‡ê²Œ ì¢‹ì€ ì±„ë„ì„ ë‘ê³ [4:08 AM] lyuha: ã…‹ã…‹ã…‹ã…‹ [4:08 AM] lyuha: 진짜 ì ì ˆí•©ë‹ˆë‹¤ ë¹„ìœ ê°€ [4:09 AM] lyuha: ì•„ 위ì—꺼 다 사ë¼ì ¸ê°„다 [4:09 AM] smksyj: ì—…ë°ì´íŠ¸ 빈ë„ë„ ë§¤ì¼ë§¤ì¼ì´ê³ [4:09 AM] smksyj: ì •ë§ ì¢‹ì€ ì±„ë„ì¸ë° [4:09 AM] smksyj: /ì• ë„ [4:09 AM] lyuha: ê°€ë” ë§¥ì•±ì€ ìœ„ì—를 짤ë¼ë²„ë ¤ì„œ refresh는 위대합니다(?) ----- Yesterday May 27th, 2014 ----- [3:03 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ [3:03 AM] linflus: 는 ì–´ì œ ë§í•œëŒ€ë¡œ exampleì¸ë° ìŒ... [3:03 AM] linflus: 그걸 ì§ì ‘ 짜보는 ë° ì˜ì˜ê°€ ìžˆê³ ì§œë³¸ê²ƒì„ ì„¤ëª…í•˜ëŠ”ë° ì˜ì˜ê°€ 있는 ì˜ìƒì´ 아니었다 [3:04 AM] linflus: ì—¬ê¸°ì— ì˜®ê¸¸ë§Œí•œ ë§ì€ Curryingì˜ ì´ì ì— ëŒ€í•œ 것ì¸ë° [3:04 AM] linflus: ìŠ¤ì¹¼ë¼ ì•„ì €ì”¨ë„ abstract와 ìž¬ì‚¬ìš©ì— ì˜ì˜ê°€ ìžˆë‹¤ê³ í•¨ [3:05 AM] linflus: ê·¸ë¦¬ê³ ì§±ì§± abstractionì´ ê¼ ì˜³ì€ ê²ƒì€ ì•„ë‹ˆë¼ëŠ” ë§ë„ ë§ë¶™ìž„ [3:05 AM] linflus: 때때로 concreteí•œ 게 ë” ì ì ˆí• ë•Œê°€ 있으나 abstraction techniques를 알아둬야 í•œë‹¤ê³ [3:06 AM] linflus: ê·¸ ë‹¤ìŒ ì˜ìƒì€ 짤막한 스칼ë¼ì˜ syntax 리뷰였다 [3:06 AM] linflus: EBNFë¡œ ìŠ¤ì¹¼ë¼ ë¬¸ë²•ì„ ì„¤ëª…í–ˆë‹¤ [3:06 AM] linflus: Linflus(ì€)는 지금 í•˜ê³ ìžˆëŠ” ê²ƒì´ #scalaì¸ì§€ #compilerì¸ì§€ í˜¼ëž€ìŠ¤ëŸ¬ì› ë‹¤ ! [3:07 AM] linflus: ë‚´ê°€ 보는 ê²ƒì€ ì˜ë¯¸ê°€ 있었으나 ê·¸ê²ƒë„ ì—¬ê¸° 다 옮겨ì ì„ ë‚´ìš©ì€ ì•„ë‹ˆë¼ì„œ 패스 [3:07 AM] linflus: ì–´ì©ì§€ 하나 ë” ë´ì•¼í• 것 같아서 ë‹¤ìŒ ì˜ìƒë„ 봤다. ë‘번째 ì˜ìƒì´ ì—„ì² ì§§ê¸´ 했지만 ì˜ìƒ 세개나 본 ë‚ ì€ ì²˜ìŒ.. [3:07 AM] linflus: ì˜¤ëŠ˜ì€ ì¼ì° 보기 시작해서 가능한 ì¼ì´êµ°.. [3:08 AM] linflus: 드디어 Classê°€ ë‚˜ì™”ëŠ”ë° ìŠ¤ì¹¼ë¼ë¡œ ì²˜ìŒ í”„ë¡œê·¸ëž˜ë°ì„ 배우는 사람ì´ë¼ë©´ ëª¨ë¥´ê² ìœ¼ë‚˜ [3:08 AM] linflus: êµ³ì´ Java 아니ë”ë¼ë„ 기존 ë¬¸ë²•ìƒ class를 지ì›í•˜ëŠ” ì–¸ì–´ë“¤ì„ ì‚¬ìš©í•´ë³¸ 사람ì´ë¼ë©´ [3:09 AM] linflus: 그냥 스칼ë¼ì˜ class는 immutable classì—¬ [3:09 AM] linflus: í•˜ê³ ìƒê°í•˜ë©´ ë 것 ê°™ì€ ë‚´ìš©ì´ì—ˆë‹¤ [3:09 AM] linflus: ê·¸ëž˜ë„ ì˜ˆì œê°€ 없으면 ì„ì„하니까 ì˜ˆì œ... [3:10 AM] linflus: ì´ê±´ 새로 짜와야한다. 왜ëƒë©´ ì˜ìƒ ì˜ˆì œëŠ” 분수ë¼ì„œ 그냥 ì—¬ê¸°ì— ìƒ˜í”Œë¡œ ë˜ì ¸ë†“기엔 좀 ì½ê¸° 짜ì¦ë‚œë‹¤. [3:15 AM] linflus: c++ classì˜ ë‹¨ê³¨ì˜ˆì œ Complex 소환! [3:15 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" } ``` [3:17 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 ``` [3:18 AM] linflus: 스칼ë¼ë¡œ functional programming í• ê²½ìš° mutable variableë¡œ ìƒíƒœë¥¼ 갖는 게 ì•„ë‹ˆê¸°ë•Œë¬¸ì— ë©”ì„œë“œë“¤ì´ ëª¨ë‘ ìƒˆ instance를 ë°˜í™˜í•˜ê³ ìžˆìŒ [3:18 AM] linflus: ì´ê²Œ í¬ì¸íŠ¸ë¼ê³ ìƒê°í•˜ê³ .. [3:18 AM] linflus: ê·¸ ì™¸ì˜ ë¶€ë¶„ì€ ë‹¤ë¥¸ 것과 다른게 없다.. [3:18 AM] linflus: 오버ë¼ì´ë“œ í• ë•ŒëŠ” override defë¼ê³ 씀 [3:18 AM] linflus: 아마 ì´ì œë¶€í„° 본격ì 으로 코드를 짜게ë 것 같다 [3:19 AM] linflus: 그래서 intellj를 ì ê·¹ì 으로 ì“°ë ¤ê³ í•˜ëŠ”ë° intellj ìŠ¤ì¹¼ë¼ í”ŒëŸ¬ê·¸ì¸ì—ì„œ evaluation worksheetì´ ì œëŒ€ë¡œ ë™ìž‘하지 않는다 [3:19 AM] linflus: 버그가 ê³ ì³ì¡Œë‹¤ëŠ” ë²„ì „ë³´ë‹¤ ìƒìœ„ ë²„ì „ì„ ì“°ê³ ìžˆëŠ”ë°.. 버그가 ëŒì•„오셨나? 아윌비백? [3:19 AM] linflus: 아무튼 ì˜¤ëŠ˜ì˜ ë¶ˆí‰ë¶ˆë§Œì„ í¬í•¨í•œ ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ ë [3:20 AM] linflus: 앞으로는 ë‚´ìš© ì •ë¦¬ë³´ë‹¤ëŠ” 코드를 ì ê·¹ì 으로 짜보는 게 ì´í•´ì— ë” ë„ì›€ì´ ë 것 같다는 ìƒê°ì´ 들어서 [3:20 AM] linflus: ì´ ì±„ë„ì— ë‚´ìš©ì´ ë§Žì´ ì˜¬ë¼ì˜¤ì§€ëŠ” ì•Šì„ ê²ƒ 같다는 ìƒê°ë„ 듬 [3:20 AM] lyuha: 그건 좀 아쉽네요... [3:20 AM] smksyj: ëª¨ë‘ ìƒˆ ì¸ìŠ¤í„´ìŠ¤ë¥¼ 반환하면 [3:20 AM] smksyj: ìƒì„± ë¹„ìš©ì´ ë„ˆë¬´ í¬ì§€ 않나? [3:21 AM] linflus: ìƒí™©ë”°ë¼ 그럴 ìˆ˜ë„ ìžˆì„듯? [3:21 AM] smksyj: functional하게 짜서 그런가 [3:21 AM] smksyj: ì›ëž˜ëŠ” ìƒíƒœë„ ê°€ì§€ê³ ê·¸ëŸ´í…ë° [3:21 AM] lyuha: ì• ì´ˆì— classê°€ immutable ì´ì—¬ì•¼ 하는 ì´ìœ ê°€ 있는걸까요...? [3:21 AM] smksyj: ë‚´ê°€ ë´¤ë˜ ê±¸ë¡œëŠ” [3:21 AM] linflus: functional programmingì´ë¼ì„œ... [3:21 AM] smksyj: êµ³ì´ ì €ë ‡ê²Œ immutable하게 만들지는 ì•Šì•˜ìŒ [3:21 AM] smksyj: functionalì´ë¼ì„œê°€ 맞는 것 같네 [3:21 AM] linflus: ê°•ì˜ê°€ functional programming ê°•ì˜.. [3:21 AM] smksyj: ㅇㅇ [3:21 AM] linflus: ìžë°”ì— ê»´ë„£ì„ ìˆ˜ 있으니 [3:21 AM] linflus: 당연히 ìŠ¤ì¹¼ë¼ ìžì²´ëŠ” ìƒíƒœë¥¼ 가질 수 ìžˆìŒ [3:22 AM] smksyj: 다만 clojureì˜ ê²½ìš° [3:22 AM] linflus: 아니면 ì§œì¡Œê² ì§€ [3:22 AM] smksyj: 복사 ì‹œì— ê²¹ì¹˜ëŠ” ìƒíƒœëŠ” ê³µìœ í•˜ëŠ” ë°©ì‹ì„ ì´ìš©í•˜ì˜€ì§€ë§Œ [3:22 AM] smksyj: scala는 ì•„ë‹ˆê² ì§€... [3:22 AM] linflus: ì§œì¡Œê² ì§€ == 웹개발ì—ì„œ ìŠ¤ì¹¼ë¼ ëª»ì“¸ë“¯ [3:22 AM] linflus: 오 그런 ê¹Šì€ ì´ì•¼ê¸°ê¹Œì§€ëŠ” ëª¨ë¥´ê² ë‹¤.. 그건 ë” ì•Œì•„ë´ì•¼ í• ë¶€ë¶„ [3:22 AM] linflus: ê·¼ë° ì´ ê°•ì˜ëŠ” 사실 í•µì‹¬ì´ ìŠ¤ì¹¼ë¼ê°€ ì•„ë‹ˆë¼ [3:22 AM] linflus: 스칼ë¼ë¡œ 배우는 함수형 프로그래ë°ì´ë¼ [3:22 AM] smksyj: 함수형 [3:23 AM] linflus: 나오는 ê°œë…ì´ ì¤„ì°½ 함수형 í”„ë¡œê·¸ëž˜ë° ã…‹ã…‹ [3:23 AM] linflus: ê°œì¸ì ìœ¼ë¡ ê·¸ëž˜ì„œ 지금까지는 질리지 ì•Šê³ ë§¤ì¼ ë³¼ 수 있는 것 ê°™ìŒ [3:23 AM] linflus: 스칼ë¼ë¡œ 웹개발 í•´ë³´ì•„ìš” 였으면 진작 ggì¹˜ê³ ì±„ë„ ë¨¹íŠ€í–ˆì„듯; [3:23 AM] smksyj: 꽤 아쉽네 [3:23 AM] smksyj: ê°œì¸ì 으로 스칼ë¼ê°€ ìžëž‘í• ë§Œí•œ ê±´ [3:23 AM] smksyj: í•¨ìˆ˜í˜•ë„ ìžˆì§€ë§Œ [3:24 AM] smksyj: ì•¡í„° 모ë¸ì´ë‚˜ [3:24 AM] smksyj: traitì´ë‚˜ [3:24 AM] smksyj: ê°™ì€ ê²ƒë“¤ì´ë¼ê³ ìƒê°í•˜ëŠ”ë° [3:24 AM] linflus: 그런건 functionalí•œ ë¶€ë¶„ì„ ë¨¼ì € í›‘ê³ ë‚˜ì„œ ë´ë„ ë 것 ê°™ìŒ [3:24 AM] linflus: ã…‹ã…‹ [3:24 AM] smksyj: ê·¸ê²ƒë„ ê°•ì˜ ìžˆìŒ? [3:24 AM] linflus: 아니 [3:24 AM] linflus: 찾아보면 ë˜ì§€ [3:24 AM] lyuha: ë”ê°€ [3:24 AM] lyuha: ë”°ë¼ê°€ê¸° 힘들어졌다 [3:24 AM] lyuha: ì•¡í…Œ ëª¨ë¸ trait? [3:24 AM] smksyj: Actorë¼ê³ í•´ì„œ [3:24 AM] lyuha: ì—‘í„° ëª¨ë¸ ... trait?.. [3:25 AM] smksyj: ìŠ¤ë ˆë“œë¥¼ 조금 ë” ì“°ê¸° 편하게? [3:25 AM] linflus: ê°•ì˜ ìˆ˜ì¤€ì˜ ìƒ˜í”Œ ì§„ë„ ë”°ë¼ìž¡ìœ¼ë©´ [3:25 AM] smksyj: 그런 게 ìžˆìŒ [3:25 AM] linflus: 단타 exampleë§ê³ í† ì´ í”„ë¡œê·¸ëž¨ì„ í•˜ë‚˜ ì§¤ê±´ë° [3:25 AM] linflus: 그럴때 ì–´ì©” 수 ì—†ì´ ì°¾ì•„ë³´ê²Œ ë˜ê² 지 [3:25 AM] smksyj: Actor 모ë¸ì€ Erlangì—ì„œ ê°€ì ¸ì™”ë‹¤ê³ í•˜ëŠ” 것 ê°™ë˜ë° [3:25 AM] smksyj: traitì€ [3:25 AM] smksyj: êµ¬í˜„ì„ ê°€ì§€ê³ ìžˆëŠ” Interface [3:26 AM] linflus: ?! [3:26 AM] linflus: abstract classëž‘ ì°¨ì´ì ì´ ë지 [3:26 AM] smksyj: 그건 [3:26 AM] smksyj: traitì˜ êµ¬í˜„ ë¶€ë¶„ì€ [3:26 AM] smksyj: íŠ¹ì • í´ëž˜ìŠ¤ì˜ 세부사í•ì´ 안 드러나게? [3:26 AM] smksyj: 만들어질걸 [3:27 AM] smksyj: 그래서 ì¸í„°íŽ˜ì´ìŠ¤ì²˜ëŸ¼ ì–´ë””ì—ë“ ë¼ì›Œ ë„£ì„ ìˆ˜ ìžˆìŒ [3:27 AM] smksyj: 다만 ì¸í„°íŽ˜ì´ìŠ¤ì²˜ëŸ¼ [3:27 AM] linflus: traitì˜ instanceê°€ ìƒì„± 가능하다는건가? [3:27 AM] smksyj: 그걸 구현하는 ì• ë“¤ì€ ëª‡ëª‡ 메소드를 구현해야 함 [3:27 AM] smksyj: 그건 ì•„ë‹ˆê³ [3:27 AM] smksyj: traitì— ë©”ì†Œë“œê°€ 여러 개가 있으면 [3:27 AM] smksyj: ê·¸ 중 ì¼ë¶€ëŠ” trait ë‚´ë¶€ì˜ ë©”ì†Œë“œë¥¼ ì´ìš©í•´ì„œ 구현ë˜ì–´ ìžˆë‹¤ê³ í•´ì•¼ 하나 [3:28 AM] smksyj: ëŒ€ì‹ ëª‡ëª‡ì€ traitì„ extend 하는 í´ëž˜ìŠ¤ê°€ override를 í•´ 줘야 함 [3:28 AM] smksyj: 그래서 몇 개만 override를 í•´ 주면 [3:29 AM] smksyj: 나머지 ë©”ì†Œë“œë“¤ì€ trait 안ì—ì„œ ì´ë¯¸ trait ìžì²´ì˜ 메소드를 ì´ìš©í•´ì„œ ì •ì˜ê°€ ë˜ì–´ 있기 ë•Œë¬¸ì— [3:29 AM] smksyj: ì „ë¶€ 다 override 안 í•´ë„ ëœë‹¤ëŠ” 얘기 [3:29 AM] smksyj: ```trait Similarity { def isSimilar(x: Any): Boolean def isNotSimilar(x: Any): Boolean = !isSimilar(x) } ``` [3:29 AM] smksyj: 여기서 isNotSimilar ê°™ì€ ê²½ìš°ëŠ” [3:29 AM] smksyj: isSimilar를 ì´ìš©í•´ì„œ êµ¬í˜„ì´ ë˜ì–´ ìžˆê³ [3:30 AM] smksyj: ```class ExampleClass extends Similarity { } ``` [3:30 AM] smksyj: ì´ëŸ° ì• ê°€ 있으면 [3:30 AM] smksyj: 얘는 isSimilar만 override í•´ 주면 [3:30 AM] linflus: ?! 들ì„ìˆ˜ë¡ abstract classëž‘ ì°¨ì´ë¥¼ 잘 ëª¨ë¥´ê² ì–´ [3:30 AM] linflus: abstract classë„ ì¼ë¶€ 메소드는 ì •ì˜ê°€ ë˜ì–´ìžˆê³ [3:30 AM] smksyj: ìŒ... [3:30 AM] linflus: 하지만 ëª¨ë“ ë©”ì†Œë“œê°€ ì •ì˜ë˜ì–´ìžˆëŠ” ê±´ 아니ë¼ì„œ instance는 ëª»ë§Œë“¤ê³ [3:30 AM] smksyj: ìƒê°í•´ë³´ë‹ˆ 그런 것 같네... [3:30 AM] linflus: ìƒì†ë°›ëŠ” classì—ì„œ ì •ì˜í•´ì•¼í•˜ëŠ” ê±° 아님? [3:30 AM] linflus: ë‚´ê°€ 기억 ìž˜ëª»í•˜ëŠ”ê±¸ì§€ë„ [3:30 AM] linflus: abstract class를 ì‹œí—˜ì§€ì— ì ì–´ë‚´ë˜ ê²ƒì´ ì–¸ì œì ì¼ì¸ê°€ 싶긴 함 [3:31 AM] smksyj: ì•„ ê·¼ë° [3:31 AM] smksyj: abstract class는 [3:31 AM] smksyj: 복수 ìƒì†ì´ 안 ë˜ìž–ì•„ [3:31 AM] linflus: ì•„ [3:31 AM] linflus: ê·¸ë ‡êµ° [3:31 AM] linflus: 그건 중대한 ì°¨ì´êµ° [3:31 AM] linflus: !! [3:31 AM] linflus: 다중ìƒì†ì´ ëœë‹¤ë©´ 그건 ì°¨ì´ê°€ 있네 ã…‹ã…‹ [3:32 AM] linflus: í¬ ì˜¤ëŠ˜ì€ ì¼ì° ìžë ¤ê³ ì¼ì° 보기 ì‹œìž‘í–ˆëŠ”ë° [3:32 AM] linflus: ì˜ˆì œíŒŒí‹°í•˜ë‹¤ë³´ë‹ˆ ê²°êµ ìžëŠ” ì‹œê°„ì€ ë˜‘ê°™ì•„ [3:32 AM] smksyj: ë§Žì´ ë´ì„œ 늦게 ìžëŠ”êµ° [3:32 AM] linflus: ã…‹ã…‹ã…‹ã…‹ [3:32 AM] linflus: ëŒ€ì‹ ì´ë¯¸ 나온 ì˜ìƒ ì§„ë„ ë” ë¹¨ë¦¬ ë”°ë¼ìž¡ê³ 다른걸 í• ìˆ˜ ìžˆê² ì§€ [3:32 AM] linflus: ìžëŸ¬ê°€ì•¼ê² 다.. [3:32 AM] linflus: 학부ìƒë“¤ë„ 좋ì€ë°¤ë˜ì„¸ìš”.... [3:33 AM] lyuha: 안녕히 주무세요 [3:33 AM] smksyj: ã…‚ã…‚ [3:33 AM] smksyj: 진짜 ZPì˜ ê·€ê°ì´êµ°... [3:33 AM] lyuha: .....그러게요 [3:33 AM] linflus: 그럴리가 [3:34 AM] lyuha: 3:33ë¶„ì— [3:34 AM] lyuha: ì•¼ì‹ ë. [3:39 AM] smksyj: @lyuha: http://www.scala-lang.org/old/node/242 [3:39 AM] smksyj: http://savanne.be/articles/concurrency-in-erlang-scala/ [3:39 AM] smksyj: ìŠ¤ë ˆë“œì˜ ëŒ€ì•ˆìœ¼ë¡œ actor 모ë¸ì´ë¼ëŠ” ê²ƒì„ ì‚¬ìš©í•˜ì˜€ìŒ [3:39 AM] smksyj: 확실히 멀티코어 í™˜ê²½ì´ ë³´íŽ¸í™” ë˜ë©´ì„œ [3:39 AM] smksyj: 보다 ì•ˆì •ì ì¸ ìŠ¤ë ˆë“œì˜ ì‚¬ìš©ì€ [3:39 AM] smksyj: 많ì´ë“¤ ê³ ë ¤ë¥¼ 하나보지 [3:40 AM] smksyj: clojureì˜ STMë„ ìŠ¤ë ˆë“œì˜ ëŒ€ì•ˆìœ¼ë¡œ 만들어진 물건임 [10:58 AM] skylibrary: joined #scala ----- Today May 28th, 2014 ----- [2:45 AM] linflus: ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ë„ ì˜ˆì œíŒŒí‹°... [2:45 AM] linflus: 하지만 ì˜¤ëŠ˜ì€ ë²„ê·¸ë…¸ì˜ˆì§ˆì„ í•˜ê³ ì§‘ì— íƒì‹œíƒ€ê³ ë“¤ì–´ì™”ê¸°ë•Œë¬¸ì— ì˜ìƒ 하나만 봤다 [2:46 AM] linflus: 솔ì§ížˆ ë§í•´ì„œ Javaê°œë°œì„ í•´ë³¸ 사람ì—게 í¬ê²Œ 새로운 ë‚´ìš©ì€ ì—†ì—ˆìŒ [2:46 AM] linflus: 그래서 특별히 ì–¸ê¸‰í•˜ê³ ì‹¶ì€ ê±´ require와 assert [2:48 AM] linflus: ìŒ ë‘˜ 다 testingì— ì‚¬ìš©í• ìˆ˜ 있는 function [2:49 AM] linflus: 사실 ê°•ì˜ ì˜ìƒì€ ìŠ¤ì¹¼ë¼ ì•„ì €ì”¨ê°€ ì„¤ëª…í•˜ê³ ì‹¶ì€ ë¶€ë¶„ì„ ì„¤ëª…í•˜ê¸°ë•Œë¬¸ì— ê·¸ ì´í›„ì— ë‹¤ì‹œ 검색해야하는 ë¶€ë¶„ì´ ìƒê¸´ë‹¤ [2:50 AM] linflus: ì´ë¥¼í…Œë©´ ê°•ì˜ ì˜ìƒì„ ë³´ë©´ require와 assertì˜ ì°¨ì´ë¥¼ ì¡°ê±´ì„ ë§Œì¡±ì‹œí‚¤ì§€ ëª»í–ˆì„ ë•Œ require는 IllegalArgumentExceptionì„ ë°œìƒì‹œí‚¤ê³ (edited) [2:50 AM] linflus: assert는 AssertionError를 ë°œìƒì‹œí‚¨ë‹¤ëŠ” 것 [2:52 AM] linflus: 그래서 require는 functionì„ callí• ë•Œì˜ ì „ì œì¡°ê±´ì„ ê°•ì œí•˜ëŠ” ë° ì“°ì´ê³ (ê°•ì˜ì—서는 ë¶„ìˆ˜ì˜ ë¶„ëª¨ëŠ” 0ì´ ë 수 없다는 ì „ì œë¡œ 예를 듬) [2:52 AM] linflus: assert는 function ìžì²´ì— 대한 í…ŒìŠ¤íŠ¸ì— ì“´ë‹¤ [2:52 AM] linflus: ì •ë„ë¡œ ì´í•´í•˜ê²Œ ë˜ëŠ”ë° ì´ê²Œ 맞나 ì‹¶ì€ ìƒê°ì´ 듬 [2:53 AM] linflus: ì•„ ê·¸ë¦¬ê³ ë˜ í•˜ë‚˜ëŠ” constructor 문법 (edited) [2:55 AM] linflus: class Complex(a:Int, b:Int) ì—ì„œ a, b ë‘ ì¸ìžë¥¼ 받는 constructor ì™¸ì— ì¸ìžë¥¼ 아예 받지 않거나 하나만 받는 다른 contructor를 ì •ì˜í•˜ê³ 싶다면 class ë‚´ì— [2:55 AM] linflus: def this(a:Int) = Complex(a, 0) [2:56 AM] linflus: ì´ëŸ°ì‹ìœ¼ë¡œ thisë¼ëŠ” 키워드를 사용해 ì •ì˜í•´ì¤„ 수 있다 [2:56 AM] linflus: Intellij ë¬¸ì œëŠ” ì•„ì§ í•´ê²°ë²•ì„ ëª°ë¼ì„œ ë‚´ì¼ ì¢€ ë” ì†ì„ 대거나 그냥 ì´í´ë¦½ìŠ¤ë¥¼ 다시 ê¹” ìƒê° [2:56 AM] linflus: 사실 오늘부터 ì½”ë“œì§œëŠ”ë° ì‹œê°„ì„ ì¢€ ë” ë“¤ì´ë ¤ê³ 노트ë¶ì„ ë“¤ê³ ë‚˜ê°”ëŠ”ë° 10시까지 버그노예하는 바람ì—... [2:57 AM] linflus: ë‚´ì¼ì€ 야근만 안 하게 ëœë‹¤ë©´ 좀 ë” êµ¬ìƒ‰ì„ ê°–ì¶˜ ì˜ˆì œë¥¼ ê°€ì ¸ì˜¬ 수 있기를 ë°”ë¼ë©° ì˜¤ëŠ˜ì˜ ìŠ¤ì¹¼ë¼ëŠ” ë (edited) [2:57 AM] smksyj: ê¸°ì–µì´ ë§žë‹¤ë©´ [2:57 AM] smksyj: scala는 ìƒì„±ìžê°€ 복수 ê°œ 있으면 [2:58 AM] smksyj: 기본 ìƒì„±ìžê°€ ì•„ë‹Œ ê²ƒë“¤ì€ [2:58 AM] smksyj: 반드시 내부ì—ì„œ 기본 ìƒì„±ìžë¥¼ 호출하게? 그런 ì œì•½ì´ ìžˆì—ˆë˜ ê±¸ë¡œ ê¸°ì–µí•˜ëŠ”ë° [2:58 AM] linflus: 아하 진짜? [2:58 AM] smksyj: 그런 얘기는 혹시 ë 없었나요 [2:58 AM] smksyj: ë‹¹ì‹œì— ë³´ë©´ì„œ [2:58 AM] smksyj: ë ì €ë ‡ê²Œ 불편하게 만들었지 [2:58 AM] smksyj: 하는 ìƒê°ì„ í–ˆë˜ ê²ƒ ê°™ì€ë° [2:58 AM] linflus: ì˜ìƒ ì˜ˆì œì—ì„œ 기본 ìƒì„±ìžë¥¼ 호출하긴 했지만 딱히 그런 ë§ ë“¤ì€ ê¸°ì–µì´ ì—†ëŠ”ë° ì˜ì–´ë‹ˆê¹Œ ë†“ì³¤ì„ ìˆ˜ ìžˆìŒ [2:58 AM] linflus: 다시 ê·¸ 부분 ë´ì•¼ì§€ [3:00 AM] linflus: ì¼ë‹¨ 다시 ë´¤ì„ë•Œ 기본 ìƒì„±ìžëŠ” class bodyì— ìžˆëŠ” statement를 ëª¨ë‘ ì‹¤í–‰í•œë‹¤ëŠ” ë§ë„ 있군 [3:00 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 } } ``` [3:00 AM] smksyj: def this(firstName:String, lastName: String, city:String){ this(firstName,lastName) this.city = city } [3:01 AM] smksyj: 아마 Employee(val firstName:String, val lastName:String) [3:01 AM] smksyj: ì´ê²Œ ë””í´íŠ¸ ìƒì„±ìžì§€ 싶ì€ë° [3:01 AM] smksyj: ```def this(firstName:String, lastName: String, city:String){ this(firstName,lastName) this.city = city } ``` [3:01 AM] smksyj: ì € 안ì—ì„œ this(firstName, lastName)ì˜ í˜¸ì¶œì´ [3:01 AM] smksyj: ì˜ë¬´ì˜€ë˜ 걸로 기억함 [3:03 AM] linflus: ì•„; 다시 ë´ë„ 그런 ë§ì€ 없네 [3:03 AM] smksyj: 그런가 [3:03 AM] linflus: 그게 í‹€ë ¸ë‹¤ê¸°ë³´ë‹¤ ê·¸ 얘기를 별로 ê·¸ 타ì´ë°ì— í•˜ê³ ì‹¶ì§€ 않았ë˜ê²ƒê°™ê¸°ë„ [3:03 AM] smksyj: ㅇㅇ [3:03 AM] linflus: 별로 í름ì´ëž‘ ìƒê´€ì—†ì–´ì„œ.. [3:03 AM] smksyj: ê·¼ë° ë‚˜ë„ ì •í™•í•˜ê²Œ ê¸°ì–µì€ ì•ˆ 나서 [3:03 AM] smksyj: ìƒì„±ìž 얘기 하길래 [3:04 AM] smksyj: 혹시 그런 얘기가 있었나 ê¶ê¸ˆí•´ì„œ 그럼 [3:04 AM] linflus: ㅇㅇ ë‚˜ë„ ê¶ê¸ˆí•´ì ¸ì„œ 검색중 [3:05 AM] smksyj: Auxiliary Constructor [3:06 AM] linflus: http://codemonkeyism.com/top-5-things-to-know-about-constructors-in-scala/ [3:06 AM] linflus: Secondary constructors like this() need to delegate to another constructor to work (Thanks @Synesso). [3:06 AM] smksyj: Secondary constructors like this() need to delegate to another constructor to work [3:06 AM] linflus: ì´ ë§ì€ 반드시 ê·¸ 호출하는게 기본ìƒì„±ìžì—¬ì•¼ 하는건지 [3:06 AM] linflus: 그런 ëŠë‚Œì€ ì•„ë‹Œë° [3:06 AM] smksyj: êµ³ì´ ê¸°ë³¸ìƒì„±ìžëŠ” ì•„ë‹ˆì–´ë„ ë¨ [3:06 AM] linflus: ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ã…‹ [3:06 AM] smksyj: ê·¼ë° [3:06 AM] linflus: ê°™ì€ë¬¸ìž¥ [3:07 AM] smksyj: 걔가 호출한 다른 Auxiliary Constructorê°€ (edited) [3:07 AM] smksyj: íƒ€ê³ íƒ€ê³ ê°€ë©´ [3:07 AM] smksyj: 반드시 기본 ìƒì„±ìžë¥¼ 호출해야 í• ê±¸ [3:07 AM] linflus: ê²°êµ class bodyì˜ ëª¨ë“ ë¬¸ìž¥ì„ ì–¸ì ê°€ 실행해야한다 [3:07 AM] linflus: 그런 맥ë½ì—ì„œ? [3:08 AM] smksyj: Auxiliary constructors can contain more than a single invocation of another constructor, but their first statement must be said invocation. [3:08 AM] linflus: 그런거면 ì´í•´ê°€ ê°.. 하지만 ëª¨ë“ constructorê°€ 반드시 ì§ë¹µìœ¼ë¡œ primary constructor를 호출해야한다면 비효율ì ì´ëž€ ëŠë‚Œë„ ë“¤ê³ .. [3:09 AM] smksyj: ìƒì„± ì‹œì— ë””í´íŠ¸ ìƒì„±ìžì— 있는 변수는 초기화가 ë˜ì–´ì•¼ 하지 ì‹¶ìŒ [3:09 AM] linflus: ì•„ ì´ ë¶€ë¶„ì€ ì‚¬ì‹¤ 좀 ë” ì°¾ì•„ë³´ê³ ì‹¶ê¸´ 하다 문법ì ì¸ ë©´ì—ì„œë¼ê¸° 보다는 [3:10 AM] linflus: 스칼ë¼ì—ì„œ ìƒì„±ìž í˜¸ì¶œí• ë•Œì— ëŒ€í•´ì„œ 좀 ë” ì°¾ì•„ë´ì•¼ê² 다는 ìƒê°ì´ 듬 [3:10 AM] smksyj: ë‚´ê°€ ì´ê±°ì— 관심 있는 ì´ìœ 는 [3:10 AM] smksyj: ì´ê±° ì—„ì² ë¶ˆíŽ¸í• ê²ƒ ê°™ì€ë° [3:10 AM] smksyj: ì •ë§ ì´ë ‡ê²Œ í•œ ê±° 맞나 ê¶ê¸ˆí•´ì„œ -_-;; [3:10 AM] linflus: ì´ ë¶€ë¶„ì€ ì˜ìƒê³¼ 별ë„ë¡œ ë‚´ì¼ ì°¾ì•„ë³´ê³ ì¶”ê°€ì 으로 ì¨ì•¼ê² ìŒ ã…‹ã…‹ [3:10 AM] linflus: 채ë„ì„ í™œìš©í•˜ê¸¸ 잘했네.. í˜¼ìž ìœ„í‚¤ì— ëª‡ì¤„ 대충 쓰는것보다 [3:11 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 [3:11 AM] linflus: ì“°ê¸°ë„ íŽ¸í•˜ê³ ê³µë¶€í•˜ê¸°ì—ë„ ë” ì¢‹ì•„ [3:11 AM] smksyj: every constructor invocation in Scala will end up eventually calling the primary constructor of the class. [3:11 AM] linflus: ê·¸ë ‡êµ° [3:11 AM] linflus: 복잡하게 ì§œë ¤ë‹¤ê°€ íë§ [3:11 AM] linflus: í• ìˆ˜ 있다 [3:11 AM] linflus: ë 그런 ìƒê°ë“¤ì´ 머리를 스침 [3:12 AM] linflus: ì•„ ë‚œ ì´ë ‡ê²Œ ì§œê³ ì‹¶ì€ë° 왜 안 ë¼!! ê°™ì€ ê·¸ë¦¼ì´.. [3:12 AM] smksyj: ì˜¤ëŠ˜ë„ 3시는 넘는군 [3:12 AM] linflus: ì–´ì©” 수 ì—†ìŒ 10시까지 야근해서 [3:12 AM] smksyj: 슬슬 ì›ì¤€ì´ê°€ 나올 것 ê°™ì€ ë¶„ìœ„ê¸°ì¸ë° [3:12 AM] smksyj: ì˜¤ëŠ˜ì€ ì•ˆ 나오네 [3:12 AM] linflus: ã…‹ã…‹ã…‹ã…‹ã…‹ [3:12 AM] linflus: ë‚œ ìžëŸ¬ê°€ì•¼ì§€.. [3:12 AM] smksyj: ì˜¤ëŠ˜ë„ ê³ ìƒí•˜ì…¨ìŠµë‹ˆë‹¤ [3:12 AM] smksyj: ㄳㄳ [3:12 AM] linflus: ì¢‹ì€ í”¼ë“œë°± ㄳㄳ [3:14 AM] smksyj: ìŒ... primary constructorì˜ val ë³€ìˆ˜ì˜ ì´ˆê¸°í™” ë•Œë¬¸ì— [3:14 AM] smksyj: ì €ëŸ° ì •ì±…ì„ ì·¨í–ˆë‚˜ë³´ë„¤ [3:15 AM] smksyj: valì€ ë°˜ë“œì‹œ ì´ˆê¸°ê°’ì´ ë“¤ì–´ìžˆì–´ì•¼ 하니까 [3:16 AM] syjsmk: joined #scala from an invitation by @smksyj [3:45 AM] lyuha: ìŒ...나오기 ì–´ë ¤ìš´ [3:45 AM] lyuha: ì£¼ì œì˜€ìŠµë‹ˆë‹¤? [10:37 AM] syjsmk: í—‰ ìž ì•ˆìžëŠ” ì‚¬ëžŒë“¤ì˜ ì±„ë„ì¸ê°€ìš” [10:49 AM] lyuha: 보통 다들 늦게 ìžì£ ... [2:43 PM] jereneal: joined #scala [3:07 PM] flyjsw: joined #scala