이번 스칼라 스터디 내용에 currying이 있었으며
지난 번에는 partially applied function이 있었는데 볼 때마다 헤매게 되어 조금 정리해볼까 한다.

  1. currying
 스칼라에서 커링은, 여러 개의 파라미터를 받는 함수를 파라미터 리스트를 받는 함수로 바꾸어준다.
scala> def justFun(a:Int, b:Int){
     | val sum = a + b
     | println("result : " + sum)
     | }
justFun: (a: Int, b: Int)Unit
scala> def curriedFun(a:Int)(b:Int){ | val sum = a + b | println("result : " + sum) | } curriedFun: (a: Int)(b: Int)Unit
그런데 커링을 단순히 함수의 변형으로만 보면 안되는게
커리된 함수를 호출했을 때 파라미터가 전달되는 모습을 내부적으로 보 면 알 수 있다.
scala> justFun(3,4)
result : 7
scala> curriedFun{3}{4} result : 7 scala> val one = curriedFun(3)_ one: Int => Unit = <function1> scala> one(4) result : 7
실제로 수행되는 내역을 보면 위와 같다. 
함수에 첫번째 인자를 넘기면 그 결과로 두번째 인자를 받는 함수가 반환이 되고
반환된 함수에 두번째 인자를 넘기면 기존-커리되지 않은 함수-의 결과가 반환된다.
이를 수학적으로 표현하게 되면, A(x,y)→z 인 함수를 C'A(x)(y)→z 로 바꾸는 걸로 볼 수 있다. 
클로저(closures)를 지원하는 언어에서는 커리된 함수를 쓸 수 있다고 한다.

2. partially applied function
일반적으로 여러개의 파라미터를 받는 함수에 모든 파라미터를 넘기면 fully applied 라고 하며
파라미터의 일부만 넘기면 이를 partially applied 라고 한다.
그리고 이때 파라미터는 _(underscore)가 대신한다.
scala> def fully(a:Int, b:Int, c:Int){
     | val sum = a + b + c
     | println("sum : " + sum)
     | }
fully: (a: Int, b: Int, c: Int)Unit
scala> fully(1,2,3)
sum : 6
scala> val partially = fully _
partially: (Int, Int, Int) => Unit = <function3>
scala> partially(1,2,3)
sum : 6

참고) http://en.wikipedia.org/wiki/Currying 

Posted by zeide
,
갓난 스칼라 스터디 모임이 유년기 커뮤니티로 자라났습니다.

아직 적절한 명칭이 없어서 일단 한국 스칼라 사용자 모임이라고 부릅니다.

http://groups.google.com/group/scala-korea?hl=en

스칼라를 함께 하고 싶으신 분은 어서어서 가입하세요.

위트있는 명칭이 있으면 그룹스에 제안해주시면 됩니다.
Posted by zeide
,
부제: 한국스칼라유저모임을 꿈꿔도 될까.

벌써 4개월전이 되어버린 KSUG의 세미나. 그때 첫 세션이었던 scala라는 언어를 들었을 때 피곤한 몸과 마음에도 왠지 모르게 재밌을 것 같다는 느낌을 받았다. 그리고 5월에 우연(?)하게도 scala스터디에 참여할 수 있는 기회가 생겼다. 사실 나는 프로그래밍의 P도 모르는 유치원아 수준이라서 나름 떨렸지만 어느새 기회를 덥썩 물고는 뻔뻔스럽게도 어떤 자리가 명당인가 파악하고 있었다.

업계 경험도 없고 해본 건 자바 조금, 자바스크립트 조금이라서-제대로 할 줄 아는게 없다는 말-함수형언어라는 것이 정말로 생소했다. 음... 그냥 솔직하게 말하면 이번에 처음 들어봤다. 하하하.
//java
public void main(String [] args){ }
//scala
def main(args: Array[String]) = { }
뭔가 귀여운 맛이 나는 코드라고 생각한다.

var는 var요, val은 val이로다.
중간에 조금 휴식기가 있었지만 5월부터 8월까지 빠짐없이 스터디에 참여한 결과를 전체적으로 보자면

1. 새로운 언어를 배우는 것은 재미있다.
2. 다른 사람과 같이 하면 동기부여가 된다.
3. 자발적 참여는 능력을 향상시킨다.
이렇게 좋은 영향도 있지만

1. 너무 생소하여 삽질을 하다 포기에 빠져버린다.
2. 비교 대상이 극상일 경우 좌절부여가 된다.
3. 능력에 맞지 않은 자발은 타인의 구타본능을 유발한다.
이러한 안좋은 사례도 발생한다.

좋은 사람들을 만나서 즐겁게 스터디를 해서 행복하다.
여러분, 개발자는 좋은 사람입니다!
개발자를 사랑해주세요~ 흑흑.

끝으로 스터디를 이끌어주신(리드보컬&&음료제공&&장소협찬) nephilim, 고맙습니다 :-)
그리고 fupfin님, 너구리님, 맹수님, 오리대마왕님, Outsider님, 아롱님, Miracle님, daclouds님, 윤군님.
모두모두 고생하셨습니다 :-)
(기억나는 분들만 나열했습니다...돌아서면 까먹는지라..)

추가) 스칼라스터디 덕분에 자바를 다시 돌아보게 되었다.
스터디 최고의 적은...아마도 주말근무와 주말에 가는 워크샵이 아닐까?
앗...대안언어축제 얘기는 안썼네요.
Posted by zeide
,
http://blog.outsider.ne.kr/508
Outsider님께서 올려주신 windows에서 설정하기를 해보았으나
결과가 자꾸 MS949로 나오길래 nephilim님께 문의를 했더니 답이 바로 나왔습니다.


저 열심히 scala파일을 수정하고 있었습니다(笑).
데굴데굴데굴...
Posted by zeide
,
거북이는 여기에서 다운받아 설치를 하고 vimdiff는 여기에서 다운받아 설치를 한다.

거북이 버전.

먼저 .hgrc 파일을 수정한다.

[ui]
username = 유저네임
verbose = True
merge = tortoisemerge

[tortoisehg]
vdiff = tortoisemerge

[merge-tooles]
tortoisemerge.executable = tortoisemerge
tortoisemerge.args = $local $other $base -o $output
tortoisemerge.gui = True

1. 실패기에서 이어지는 부분이므로 앞부분이 궁금하면 이전 포스팅을 참고하면 된다.

2. 파일을 원하는 체인지셋으로 돌린다.

3-1. 이것은 잘 보면 실패한 내용임을 알 수 있다. merged - (not found) 머징의 결과를 출력할 파일이 없다. 이것은 .hgrc파일의 설정을 잘 못해서 나온 결과이다.

3-2. .hgrc파일을 수정하고 다시 실행하니 아래 쪽으로 머지대상 파일이 나온다.

4. 머지 성공.

5. 이번에는 head를 두 개로 나눠본다.

6. head의 한 부분을 커밋해본다.

7. 원하는 체인지셋으로 바꿔본다.


여기서 중요한 것은 바로 거북이를 사용한 머징샷이다.
이 과정을 위해 거북이로 머징을 대략 20번은 넘게 했다. 과정에서 빠진 부분이 있는데 바로 hg clone 이다.
백업파일을 만들어두면 테스트하던 폴더를 삭제하고 백업파일을 클론해서 사용하면 되기 때문에 그나마 소요 시간이 덜 걸렸다.

사실 .hgrc 파일의 내용이 맞는지는 잘 모르겠다. :-)

추가 hg 명령어 페이지
Posted by zeide
,
최근에 nephilim님으로부터 [머큐리얼(hg)을 사용하는 소스형상관리]를 사사하고 있다.
모든 작업은 기본적으로 머큐리얼이 설치된 상태에서 시작된다.

1. 저장소를 만들고 초기화하면 .hg가 생성된다.

2. 파일을 만들면서 3번의 커밋을 진행한다.

3. 로그를 확인하니 작업이 잘 진행되었다.

4. 다음 작업을 위해 파일을 백업한다.

5. 파일을 이전 버전으로 backout한다. 확인하면 2번째 커밋상태이다.

6. 파일을 봐도 이전버전. 그럼 rollback을 수행한다. 그리고 revert.

7. revert를 수행하면 현재 버전파일과 이전 버전의 파일(.orig)이 보인다.

8. .orig파일을 삭제하고 tip을 확인하면 마지막 커밋으로 되어있는게 확인된다.

9. 이번에는 각각의 파일을 이전 버전으로 돌리고 changeset도 되돌려 새로운 head를 만든다.

10. head가 2개로 나눠졌음을 알 수 있다.

11. 두 head의 머지를 수행하려고 했으나 성공하지 못했다.

12. 결과를 보면 파일이 충돌되었다.


이유는 머징툴이 설치가 안되어 있어서라고 nephilim님이 말씀하셨다.
그래서 나는 거북이를 설치하였다.

Posted by zeide
,
인텔리J에서 코드를 생성하면 자동으로 주석이 생기는데 주석에 있는 날짜가 한글로 나오는 바람에 인코딩문제가 발생한다. 디폴트로 파일을 생성하면 일단 x-windows-949로 잡혀있다. 이걸 UTF-8로 변환!


그리고
file - settings

하면 됩니다.
Posted by zeide
,

[Scala] Set 사용하기

Scala 2010. 6. 25. 17:42
PS [Set]예제

val feeds1 = Set("blog.toolshed.com", "pragdave.pragprog.com",
  "pragmactic-osxer.blogspot.com", "vita-contemplative.blogspot.com")

val feeds2 = Set("blog.toolshed.com", "martinfowler.com/bliki")

val blogspotFeeds = feeds1 filter ( _ contains "blogspot")

println("blogspot Feed : " + blogspotFeeds.mkString(", "))

콘솔에서 돌렸더니

D:\scala\workspace\shared-src\src\scala\ch8\collection>scala UsingSet.scala
blogspot Feed : pragmactic-osxer.blogspot.com, vita-contemplative.blogspot.com

Set에서 filter()를 사용하여 해당 문자("blogspot")를 포함하는 값을 모은다(Set은 immutable Set).
Posted by zeide
,

[Scala] Hello World

Scala 2010. 5. 21. 11:27
http://www.scala-lang.org/node/166

Hello World 찍기.


후-
Posted by zeide
,

[Scala] 컴파일 에러

Scala 2010. 5. 12. 23:22
Scalac internal error: class java.lang.ClassNotFoundException [java.net.URLClassLoader$1.run(URLClassLoader.java:200), java.security.AccessController.doPrivileged(Native Method), java.net.URLClassLoader.findClass(URLClassLoader.java:188), java.lang.ClassLoader.loadClass(ClassLoader.java:307), sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301), java.lang.ClassLoader.loadClass(ClassLoader.java:252), java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320), java.lang.Class.forName0(Native Method), java.lang.Class.forName(Class.java:169), org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:72)]

책에 나온 예제 코드를 돌렸는데 컴파일하다가 에러가 떴다.
구글링을 하니
It's important to know, what Scala compiler you use, with what libraries.
라고 하시네.

찾아보니까 JDK가 1.6인데 아래 레벨에서는 5.0으로 지정이 되어 있었다.

+)모듈세팅에서 scala 컴파일러 체크하고 apply 클릭
Posted by zeide
,