Lisp Builder

Post on 13-Jan-2015

1.102 views 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 of Lisp Builder

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

(JGGUG 変なモノ部門より)

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

12009年7月23日木曜日

言いたいこと2つ

22009年7月23日木曜日

(1)LispBuilderとは何か

32009年7月23日木曜日

(2)Groovy内部DSLは

どこまでやれんのか?

42009年7月23日木曜日

やったこと2つ

52009年7月23日木曜日

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

Builderを作った6

2009年7月23日木曜日

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

72009年7月23日木曜日

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

82009年7月23日木曜日

例9

2009年7月23日木曜日

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日木曜日

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日木曜日

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日木曜日

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日木曜日

14

Lisp ( ) 1 1.3 “ABC” 区切り

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

LispBuilder2 $( ) 1 1.3 “ABC” ,

LispBuilder3 [ ] 1 1 “ABC” ,

2009年7月23日木曜日

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

152009年7月23日木曜日

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

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

162009年7月23日木曜日

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

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

172009年7月23日木曜日

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

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

182009年7月23日木曜日

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

192009年7月23日木曜日

結論20

2009年7月23日木曜日

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

212009年7月23日木曜日

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

222009年7月23日木曜日

http://github.com/uehaj/

LispBuilder/23

2009年7月23日木曜日