lisp builder
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/LispBuilderTRANSCRIPT
![Page 1: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/1.jpg)
Lisp BuilderGroovy内部DSL限界突破の試み
(JGGUG 変なモノ部門より)
G*WS 第四回 2009/7/22NTTソフトウェア 上原潤二
12009年7月23日木曜日
![Page 2: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/2.jpg)
言いたいこと2つ
22009年7月23日木曜日
![Page 3: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/3.jpg)
(1)LispBuilderとは何か
32009年7月23日木曜日
![Page 4: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/4.jpg)
(2)Groovy内部DSLは
どこまでやれんのか?
42009年7月23日木曜日
![Page 5: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/5.jpg)
やったこと2つ
52009年7月23日木曜日
![Page 6: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/6.jpg)
(その1)S式をGroovyとして書ける
Builderを作った6
2009年7月23日木曜日
![Page 7: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/7.jpg)
(その2)Lispインタプタを作った
72009年7月23日木曜日
![Page 8: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/8.jpg)
時間の関係上、説明はS式ビルダに絞ります
82009年7月23日木曜日
![Page 9: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/9.jpg)
例9
2009年7月23日木曜日
![Page 10: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/15.jpg)
Groovyによる内部DSL定義能力の限界について
152009年7月23日木曜日
![Page 16: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/16.jpg)
予約語に別の意味を与えることはできない
(対策)if→IFで置き換え
162009年7月23日木曜日
![Page 17: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/17.jpg)
カンマやピリオドの区切り無しでトークンを連ねることはできない(文法違反)
○ a b ○ a.b.c○ a b,c × (a,b,c)× a b c
172009年7月23日木曜日
![Page 18: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/18.jpg)
クロージャをトップレベルには書けない(ブロック文と曖昧)
c = { .. } : クロージャif (..) { .. } : ブロック{ .. } : 曖昧(文法エラー)
182009年7月23日木曜日
![Page 19: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/19.jpg)
AST変換は強力だがGroovy文法に反するものは扱えない(前述制限はそのまま)
192009年7月23日木曜日
![Page 20: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/20.jpg)
結論20
2009年7月23日木曜日
![Page 21: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/21.jpg)
変なことをやるのには限界がある
212009年7月23日木曜日
![Page 22: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/22.jpg)
普通にしてればあまり困らないのではないかと
222009年7月23日木曜日
![Page 23: Lisp Builder](https://reader034.vdocuments.site/reader034/viewer/2022050801/54b43a0b4a79598e638b473e/html5/thumbnails/23.jpg)
http://github.com/uehaj/
LispBuilder/23
2009年7月23日木曜日