done list - y2q-actionman/zatuscheme GitHub Wiki

;; -*- mode: org; coding: utf-8 -*-

new->old順

HEAD

<2014-03-31 月> やっおたこず

  • %multiple-value-prog1 を実装
  • 耇玠数 fallback. fetestexcept で domain error を拟う。
  • Continuation 型を削陀。 VM を Lisp_ptr に詰められるように
  • eq_internal を inline 化
  • Lisp_ptr の int wrap 郚分を共通化 enable_if 無双のこず
  • 環境を返す関数 (やらなかった) interpreted 関数は環境を立おるので、倖の環境を返せないはず

<2013-07-10 æ°Ž> cleanup

  • quasiquote syntax-rule化
  • Winline 調敎 Lisp_ptr::get<> のチェックを assert 化

<2013-07-05 金> cleanup

  • -Wswitch-enum いく぀かの if/else 連鎖を、 switch に眮きかえ。

<2013-07-04 朚> 倧文字、小文字

以䞋のように決定

identifier
小文字。 ZS_IDENTIFIER_CASE マクロ。 configure では指定できない。 これを倧文字にしようずするず、埋め蟌みリテラルを 党郚眮きかえるこずになり、面倒なため。 C++11リテラルが䜿えれば、楜になる可胜性はあるかも。
case-insensitive 文字比范
zs_case.hh の zs_charcasecmp()
case-insensitive 文字列比范
zs_case.hh の zs_strcasecmp() この代替実装では、 tolower を䜿甚しおいる。
  • tolower の䜿甚箇所 この二箇所のみ
    1. zs_case 内 (ZS_IDENTIFIER_CASE, zs_strcasecmp)
    2. Scheme の tolower 実装。

<2013-07-03 æ°Ž> cleanup

  • (なし) デバッグ関数に attribute cold を付けお回る遊び
  • undefined/uninitialized な倀の初期化をサボる 䞀箇所発芋した。
  • Passing::quote 時の Variadic call 芏玄を倉曎。この時は、native関数でも list が枡っおくる。 Passing::whole をいく぀か远い出せた。
  • autoconf で __cplusplus を芋おC++0xコンパむラ刀定 ax_cxx_compile_stdcxx_11 を䜿甚 https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html

<2013-07-02 火> cleanup

  • throwする関数を䜜る バむナリサむズ的に、珟堎で throw するよりも noreturn な関数を呌んだ方がいい。
  • 型名の呜名芏玄を統䞀する
    class
    UpperCamelCase. (陀: Lisp_ptr)
    struct
    党裞な型. UpperCamelCase. (陀: to_type<>)
    enum
    党お enum class. UpperCamelCase. (陀: Ptr_tag)
  • inline関数のinline宣蚀 header では䞀切宣蚀しないこずにした。どう定矩されおも関係ないだろう・・ (inline があったら、 .i.hh にある、ずいうのは分かりやすいかもしれんが)
  • macro transformer 手続きにも名前をあげる vm_op_define (旧 vm_op_local_set) であげるこずに

<2013-06-27 朚> cleanup たずめ

  • srfi-0
  • テストのscheme化 case倉曎でテストが壊れるず面倒。
  • tmpfile(3)盞圓
  • exit で終了ステヌタスを返せるように
  • Tokenizer敎理 Token型はなくなり、Lisp_ptrに統合された。
  • .scm inclusion
  • 匕数のバリ゚ヌションがある関数 native 関数はほが匕数固定に。 .scm でデフォルト匕数を付加する。
  • 䟋倖型敎理・・ずいうよりなくした。 文字列しか飛んでこない。どうせcondition型もないので。
  • (なし) syntax-rules での traversal をたずめる 埮劙なハンドラばかり増えお、うれしくない。
  • EOFをたずもに扱えるように
    • tokenize() -> EOF にいったら EOFを返す。
    • read() -> list等の䞭で EOF だず゚ラヌ。さもなくば EOF を返す。
  • VM初期化の敎理 VMが、static倉数の初期化順序に䟝存しおおり、あぶない状態だった。 珟圚は、初期化関数で初期化されるように修正枈み。

<2013-06-19 æ°Ž> cleanup たずめ

  • evalを再垰させるず壊れる 再垰を「慎重に」陀いた。
  • procflag凊理 letの非native化に䌎い、Entering flag はなくなっお䞀気に敎理された。
  • let実装 R5RS定矩をそのたた採甚
  • std::get みたいに list に觊るinterface 結構昔に、 nth_cons_list ずか䜜っおた。
  • 先頭をずりのぞくために、ConsIter を䜿う nth_cons_list にしたり。

<2013-06-06 朚> error handling

  • srfi-23, srfi-34
  • repl での eval を ignore-errors で囲む
  • test-error も盎す

<2013-04-24 æ°Ž> GC

結局、Lisp_ptrの構造そのたたに実装

<2013-04-22 月> rationalize

連分数展開で実装

<2013-04-21 日> rationalize

Wikipedia から連分数展開を参照し、それを䜿甚 http://en.wikipedia.org/wiki/Continued_fraction#Infinite_continued_fractions

<2013-04-19 金> 有理数型

rational.* を远加。 ぀いでに、敎数オヌバヌフロヌ確認を有理数型で扱うこずずし、普通の敎数 型でも有理数偎に䞀旊入れお扱うように。たぶん重いがすっきりした。

<2013-04-18 朚> R5RS pitfalls を倒した

  • 匕数の arity 確認が間違い。 call/cc に枡される関数は厳密に䞀぀の匕 数を取らねばならなかった。実際には、0以䞊取れればよい。
  • 匕数の凊理䞭に call/cc で脱出した堎合、挔算子が関数でなくおも゚ラヌ にならない。=(0 (cont 100))= みたいな匏で、 cont が継続ならば、 ゚ラヌにしおはいけない。ad-hoc な察凊でカバヌ。

<2013-04-11 朚> IProcedure に名前を持たせた

named let のバグ修正の䞀環。 named let の名前は、 let の binding し おる所から参照できおはいけない。぀いでに define された手続きも名前を あげるように。

ラムダ匏の組みあわせで衚珟できそうなのだが、楜なのを採甚した。

<2013-04-11 朚> integer overflow 察策

integer overflow で real に fallback。

long long を䞀回経由する圢で実装しおいる。敎数型を倉えずにやる手も色々 ありそうだが、耇雑になり確認が難しく保守できなくなるこずは芋えおいる。

<2013-04-08 月> builtin_number 曞きなおし

数倀関数の実装がぐしゃぐしゃだったのを敎理。 ちょっずした甚途ごずにちたちたヘルパヌを曞いおいたのを改め、 倧䜓が拟える統䞀的むンタヌフェむスに眮きかえ。

<2013-04-03 æ°Ž> Number型陀去

int, double,complex は Lisp_ptr ず Token に入れこたれた。

<2013-03-06 æ°Ž> ‘char-ready?’ を実装した ぀もり

珟圚、 C++ の範囲で出来るこずだけしおある。 ラむブラリ䟝存 (libstdc++) のむンタヌフェむスには降りおいっおいない。

暙準 C++ の範囲で

std::basic_streambuf<>::in_avail() 関数が匷力で、倧郚分はこれで終 わっおいる。この関数は、バッファの持぀残り文字数を返すだけでなく、バッ ファが空の堎合には䞋請けの showmanyc() を呌び、持っおいる fd ずか から読める文字数を芋積もろうずする。そのため、この関数の返り倀を芋る だけで、実装の倧半は終わる。

ずころが、 char-ready? は、「port がファむルの終わりに到達したずき に、 #t を返す」こずを求めおいる。 in_avail() は、ファむルの終わりに 到達したずきず、読み蟌みを䞀文字も出来ずにブロックするずきの䞡方で 0 を返しおくるため、この二者を区別しないずいけない。

ファむルの終わりに到達したあず、䞀文字でも読んでいた堎合は、䞊方の stream 等に eofbit が立぀ので、それを芋ればよい。しかし、そもそもブ ロックするものは読んではいけないし、たずえブロックしないず(神秘的な 力で)予枬できおも、「前回の読み蟌みで䞁床ファむルの終わりを指した」 ずいう堎合を䞊手く扱えない。 他の get的な関数は、圓然ブロックするの で䜿えない。 pubseekoff() で䜍眮を芋おみるこずを考えたが、 pubseekoff() も(なぜか)ブロックするので、ブロックしないで怜査する ずいう甚途には䜿えなかった。

珟圚のコヌドは、この先の刀定はやっおいない。先に、どうあるべきか考え たい。

libstdc++ 䟝存

暙準 C++ を逞脱しお、 libstdc++ 䟝存の局に降りおいくず、ずりあえずの 解法はある。

in_avail() が 0 を返した堎合、 dynamic_cast をかけお、型を取りだ しお分岐する。

  • __gnu_cxx::ext/stdio_filebuf の堎合

    どうやら libstdc++ で std::sync_with_stdio(false) をかけるず、 std::cin がこの型になる。この堎合、 fd() 関数で file descripter を取れる。これがあれば、 poll(2) や lseek(2) でどうずで もなる。

  • __gnu_cxx::ext/stdio_sync_filebuf の堎合

    std::sync_with_stdio(true) の堎合の std::cin のようだ。 file() 関数で C の FILE 構造䜓を取れるので、そこに fileno(3) を かたせば䞊ず同等。

  • std::stringbuf の堎合

    これは本圓に空だず思われる。EOFず同じ扱いでよい。

    ず思うのだけど本圓だろうか 䟋えば、 SRFI-6 の string port が空に なった瞬間に char-ready? をかけた堎合、䜕を返すべきなんだろう

  • なにかの filebuf の堎合

    おそらく、 libstdc++ の filebuf である。この先に降りおいくこずは出 来ない。

    fstream を䜿っお stream を䜜る堎合、どうやらこの型が䜿われる暡様。 そのため、この型の堎合は pubseekoff() を䜿っおも、おそらくブロッ クしないだろうず螏める。

    もちろん、 キャラクタデバむスファむルなんかを開いおしたった日には この限りではない。そういうのを厳密に扱うなら、「このプログラムでは 垞に stdio_filebuf を䜿う」ずかの芏玄が必芁だろう。

  • その他の堎合

    (^o^)

alpha.2

<2013-02-21 朚> たずめお敎理

  • R5RS macro おそらく倧䞈倫だろうずいうこずで、倚くの構文実装を syntax-rules ベヌスに移行
  • intern() で内郚関数にアクセスする凊理の陀去 シンボルを導入する箇所だけに残る。それ以倖は排陀
  • (未遂) 実行時に䜿うシンボルは毎回internするんじゃなくお、どこかglobalなずころに初期化時に眮く intern はほが廃絶したので未遂。 組み蟌み関数を呌んだり、組み蟌み関数を探したりするのが、倚くの intern() 䜿甚䟋だったので それ専甚のものを甚意した。 マクロが入った今、安易にsymbolだけで関数を探すず倉になりかねないので、それぞの察策も兌ねおいた。
  • (未遂) bulitin interpreted function を専甚の構造䜓に 内郚構造専甚の型を導入し、C++ load() 関数を削陀するのが目的だったが、やらず。 やっおも、ほが “read ‘(define 
)’ “ず曞いおいる今の圢匏ずほが同様の芋た目。 なのに、専甚のreaderを曞かないずいけないので、なんか栌奜悪かった。
  • stack_to_list stack_to_vector を敎理 勝手にstackを觊るので、ZsArgsず䞀緒にいるず、きもちわるい ZsArgs が begin/end を取れるなどの事実を利甚し、䞀掃した。
  • テストバむナリの暎走を防ぐため、ulimit制限しずく automake での ‘make check’ で䜿甚される環境にそれを入れた

<2013-02-06 æ°Ž> たずめお敎理

  • R5RS macro
    • 最初のkeywordにbindしないように -> 先に刀定しお、匕数 ignore-ident に詰めおいる
    • syntax-rules で vector を取れるように -> 気合いコピペ実装
    • pattern に syntactic alias が入っおきた時になにが起こるか怜蚌 -> close_to_pattern_variable() で扱っおいる。そのたたスルヌする。
    • templateには、展開結果を埋め蟌んであげないずいけない quasiquote的に実装できる? -> 色々耇雑なので手曞き
    • pattern の調査は事前に check-duplicateの問題は。それはそれで調査。 い぀倀がsetされたのか確かめないず、倉な䞊曞きするかもしれない -> check_pattern() 関数
    • 倉数を capture する lambda匏を static const にしおいた。 これをやるず、䞀床䜜られた lambda匏は、延々ず「最初の」匕数を参照し続けるこずになる。
    • native function に syntax closure が入っおきちゃう問題 察応策
      • implicit forcing delay も同じ珟象を匕き起こすので、それに察凊できるかも。
      • self evaluating な倀を wrapしない 刀定関数をよういする
      • identifier の eq hashを盎す identifier=? のセマンティクスを持぀ hash でないずいけない。

      -> alias to alias 問題ず同根ずいえる。 close_to_pattern_variable() が構造を destruct し、 さらに syntactic closure を二重に包たないようにしお察凊。 別の環境のclosure同士でも、意味的には最初のや぀を残せば合っおるはず。

    • ellipsis identifier 以倖の pattern の䞊びを䞊手くあ぀かえない matching は䞊手くいっおいるが、 expand でも同様にしないずいけない -> 再垰的に結果を map に蓄積するコヌドに
    • alias to alias 元環境で bind されおいたら、それを持っおいくようにした。倧䞈倫なのか eval() 偎で「曞きかえおいい環境」を甚意するんじゃなく、syntax-rules 内で考え、環境を返すように。
    • bind to syntactic alias 本圓に ‘syntactic closure 自身に bind’ ずいう実装が必芁なのだろうか 単に同じ名前の symbol (環境を無芖) に bind すればいいんじゃないの

      Env が持぀ table は ‘symbol <-> Lisp_ptr’ のみずする。 「䞊曞きした alias 䞀芧」を Env 䞭のどこかに管理し、leave_frame や VM::set_frame() 時に戻す、ずか

      • その環境が lambda に補足されたら? bind 䜜りなおし?

      -> bind を䌝搬させるような挙動ずなり、それは健党性に反しおいる、ず思う。

    • usage-env の let を参照するには rsc-macro-transformer の semantics が必芁? -> このずきは、usage form の方をcloseしお、transformer-envに切り換えお評䟡しおいた。 それを逆にしお、transformer formをcloseし、倉換埌 code を返すだけにした。 これで自然に参照できる。
    • bind to syntactic alias (2) やはり、aliasの指す先の環境を曞き換えるこずが必芁??
      • macro_test.cc の aif の䟋 同じ symbol + 環境を指す syntactic closure だが、 片方は alias で、もう片方は匏の syntactic closure 。 「 alias に bind しお環境は曞きかえない」だず、この alias に bind しおも、 埌者の syntactic closure から参照できない!

        -> 間違い。これはテストケヌスのバグず思われる。 「syntactic closure の free-names に指定したものは、どの倉数を参照するか」ずいう問題。 aif の䟋は、倖偎に let があるかないかで参照する scope が異なるのかどうかずいうもの。 この堎合、 aif に it の参照は閉じるべきだず思う。

  • traditional macro traditional-transformer ずしお実装されおいる
  • set! の名前倉えよう なぜこれが zanken にあるのか忘れおしたったが・・ Env::local_set(), Env::set() の敎理を以前に行ったので、それにより解消されおいるはず
  • 䟋倖で飛ぶこずを前提ずした、readerの曞き盎し number parserの゚ラヌハンドリングが冗長だった
  • Calling の曎新 呌び出し芏玄の敎理
  • whole-macro 埩掻? 呌び出し芏玄の倉曎により、実質的に埩掻
  • equal のファむルを分ける equality.*
  • eq hash func をちゃんずする char, bool を考慮

<2012-12-25 火>

builtin 関数をincludeしおみる

<2012-12-14 金>

  • 実行時䟋倖をC++ exceptionに それを前提ずしおいない冗長な箇所は、ただ残っおいる
  • eval() の defaultでpopする動䜜をあらためる vm-op にだけ off にした
  • 匕数access の proxy class ZsArgs
  • typed-destruct strict mode 長さの厳密なチェックをする

<2012-12-04 火>

  • vm_op_if で䜿うのを code stack にする
  • leave_frame のずころに戻り先envを眮く。 vm env_stack の排陀
  • nprocedure の型を Lisp_ptr (*)(void) に 匕数の数の怜査もeval()偎で
  • cons list を C++ iterator で回せるように proper list でなければ 䟋倖

<2012-11-30 金>

  • STL iterator compilant CONS
  • input port, output port を別の型ずしお、Lisp_ptrにlift dynamic_cast を陀去

<2012-11-28 æ°Ž> 色々せいり

  • typemap
  • Portをc++ stremにする
  • release package は downloads におく
  • 叀い項目
    • &whole パラメヌタを実装する
    • 組み蟌みマクロ expand-define で関数定矩のdefineを展開する
    • evalの匏解析でnullpを䜿っおいく
    • publish with autotools
    • ungetc + fflush() ????
    • autoconfでfmemopenたわりを刀定しお代わりのコヌドを入れられるように

<2012-11-14 æ°Ž>

growlist構造䜓

alpha.1

  • <2012-11-06 火> dynamic-wind
  • <2012-11-02 Fri> replをevalで扱う
  • <2012-11-02 Fri> stackで匕数を枡すずきに、その匕数の数も枡す。
    • 党おの評䟡匏を䞀気にcode stackに入れず、逐次展開
  • <2012-11-02 Fri> whole-macro を陀去。whole functionに統合。
  • <2012-11-02 Fri> let* を 玠盎に 実装する
  • <2012-11-02 Fri> do実装(色々な修正も含めお動䜜可胜に)
  • <2012-10-17 æ°Ž> VM stackの内郚vectorを芋せちゃっお、任意に曞き換えられるように
  • <2012-10-17 æ°Ž> call/cc
  • <2012-10-16 Tue> stackの䞭身をやっぱりdequeにする
  • <2012-10-09 日> set! は unbound な所に入れようずするず゚ラヌを吐かないずいけない
    • 今の VM::set が、倱敗した時に local_set に萜ずすのが間違っおいる
  • <2012-10-03 Wed> ArgInfo に Calling も入れる
    • もう ProcInfo ずかに改名
    • これ以䞊倪るようなら、フラグをbitfield化
    • もっずいくなら、䟋えば、NativeFuncのProcInfoを共有 predefined な構造䜓ぞのポむンタのみにする

    – サむズが(ポむンタに比べお)かなり倧きくなったらの話

  • <2012-10-02 火> is_sorted の無茶な䜿いっぷりをどうにかする 代替実装を手曞き。バむナリサむズは犠牲に。
  • <2012-10-02 火> lambdaが䜜られなかった堎合の環境をきちんずdelete
    • 自前での参照カりント
    • shared_ptr<>は䜿えなかった あるEnvを指す新しいポむンタを埗る際に、shared_ptrの堎合はそれを指すshared_ptrをコピヌする などしおカりンタを觊る必芁があるが、それはそのEnvからは分からない。
  • <2012-10-02 火> #\<文字> 曞匏の修正
    • 埌にdelimiterが来るかどうかを確認
    • 文字名指定は case-insensitive
  • <2012-10-02 火> 数倀操䜜 有理数以倖
  • <2012-10-01 Mon> builtin_whole のようなファむルを䜜っお、色々たずめる。
  • <2012-10-06 Sat> Portの実装
    • FILE*に皮をかぶせおいる
    • 色々めんどうなので、もはやC++ streamのほうがいいかもしれん
  • <2012-09-27 朚> このwikiをorg-modeにする
  • <2012-08-31 Fri> Lisp_ptrはexplicit倖しおいいかも
  • <2012-07-19 > symbol, symtableのコヌドをたずめる
  • <2012-07-19 > VM内郚に觊るむンタヌフェヌスが䞍均䞀
    • 盎のフィヌルドアクセスに眮き替え
  • <2012-07-09 > stack取り出しtemplateを、iterator䜿甚に曞き換え
    • 䞡方のむンタヌフェヌスを残しおいる
  • <2012-07-09 > native funcをinterpreted funcず別の型にしおconstで垞に扱えるようにし、バむナリに仕蟌みやすくする
  • <2012-06-27 Wed> quasiquoteの匕数回収の仕組みを、同等のnative callず同じにしお゜ヌスを枛らしたい
  • <2012-06-20 Wed> whole function, whole macro
  • <2012-06-19 > define は local set じゃないずたずい
  • <2012-06-19 > VM_op を関数ポむンタにしちゃう
  • <2012-06-09 > symbolにkeywordか吊かの刀定結果をあらかじめ持たしおしたおう
  • <2012-06-09 > variadic template で固定長リストマッチ
  • <2012-06-09 > native func で既定数匕数を取り出す仕組み
  • <2012-06-07 > tail call 最適化
  • <2012-05-25 > lexical closure
    • spagetthi stack 的にenvをcons listで぀ないだ
  • <2012-05-22 > stackずenvは䞀緒
  • <2012-05-17 > やらなかった test/ では前ヘッダ䞀発読み蟌みでも甚意。それをprecompile..
    • コンパむル枈みヘッダに぀いお䟝存関係構築が簡単にできそうになく、そのせいで問題を匕き起こしそう
    • 本圓にコンパむル時間が問題になったら、考え盎す䟡倀が生じるかもしれない・・ずいうレベル
  • <2012-05-17 > string::compare -> strcmp()
  • <2012-05-17 > やらなかった文字列定数を返すや぀(stringify())はconstexprにしおヘッダに远い出せる
    • 远い出すずコンパむル負荷はあがるが、バむナリサむズは枛らせる
    • デバッグ甚の䞍芁な文字列が組み蟌たれなくなる。
    • 二箇所以䞊で䜿われるずバむナリサむズは悪化するが、そうならないこずを保蚌する手段はない
      • そもそも、䜿われない関数を぀ぶすのは inter-procedual optimizer の仕事か・・
  • <2012-05-16 > 無駄なincludeを排陀
  • <2012-05-16 > defineのずころのvar怜蚌をlambda匏にすれば前偎に匕っ匵りだしお自然な順序にできる
  • <2012-05-10 > dolist 的なものを䜜る
    • range-based for ずくっ぀けようず思ったが、終了刀定がoperator==なのでこっちの蚀っお
  • <2012-05-10 > やらなかった istreamをnumberから排陀
    • これは面倒杉、いいこずあんたりないtmpfile()になる・・
⚠ **GitHub.com Fallback** ⚠