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