lisp builder

23
Lisp Builder Groovy内部DSL限界突破の試み (JGGUG 変なモノ部門より) G*WS 第四回 2009/7/22 NTTソフトウェア 上原潤二 1 2009723日木曜日

Upload: junji-uehara

Post on 13-Jan-2015

1.112 views

Category:

Technology


1 download

DESCRIPTION

LispBuilder is lisp interpreter and parser implemented as Groovy’s Builder. LispBuilder accepts Lisp like expression, and can be evaluated on groovy.http://wiki.github.com/uehaj/LispBuilder

TRANSCRIPT

Page 1: Lisp Builder

Lisp BuilderGroovy内部DSL限界突破の試み

(JGGUG 変なモノ部門より)

G*WS 第四回 2009/7/22NTTソフトウェア 上原潤二

12009年7月23日木曜日

Page 2: Lisp Builder

言いたいこと2つ

22009年7月23日木曜日

Page 3: Lisp Builder

(1)LispBuilderとは何か

32009年7月23日木曜日

Page 4: Lisp Builder

(2)Groovy内部DSLは

どこまでやれんのか?

42009年7月23日木曜日

Page 5: Lisp Builder

やったこと2つ

52009年7月23日木曜日

Page 6: Lisp Builder

(その1)S式をGroovyとして書ける

Builderを作った6

2009年7月23日木曜日

Page 7: Lisp Builder

(その2)Lispインタプタを作った

72009年7月23日木曜日

Page 8: Lisp Builder

時間の関係上、説明はS式ビルダに絞ります

82009年7月23日木曜日

Page 9: Lisp Builder

例9

2009年7月23日木曜日

Page 10: Lisp Builder

10

def bx = new LispBuilder1()assert bx.build{progn ${defun; fib; ${n} ${IF; ${or; ${equal; n; $1}; ${equal; n; $2}} $1 ${add; ${fib; ${add; n; $(-1)}} ${fib; ${add; n; $(-2)}}}}} ${fib; $10}}.eval() == 55

クロージャ活用版2009年7月23日木曜日

Page 11: Lisp Builder

11

def bx = new LispBuilder2()assert bx.build{$($(progn, $(defun, fib, $(n), $(IF, $(or, $(equal, n, 1), $(equal, n, 2)), 1, $(add, $(fib, $(add, n, -1)), $(fib, $(add, n, -2))))), $(fib, 10)))}.eval() == 55

invokeMethod活用版2009年7月23日木曜日

Page 12: Lisp Builder

12

def bx = new LispBuilder3()assert bx.build{[[progn, [defun, fib, [n], [IF, [or, [equal, n, 1], [equal, n, 2]], 1, [add, [fib, [add, n, -1]], [fib, [add, n, -2]]]]], [fib, 10]]]}.eval() == 55

リストリテラル活用版2009年7月23日木曜日

Page 13: Lisp Builder

13

LispList(Cons)

eval()apply()

${defun; fib; ${n} ${IF; ${or; ${equal; n; $1}; ${equal; n; $2}} $1 ${add; ${fib; ${add; n; $(-1)}} ${fib; ${add; n; $(-2)}}}}}${fib; $10}

$(defun, fib, $(n), $(IF, $(or, $(equal, n, 1), $(equal, n, 2)), 1, $(add, $(fib, $(add, n, -1)), $(fib, $(add, n, -2))))),$(fib, 10)

[defun, fib, [n], [IF, [or, [equal, n, 1], [equal, n, 2]], 1, [add, [fib, [add, n, -1]], [fib, [add, n, -2]]]]],[fib, 10]

LispBuilder1

LispBuilder2

LispBuilder3

2009年7月23日木曜日

Page 14: Lisp Builder

14

Lisp ( ) 1 1.3 “ABC” 区切り

LispBuilder1 ${ } $1 $(1.3) $”ABC” ; or 改行

LispBuilder2 $( ) 1 1.3 “ABC” ,

LispBuilder3 [ ] 1 1 “ABC” ,

2009年7月23日木曜日

Page 15: Lisp Builder

Groovyによる内部DSL定義能力の限界について

152009年7月23日木曜日

Page 16: Lisp Builder

予約語に別の意味を与えることはできない

(対策)if→IFで置き換え

162009年7月23日木曜日

Page 17: Lisp Builder

カンマやピリオドの区切り無しでトークンを連ねることはできない(文法違反)

○ a b ○ a.b.c○ a b,c × (a,b,c)× a b c

172009年7月23日木曜日

Page 18: Lisp Builder

クロージャをトップレベルには書けない(ブロック文と曖昧)

c = { .. } : クロージャif (..) { .. } : ブロック{ .. } : 曖昧(文法エラー)

182009年7月23日木曜日

Page 19: Lisp Builder

AST変換は強力だがGroovy文法に反するものは扱えない(前述制限はそのまま)

192009年7月23日木曜日

Page 20: Lisp Builder

結論20

2009年7月23日木曜日

Page 21: Lisp Builder

変なことをやるのには限界がある

212009年7月23日木曜日

Page 22: Lisp Builder

普通にしてればあまり困らないのではないかと

222009年7月23日木曜日

Page 23: Lisp Builder

http://github.com/uehaj/

LispBuilder/23

2009年7月23日木曜日