11월, 2013의 게시물 표시

터미널에서 스칼라 파일 직접 컴파일, 실행

항상 sbt나 eclipse 파일 받아서 실행시키다 보니 처음부터 만드는 방법을 아직 모르고 있다. 일단 컴파일및 실행. scalac -classpath ".:/외부라이브러리패스/*" demo.scala scala 클래스이름 스칼라의 기본 라이브러리만 사용하는 경우에는 classpath를 지정할 필요없지만 외부 자바라이브러리라도 사용하려면 위와 같이 지정해주어야 한다. 쌍따옴표(")를 사용하지 않으면 IO에러가 발생하며 *.jar와 같이 지정해 주어도 제대로 찾지 못한다. 앞의 '.'를 지정하지 않으면 scala 실행시 현재 디렉토리에서 클래스를 찾지 않는다. 반복적으로 사용하는 경우 .bash_profile에 다음과 같이 환경변수로 지정 export CLASSPATH=".:/외부라이브러리패스/*"

그 외 scala에서 함수 정의하기

def f1 = "Hello, world" def f2 = { "Hello, world" } def f3() = "Hello, world" def f4()() = "Hello, world" def f5 = () => "Hello, world" def f6() = () => "Hello, world" def f7 = () => ( () => "Hello, world" ) def f8(c: =>String) = c def f9(c: =>String) = () => c f1을 정의하고 나면 다음에 f1을 만날 때 "Hello, world"로 대치된다. f2는 f1과 동일하게 동작한다. {}안에는 여러 식을 사용할 수 있으며 마지막 식이 전체의 값이 된다. f3는 f1과 동일하다. 괄호없이 단순히 f3로 적어도 "Hello, world"값이 대치되며 f3()로 적어도 된다. f4는 f1, f3와 동일하게 사용할 수 있으나 f4, f4(), f4()() 모두 "Hello, world" 문자열로 대치된다. REPL에서 식을 입력해 보면 f1, f2는 String이지만 f3는 ()String f4는 ()()String이다. 일종의 currying이 아닐까 싶은데 인자가 없기 때문에 그냥 함수 이름만 적어도 여러 단계를 한번에 확장해 버리는 것 같다. f5의 type은 () => String이다. 다시 말해 f5는 아무런 인자도 가지지 않고 문자열을 반환하는 함수로 대치된다. 단순히 f5로 적으면 type과 함수임을 보여주며 실행시키려면 f5()와 같이 명시적으로 실행시켜야 한다. f6의 type은 ()() => String이며 단순히 f6를 입력하면 f5와 동일하게 보이나 f6()를 입력하면 문자열이 바로 반환되지 않으며 f6()()와 같이 ...

Scala에서의 9가지 함수 정의

def f1(n:Int) = println(n) def f2 = (n:Int) => println(n) 오랫만에 scalafx를 만져보다 위의 차이점에 대해 궁금하게 되었다. 결론부터 이야기하자면 f1은 하나의 정수 인자를 받아 출력하는 함수이며 f2는 하나의 정수인자를 받아 출력하는 함수를 반환하는 함수이다. f1의 type은 Int=>Unit이며 f2는 ()=>(Int=>Unit)이 되는 셈이다. StackOverflow 에는 Scala에서 함수를 정의하는 9가지 방법이라는 질문이 나와있다. def f1 = 10 def f2 {10} def f3 = {10} def f4() = 10 def f5() {10} def f6() = {10} def f7 = () => 10 def f8 = () => {10} def f9 = {() => {10}} 가장 좋은 평가를 받은 답을 간단히 요약하면 =을 사용하지 않은 함수 def는 Unit을 반환 하게 되므로 f1과 f5는 같은 함수이고 f2, f3, f4, f6는 아무런 인자를 가지지 않고 정수값을 반환하는 동일한 함수들이며 f7, f8, f9는 아무런 인자를 가지지 않고 정수값을 반환하는 함수를 반환하는 동일한 함수들이 된다. scalafx에서 이벤트 핸들러는 다음과 같이 실행하는데 keyHandler2를 keyHandler1과 같이 사용하지 못하는 이유를 찾아보다 알게 되었다. keyHandler2를 쓰려면 keyHandler2를 반환하는 handler2Wrapper와 같은 함수를 이용해야 한다. scene = new Scene { onKeyPressed = keyHandler1 } def keyHandler1 = (e:KeyEvent) => println(e.code) def keyHandler2(e:KeyEvent) = println(e.code) def handler2Wrapper:KeyEven...