24
SIP-17 Type Dynamic Daegeun Kim ( [email protected] ) Monday, January 7, 13

SIP-17 Type Dynamic

Embed Size (px)

DESCRIPTION

SIP-17 Type Dynamic 소개

Citation preview

Page 1: SIP-17 Type Dynamic

SIP-17 Type DynamicDaegeun Kim ([email protected])

Monday, January 7, 13

Page 2: SIP-17 Type Dynamic

Type Dynamic

SIP-17 (Scala Improvement Process)

마틴 오더스키가 제안한 개선사항

좀 더 유연한 DSLs을 제공하기 위함

정적 타입의 경우 존재하는 멤버(변수, 메서드 등)만 접근하거나 호출할 수 있다.

그렇다고 런타임시에 뭔가 동적으로 뭔가 수행하는 것은 아니다.

DSL : Domain-Specific Language

Monday, January 7, 13

Page 3: SIP-17 Type Dynamic

class A

val a = new Aprintln(a.name) // error

선언된 클래스 A는 name이라는 멤버변수가 없다. 기본적인 내용이지만 짚고 넘어갑니다.

Monday, January 7, 13

Page 4: SIP-17 Type Dynamic

SIP-17 : 특징을 알아볼까요!

Monday, January 7, 13

Page 5: SIP-17 Type Dynamic

selectDynamic

존재하지 않는 멤버를 접근하는 경우 멤버명을 파라메터로 selectDynamic을 호출한다.

Monday, January 7, 13

Page 6: SIP-17 Type Dynamic

class A extends Dynamic { def selectDynamic(name: String) = ...}

val a = new Aprintln(a.name) // no error

존재하지 않는 멤버(변수, 메서드 등)을 접근해도 문제가 발생하지 않고 대신 해당 인스턴스의 selectDynamic 메서드에 “name” 문자열을 담은 name과 함께 호출한다.

Monday, January 7, 13

Page 7: SIP-17 Type Dynamic

updateDynamic

존재하지 않는 멤버를 수정하는 경우(xx.method = expr) updateDynamic 메서드가 호출한다. 단, update의 경우는 selectDynamic 선언이 필요하다.

Monday, January 7, 13

Page 8: SIP-17 Type Dynamic

class A extends Dynamic { def updateDynamic(name: String)(value: String) { ... }}

val a = new Aa.name = “Daegeun Kim”

존재하지 않는 멤버인 name 멤버를 “Daegeun Kim” 으로 변경하는 경우 updateDynamic(“name”)(“Daegeun Kim”) 으로 호출한다. 위의 선언에서 selectDynamic은 생략한다. value의 타입이 String일 필요는 없다.

Monday, January 7, 13

Page 9: SIP-17 Type Dynamic

applyDynamic

존재하지 않는 멤버 메서드를 호출하는 경우 메서드명과 함께 입력한 파라메터를 applyDynamic 메서드의 파라메터로 하여 호출한다.

Monday, January 7, 13

Page 10: SIP-17 Type Dynamic

class A extends Dynamic { def applyDynamic(name: String)(args: Any*) { ... }}

val a = new Aa.greeting(“Daegeun Kim”)

존재하지 않는 메서드인 greeting을 접근하는 경우 applyDynamic 메서드 호출하며 name은 “greeting” args는 WrappedArray(“Daegeun Kim”)이다. args을 굳이 Any* 로 규정할 필요는 없습니다.

Monday, January 7, 13

Page 11: SIP-17 Type Dynamic

applyDynamicNamed

존재하지 않는 멤버 메서드를 호출하는 경우 메서드명과 함께 입력한 파라메터를 applyDynamicNamed 메서드의 파라메터로 하여 호출한다. 단, applyDynamic과 다른 점은 이름에서도 알 수 있듯이 Named Parameter 형태일 때 호출한다.

Monday, January 7, 13

Page 12: SIP-17 Type Dynamic

class A extends Dynamic { def applyDynamicNamed(name: String)(args: (String, Any)*) { ... }}

val a = new Aa.greeting(name = “Daegeun Kim”, message = “Welcome”)

존재하지 않는 메서드인 greeting을 접근하는 경우 applyDynamicNamed 메서드 호출하며 name은 “greeting” args는 WrappedArray((name,Daegeun Kim), (message,Welcome) 이다.

Monday, January 7, 13

Page 13: SIP-17 Type Dynamic

사용하려면?

2.10.0 에서도 간혹 경우에 따라 오류가 나는 경우가 있습니다. 되도록이면 RC버전이 아닌 2.10.x 버전에서 실행하세요. 2.9버전에서는 -Xexperimental 을 주고 실행하면 되지만 잘 안됩니다.

Monday, January 7, 13

Page 14: SIP-17 Type Dynamic

scalac -language:dynamics

scala -language:dynamics

import language.dynamics

SIP-18 - Modularizing Language Features 추가된 기능이고 dynamics feature를 활성화 시키는 방법 설명입니다. SIP-18 또한 2.10 부터 정식 추가된 기능입니다.

Monday, January 7, 13

Page 15: SIP-17 Type Dynamic

알고보면 단순한 구조

Monday, January 7, 13

Page 16: SIP-17 Type Dynamic

컴파일타임에 코드를 재작성한다.

Monday, January 7, 13

Page 17: SIP-17 Type Dynamic

물론, Dynamic 를 붙인 것 만 작업

Monday, January 7, 13

Page 18: SIP-17 Type Dynamic

멤버(변수, 메서드) 없을 때만 해당!

Monday, January 7, 13

Page 19: SIP-17 Type Dynamic

selectDynamic

val a = new Aa.name

// a.selectDynamic(“name”)

Monday, January 7, 13

Page 20: SIP-17 Type Dynamic

updateDynamic

val a = new Aa.name = “Daegeun Kim”

// a.updateDynamic(“name”)(“Daegeun Kim”)

Monday, January 7, 13

Page 21: SIP-17 Type Dynamic

applyDynamic

val a = new Aa.greeting(“Daegeun Kim”)

// a.applyDynamic(“greeting”)(WrappedArray(“Daegeun Kim”))

이전의 예를 기준으로 했을 때 위와 같이 재작성되고 항상 이렇게 되는건 아닙니다.

Monday, January 7, 13

Page 22: SIP-17 Type Dynamic

applyDynamicNamed

val a = new Aa.greeting(name = “Daegeun Kim”)

// a.applyDynamic(“greeting”)(WrappedArray((name,“Daegeun Kim”)))

Monday, January 7, 13

Page 23: SIP-17 Type Dynamic

필요한 곳에만 사용합시다.

필요한 곳에 시기적절하게 사용하는 것이 좋을 것 같고 제안한 목적처럼 유연한 DSL 구조를 가질 수 있는 곳에 사용하는 것이 좋다고 봅니다.

Monday, January 7, 13

Page 24: SIP-17 Type Dynamic

그럼 이만 마치도록 하겠습니다. 질문이 있으신가요? :-) 성의없지만 이렇게 마무리. 그리고 틀린 것이 있다면 조언 부탁드립니다.

Monday, January 7, 13