Nendo.DONE RSSPLAIN

Related pages: Nendo.TODO
5555555552222555555555554333333111111151525555333333111111555431155544555555555555555555555555555555555444454433333422222223111111111100000200000000100000444444224455
5

Nendoの完了済項目

5

TODOリストはNendo.TODOを参照してください。

5

 

5

仕様関連

5
done 識別子にR5RSで定義された拡張アルファベット文字をサポートする
5

Rubyのローカル変数の識別子のルールとおりあいが付かない場合は、それも含めて仕様を決める

5
  以下はR5RSに記載された拡張アルファベット文字
5
  ! $ % & * + - . / : < = > ? @ ^ _ ~
5
    => 例外として1文字の . と 2文字以上連続する :: と _ は無変換で通すようにした。それ以外は LispからRubyに変換うする時に _XXMARK という文字列に置換する。
2
done Nendo本体をNendoモジュール化する (module Nendoで括る)
2
done Nendoのトップレベルの関数に限り、Rubyのメソッド化する。
2

問題点:   現在は、トップレベルのプロシジャは @_func.call という形式で呼びだすのでバックトレースに関数名が表示されない。

2

解決事項: Rubyが出力するバックトレースにNendoの関数名が見える様になる。

5

 

5
done 多値をサポートする ( values と call-with-values と receive )
5

目的は Gaucheの html-liteモジュールをポーティングするため

5
done Gaucheと同様のkeywordをサポートする
5

目的は Gaucheの html-liteモジュールをポーティングするため

5

 

5
done RubyのHashクラスへのアクセス方法を検討
5
    => Gaucheの hash-table-xxxx系のライブラリを参考にAPIを決めた。
5

 

5
done (. Class method) 形式の構文を高度化する。
5

例えば、(. "100" to_i) や (. (Date.new) to_s) 等でも動くようにしたい。(0.2.0時点では動かない)

4
done *nendo-version*の様な、言語処理系のバージョンを取得する変数または関数を用意する。
3
done Nendo処理系自身のコマンドラインをNendoのユーザスクリプトから隠す。
3
done RubyのArrayクラスへのアクセス方法を検討。
3

RubyのArrayはSchemeのvectorとしてしまって問題が無いか。どういう制限があるかをまとめる。

3
done Schemeの #x などの基数接頭辞をサポートする。
3
done S式の外部表現ではtrueとfalseはSchemeと同じ #t #f にする。(他のScheme処理系でそのまま読みこめるチャンスを増やすため)
3
done ユーザスクリプトにmain関数が存在したら、スクリプトロード直後に呼び出すようにする
1
done ライブラリの読み込み用の use マクロを追加する。
1
(load-library "text/tree")
1

以下の記述も可能にする。

1
(use text.tree)
1
done NendoのクロージャをRubyのブロックに変換する方法を考える
1

Rubyのライブラリの中にブロック引数を要求するものが多いため。これができないとgemライブラリのAPIの一部が利用できない。

1
done with-open を Rubyのブロック引数を使った実装に書き直す。
5

 

1

 

5

機能追加

2
done 末尾再帰最適化(ループ化)をサポートする。無限ループを作れるようにするため。
5
done Gaucheの #?= のようなデバッグ表示の仕組を追加する。
5
done letrecを実装する。
5
done ローカル関数をletrecに変換する仕組を組みこむ。
5
done pretty-printを書きなおす。
3
done NendoのスクリプトをRubyスクリプトにコンパイルする機能を追加する
3
done Nendoにコンパイル結果を自動キャッシュする機能を付ける
3

参考: Mosh にコンパイル結果をキャッシュする機能を追加 - ひげぽん OSとか作っちゃうかMona-EXT

3
  => 断念
3
  Nendoではキャッシュをしても高速化できないことが分かった。
3
  nendo自体の起動時間が長すぎて、その直後にコンパイル済スクリプトをRubyでevalしても限界がある。
1
done Gaucheの #/正規表現/ 形式のリテラルをサポートする
1

但し、Gaucheとは異なり、RubyのMatchDataオブジェクトを返すが、そのオブジェクトに対するアクセスAPIはGaucheにあわせる。

1
done コンパイル結果をdisasmして見れる機能を実装する。
1
done RubyからNendoの関数を呼び出せるようにする。
1

例えば、Rackのアプリケーションクラス内から、Nendoでコーディングしたアプリケーションのエントリポイントが呼び出すことをしたい。

1
done 括弧の対応がマッチしないエラーにおいて、ソースファイルと行番号を表示する。
5

 

5

ライブラリ

5
done Gaucheのhtml-liteのポーティングを行う
4
done load-libraryするだけで、#?=の出力先がsyslogに切りかわるライブラリを追加する
3
done fold系関数を実装する。(max,min関数内で呼び出されている)
1
done Gaucheのgauche.testに近いインターフェースのテストライブラリをサポートする。
1
done 比較関数を引数に取るsortの整備(なるべくRubyのsortアルゴリズムの資産を使える方法で実装したい)
5

 

5

高速化

5
done コンパイル済みNendoプログラム(Rubyコード) .nndc をロード出来るようにし、起動時間を短縮する。
4
done macroexpandを高速化する(equal? の呼び出し回数に大量の無駄がある)
4
done self.instance_variables.include? メソッドでグローバルバインドがされているかどうか動的にチェックしている所をHashで代用して高速化する。
5

 

5

バグ修正

5
done set!が正常にグローバル変数に代入できない。
5
done named letが正しく動かない。
5
done apply が正しく動かない。
5
done (lambda (first . rest)) のrestに '() が入ってきた時の扱いに間違いがある。
5
nendo> (define (func first . rest)
5
  (write first)
5
  (newline)
5
  (write rest)
5
  (newline))
5
nendo> (func '(a) '())
5
(a)
5
()
5

正しくは、以下の通り

5
gosh> (func '(a) '())
5
(a)
5
(())
5

 

5
done '(a b . ()) のようにリストの末尾が dotted listで空リストがぶらさがっている時の処理がおかしい
5
nendo>'(a b . ())
5
(a b ())
5

正しくは、以下の通り

5
gosh> '(a b . ())
5
(a b)
5

 

5
done condフォームのbody省略ができない
5

下記がエラーになる

5
 (cond ((条件))
5
    )
5

 

5
done (gensym)の生成するシンボルが、コンパイル済みファイルとユーザースクリプト間でコンフリクトする恐れがある。
5

 

4
done 手続き呼び出しの実装方法に勘違いがある
4
((if #f + *) 3 4)
4
   => #<Proc:0x45e5f8 (lambda)>
4

正しくは 12 が返る必要がある。

5

 

4
done pair? と list? が別名として実装されている。 list? はドットリストの場合は #f を返さなければならない。
4

 

3
done 関数のbody部の 0 の評価がエラーになる
3
(define (foo)
3
  (display "a")
3
  0)
3
 → undefined method `car' for 0:Fixnum
4

 

2
done nullリストをconsした時のバグ
2
(cons (cdr '(100)) '())
2
 正: => (())
2
 誤: => ()
2
(cons (cdr '(100)) (cdr '(100)))
2
 正: => (())
2
 誤: => ()
3

 

1
done JRuby 1.5.xでテストが通らなくなっているので、修正する。
1
done 末尾再帰最適化がされないパターンがある
1

される:

1
(define (func arg)
1
  (letrec ((foo (lambda (x) foo(x))))))
1

されない: (内部でletrecに展開され上記のコードと同等になるはずなのに...)

1
(define (func arg)
1
  (define result 0)
1
  (define (foo x) (foo x)))
1
done 閉じカッコ ')' が多すぎた場合、replが無限ループする。
0
done 文字列同士の比較が#fになる場合がある。
0
 LispStringとStringのequal?が#fになってしまうバグ。
0
nendo >(equal? (read-from-string "\"100\"") (. 100 to_s))
0
#f
0

同じ "100" という文字列なので結果が #t にならないといけない。

2

 

0
done case構文の ((datum ...) body) の扱いがおかしい。
0
(case (car '(a b c d))
0
  ((a) 'a)
0
  ((b) 'b))
0

正常:

0
 => a
0

バグ:

0
 => Error: undefined variable _a
1

 

0
done method_missing()に無駄なコードがあるので外す
0
sym = toRubySymbol( name )
0

 

0

 

0

 

4

その他

4
done CRubyとJRubyの仕様の違いを吸収している箇所を外す。(将来のバージョンでJRuby側がCRubyに合わせてくれるため)
4
 kiyoka.2010_04_17のブログエントリ『 [JRuby][Ruby] CRuby-1.9.1とJRuby 1.5.0-RC1の挙動の違いを発見』の件
4
done rubyに指定している -W0 オプションを外す。
4
done 全てのソースコードに修正BSDライセンスのCOPYRIGHT文章を貼りつける。
4
done 例外がraiseされた時、Nendoのユーザスクリプト中の行番号もバックトレースに表示されるようにする。
2
done nendo.rb内のrepl部分のリファクタリングを行う。
2
done nendo.rb内のmacroexpandとmacroexpand-1の重複コードをまとめる。
4

 

4

 

5

質問・要望など、コメントおねがいします

5

...comment disabled...