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

Lisp Builder

Jan 13, 2015

Download

Technology

Junji Uehara

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
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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日木曜日