kiyoka.2011_04_30 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2011_04
555323355545555455555555555545455555555555554545555555555555545
5

[Nendo][Scheme] let-syntaxの実装方法の検討

5

オレ処理系のNendoについての開発メモ。

5
 SYKjVO
3

 

2

( ※ この記事中のやりかたは全くの間違いだとわかったので、信じないようにお願いします。後日、正しい内容をまとめます )

3

 

3

 

5

let-syntaxの実装方法を検討中。

5

 

5

概要

4

次のような手順でマクロ展開しようと考えている。

5
 ソースコード → 内部表現1  → 内部表現2  → 展開形
5

 

5

 

5

ソースコード → 内部表現1

4

[ソースコード]

5
(define (a-topleve-func arg1 arg2 ...)
5
  (let-syntax ((name1 (syntax-rules ...))
5
               (name2 (syntax-rules ...)))
5
    ... body1 ...
5
    (letrec-syntax ((name1 (syntax-rules ... ))
5
                    (name2 (syntax-rules ... )))
5
      ... body2 ...)))
5

Rubyでマクロ展開する時に少しでも楽をするために、Nendoの初期化スクリプト(init.nnd)でlet-syntaxとletrec-syntaxを両方とも%lexical-define-syntaxを使った内部表現に変換する。

5

let-syntaxとletrec-syntaxの二つは伝統的マクロで以下の形に変換する。

5

let-syntaxのほうだけ、束縛するキーワードの数だけネストさせた形にする。

5

letrec-syntaxのほうは、キーワードが %lexcal-define-syntaxになるだけで、フォームの変形は行わない。

5

 

4

 

5

内部表現1 → 内部表現2

4

[内部表現1]

5
(define (a-toplevel-func arg1 arg2 ...)
5
  (%lexical-define-syntax ((name1 (syntax-rules ...)))
5
      (%lexical-define-syntax ((name2 (syntax-rules ...)))
5
          ... body1 ...
5
          (%lexcal-define-syntax ((name1 (syntax-rules ...))
5
                                  (name2 (syntax-rules ...)))
5
             ... body2 ...))))
5

Rubyで実装したマクロ変換器で、%lexcal-define-syntaxの (syntax-rules ...)部分を実行形式にコンパイルする。

5

実行形式へのコンパイルはNendoのBuilt-in関数であるevalを呼べばいいので、Rubyとinit.nndのどちらでも書ける。

5

(Nendoではsyntax-rules手続きを呼びだせば、LispSyntaxクラスのインスタンスが返ってくる)

5

 

5

変換後は以下のような内部表現になる。(#<LispSyntax>は説明用の便宜上の表現)

5

 

4

 

5

内部表現2 → 展開形

4

[内部表現2]

5
(define (a-toplevel-func arg1 arg2 ...)
5
  (%lexical-syntax ((name1 . #<LispSyntax>))
5
    (%lexical-syntax ((name2 . #<LispSyntax>))
5
       ... body1 ...
5
       (%lexcal-syntax ((name1 . #<LispSyntax>)
5
                        (name2 . #<LispSyntax>))
5
          ... body2 ...))))
5

ここまで来れば簡単だ。

5

Rubyでのマクロ変換器を拡張して、%lexical-syntaxにぶら下がっているキーワードを拾いながら再帰的に body1 や body2 の S式を変換していけばいい。

5

もちろん、レキシカルスコープを持っているので同名のキーワードが出現すれば内側のキーワードでシャドウしながら適用する。

5

 

5

ブログを書いている時点では[内部表現1]→[内部表現2]→[展開形]の部分だけ動いている。(キーワードがちゃんとレキシカルスコープになっているかまではテストできていないが)

5

さて、実際に全体が動くかやってみよう。

5

 

4

 

5

...comment disabled...