kiyokaのブログアーカイブ

Archive of old blog posts

「Nendo」カテゴリの記事

静的型チェックの設計メモ(1)

自分用備忘録。

副作用の無いコードの静的解析について(2)

前回の続き。( 前回の記事は、右上の窓から同じタイトルで検索してね )

副作用の無いコードの静的解析について(1)

だいぶ前に、[Nendo]に型検査を入れて副作用の無いコードを静的解析で保証したいという話題を書いた。 ( 2011-10-07Nendo*Ruby コードブロックに副作用が混在するかを検出できるかどうか ) あれから時間が経ったけど、諦めずに考えているのであった。もう2年も経ったのか…

Kyoto.Lisp Hackathon で作ったけどボツになったコード

Kyoto.lisp Hackathon #1 に参加してきた。 話としては(2012-08-11Nendo*Lisp Kyoto.Lisp Hackathon でやったことのまとめ) の続き。

Kyoto.Lisp Hackathon でやったことのまとめ

Kyoto.lisp Hackathon #1 に参加してきた。 KyotoでLisperが10人以上集ったのだけど、他の大きなイベントとぶつかっていたわりにはよく集ったのかも。

Nendo 0.6.4 リリース

[Nendo] 0.6.4をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの概要 COPYINGとREADMEをgemに追加しました。 [Sekka]のテストスイート内で#?=によるデバッグ出力を抑制したかったので debug.null を追加しました。

Nendo 0.6.3 リリース

[Nendo] 0.6.3をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの概要 nendoのライブラリ(*.nnd *.nndc)のインストール先パスを一段深くし、nendoディレクトリ配下に置くようにしました。 Debianパッケージ化しようとして、0.6.2では、 /usr/lib/ruby/vendor_ruby/init.nnd にインストールされてしまうことから、インストール先が間違っていることに気がつきました。

Nendo 0.6.2 リリース

[Nendo] 0.6.2をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの概要 gem単体でテストが走る rubygems-test への対応が中心です。 これまで、Nendoはgitリポジトリ上でしたテストが走りませんでした。 これからは、 $ gem install rubygems-test $ gem test nendo でテストが走ります。 参考: Gem Testers

Nendo 0.6.1 リリース

[Nendo] 0.6.1をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの概要 例外関連のフォームのバグ修正と、シンタックスチェックの不備を修正しました。

Nendo 0.6.0 リリース

[Nendo] 0.6.0をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの概要 nendo.rbをファイル分割しただけで、挙動は0.5.4から変化ありません。 ファイル分割しただけですが、ソースコード管理上は大きな変化であるということ、機能的に安定していることの二つの理由から、マイナーバージョン番号を0.6.0にを上げました。

Nendo 0.5.4 リリース

[Nendo] 0.5.4をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの目玉 例外をハンドリングできるようになりました。道具立てはguardとunwind-protectです。 GaucheとAPIをなるべく似せて、Gaucheに慣れた人が新しく覚えることを少なくしました。 ([Nendo.ReferenceManual] のguardのあたり参照) テストフレームワークの nendo.testもgauche.test同様のAPIにしています。 Gaucheは独自の例外オブジェクトを持っていますが、Nendoでは例外オブジェクトとしてRubyのそのものを使うことになっているので、Rubyのオブジェクトをそのまま指定できるようにしました。 RuntimeErrorやArgumentErrorやTimeout、Errno::ECONNREFUSEDなんかがそのまま書けます。

コードブロックに副作用が混在するかを検出できるかどうか

先日のScalaの本からの流れで勝手に盛り上ってしまっている話題を前へ進めてみる。

例外の捕捉について

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

Nendo 0.5.3 リリース

[Nendo] 0.5.3をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの目玉 高階関数の第二引数にEnumerable型を渡せるようになりました。(但し、map filter for-eachのみ) これにより、巨大なIOに対する逐次処理をfor-eachで書けるようになったり、list型だけでなくvector型に対して高階関数を適用できるようになります。 エラーが発生した時、正確な行番号がバックトレースに出るようになりました。 これまでは実行速度を優先して、バックトレース用の情報をあまり格納していませんでした。(未定義変数のエラー時は正確でした)

Nendo 0.5.2 リリース

[Nendo] 0.5.2をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの目玉 高速化しました。 固定長引数の関数呼び出しは、末尾再帰呼び出しのトランポリンを経由せずRubyのメソッドを直接呼び出す最適化を行った。 => ビルトイン関数の最適化のみに適用した。 => tak関数で約6.5倍、長さ10000のリストのmap filter for-eachがversion 0.5.1に比べて4倍の高速化となった。

chibi-schemeのsyntax-rulesをポーティングする方法

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

Nendo 0.5.1 リリース

[Nendo] 0.5.1をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの目玉 chibi-scheme 0.3のmatchライブラリをポーティングしました。 その過程で、let-syntaxとsyntax-rulesの大量のバグが取れました。

matchライブラリが動いた日

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

matchライブラリのデバッグ中

オレ処理系の[Nendo]についての開発メモ。 let-syntaxの実装がだいぶ進んだ。 現在はchibi-scheme 0.3のmatchライブラリであるmacth.scmを変更無しで動かそうとしている。 あと、もうすこしで動きそうなんだけどなー。

let-syntaxの実装方法の検討

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

Nendo 0.5.0 リリース

[Nendo] 0.5.0をリリースしました。(リリースノート: [Nendo.ReleaseNote]) リリースの目玉 健全なマクロ(hygenic macro)を追加したことです。 結果、次の3つをサポートできました。特にutil.listは普段のコーディングで自分でも無いと困るライブラリでした。

ゆっくり階段を登るがごとく

オレ処理系の[Nendo]についての開発メモ。 Gaucheのutil.listが動いた。 syntax-rulesも動くようになったし、他にもバグをいくつか修正したので一旦リリースするべきだろう。 実は、let-syntaxとletrec-syntaxのようなレキシカルスコープでのみ有効なsyntax定義が実装できていないので、片手落ちなんだけど、リリースした後に取りかかろう。

syntax-rulesが動いた日

オレ処理系の[Nendo]についての開発メモ。 chibi-scheme 0.3のer-macro-transformerとsyntax-rulesをそのままNendoに移植を試みていたのだが、ついに成功した。

syntax-rulesの実装中。難航中。

オレ処理系の[Nendo]についての開発メモ。 chibi-scheme 0.3のer-macro-expanderとsyntax-rulesをそのままNendoに移植中。 今は、make-syntactic-closureをどう実装していいかわからないので、正解を探しているところ。

「10分でコーディング」をやってみた

10分でコーディング|プログラミングに自信があるやつこい!! 今日の問題はかなり簡単です。 できるだけ早い時間でエレガントなコードを書きましょう。 あまりに簡単なので制限時間を10分としてやってみてください。 これ以上かかった人は 自分はかなりプログラミングができない。 とつらい事実を認識しましょう。

Nendo 0.4.1 リリース

[Nendo] 0.4.1をリリースしました。(リリースノート: [Nendo.ReleaseNote]) 今回の目玉はjsonのライブラリを追加したことです。(rfc.json) [Sekka]で必要になったので追加しました。 そんなわけで、Nendoの開発は[Sekka]のニーズによってドライブされています。

まじめにSchemeのportをサポートする時間が無いので保留

NendoのjsonライブラリをGaucheのrfc.jsonライブラリと互換にしたかったのだが、時間が無いので保留にすることにした。 Nendoの他のライブラリと同じように、portの変わりにRubyのFileオブジェクトでお茶を濁すことにした。 優先すべきはSekkaからGoogle IME APIにアクセスして未知語を獲得する機能なので、今は寄り道はやめておこう。 毎日30分だけNendoに割り当てる方針で、本当に少しづつだけど前進している。

Schemeのportをportingするには?

Schemeのportって何を抽象化しているんだろう。 RubyのFileオブジェクトをちょっとラップしただけでもできるもんなのだろうか。 もうそろそろ、portが無いとGaucheのライブラリのAPIを近似できない事態が増えてきた。rfc.jsonとか。

Nendo 0.4.0 リリース

[Nendo] 0.4.0をリリースしました。(リリースノート: [Nendo.ReleaseNote]) ライブラリをロードする関数 load の仕様を整理しました。 結局、Rubyの$LOAD_PATHの値を[Nendo]も継承するようにしたので、NendoのユーザーライブラリもRubyのライブラリパスに置くという設計にしました。 ※ 詳細は、[Nendo.ReferenceManual]を参照してください。 これで、[Nendo]で作ったコマンドラインアプリをgem化できるようになりました。 これは[Sekka]をGem化するにあたって、必須だったので手を付けました。

load-pathまわりの仕様

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

Nendo 0.3.5 リリース

[Nendo] 0.3.5をリリースしました。(リリースノート: [Nendo.ReleaseNote]) 今回の目玉は高速化です。 tak(竹内関数)でversion 0.3.4に対して約3倍の高速化が実現しました。 個人的に[Nendo]でいろんなものを書いているので、今後も日々必要になったものを優先して実装していくつもりです。

Nendoのベンチマークを開始

Nendoで書いたプログラムがPure rubyと比べてどれくらい遅いかを調べ始めた。 まずは最初の結果を示そう。 竹内関数の処理時間は以下の通り。 ※ 引数は tak( 10, 5, 0 ) Ruby 0.03秒 Nendo 38.89秒 その差 およそ1296倍。スゲー。

Nendo 0.3.4 リリース

[Nendo] 0.3.4をリリースしました。(リリースノート: [Nendo.ReleaseNote]) チュートリアルと、リファレンスマニュアルを少し加筆しました。 まだまだ ##(todo)項目が多いですが、最低限の情報は記載したつもりです。(それから、そのうち英語版も作らないといけないですね…) かなりの部分で、[Gauche]のAPIを参考にしているので迷ったらGaucheのユーザリファレンスを参照していただくと解決すると思います(笑)

SekkaをRackに載せて、試験運用中

現在、新しい日本語入力メソッド(Sekka)を開発中だ。 とりあえずRackに載せることができた。(結局先日書いた方法で[Nendo]の定義関数をRackからうまく呼びだすことができたのである) sekka.elを1日程度ででっちあげて、このブログはEmacs+Sekkaで書いている。(勝手知ったるsumibi.elを改造したのでそんな期間でできたのだが…) まだまだ使いにくい所がたくさんあるので、結論は出しにくいけれど、まあまあ希望が持てそうな使い心地だ。 SKKを使ってきた人なら数分もあれば、慣れるんじゃないかと思う。

Nendoで定義した関数をRubyから呼べるようになった

私がRubyで書いているLisp方言、 [Nendo]について。

TDD(テスト駆動開発)の重要性

実験中の新しい日本語入力メソッド Sekka(仮名)を[Nendo]で作ろうとしているが、そのために[Nendo]に足りない機能を足している。 SekkaはちゃんとTDD(テスト駆動開発)で開発していく予定なので、unit testフレームワークが必要になった。 そこで、gauche.testの基本機能をポーティングしたところ。 リンク: Gauche ユーザリファレンス: 9.22 gauche.test - 単体テスト

Gaucheのobject-applyのようなことをしたい

私がRubyで書いているLisp方言、 [Nendo]について。

Rubyのブロック構文をサポートした

私がRubyで書いているLisp方言、 [Nendo]について。

Nendo 0.3.3 リリース

[Nendo] 0.3.3をリリースしました。(リリースノート: [Nendo.ReleaseNote]) あいかわらずチュートリアルと、リファレンスマニュアルはまだ書きかけですが… [Nendo.Tutorial] [Nendo.ReferenceManual]

srfiのポーティング(2)

私がRubyで書いているLisp方言、 [Nendo]について。

srfiのポーティング(1)

私がRubyで書いているLisp方言、 [Nendo]について。

高速化のアイデア

私がRubyで書いているLisp方言、 [Nendo]について。

末尾再帰最適化、実装完了

私がRubyで書いているLisp方言、 [Nendo]について。

今さらRubyでCGIもないだろうと思って調べたら、Rackにたどりついた。

CGI程度の簡単アプリであっても、Rackに乗せるべきだと思った。

末尾再帰最適化をどう実装するか

私がRubyで書いているLisp方言、 [Nendo]について。

Nendo 0.3.2 リリース

[Nendo] 0.3.2をリリースしました。(リリースノート: [Nendo.ReleaseNote]) チュートリアルと、リファレンスマニュアルはまだ書きかけです。 [Nendo.Tutorial] [Nendo.ReferenceManual]

Nendo 0.3.1 リリース

私がRubyで書いているLisp方言、 [Nendo]について。

Nendo 0.3.0 リリース

私がRubyで書いているLisp方言、 [Nendo]について。

Gaucheのtext.html-liteをポーティングできた

私がRubyで書いているLisp方言、 [Nendo]について。

オレ言語処理系]を開発する意味

『Just for Fun』 という答えはありきたりすぎて面白く無いかも知れないけど、実際そういう部分が一番大きい。 同時に、プログラミングスキルを上げたいという気持ちも当然あって、それらの動機は混在しているし、考えてみると他にも動機がいろいろ有りそうで自分自身でもはっきり説明できない所がもどかしい。 しかし、振りかえってみると、[Nendo]の開発は知的好奇心を刺激するし、同時にLispプログラミングのスキルが上がっているのは確かなので、このまま好循環で進んで行きそうだ。

多値の実装完了

私がRubyで書いているLisp方言、 [Nendo]について。

実用アプリを作りながら、処理系を鍛えるのは重要

私がRubyで書いているLisp方言、 [Nendo]について。

Nendo 0.2.0 リリース

私がRubyで書いているLisp方言、 [Nendo]について。

初期化スクリプトをコンパイル済にして高速化した

私がRubyで書いているLisp方言、 [Nendo]について。

Gaucheの #?= 相当のデバッグユーティリティをサポート

私がRubyで書いているLisp方言、 [Nendo]について。

named letをmacroで実装した

私がRubyで書いているLisp方言、 [Nendo]について。

set!の実装につまづく(3) =>解決

私がRubyで書いているLisp方言、 [Nendo]について。

letrecを実装した

私がRubyで書いているLisp方言、 [Nendo]について。

set!の実装につまづく(2)

私がRubyで書いているLisp方言、 [Nendo]について。

set!の実装につまづく

私がRubyで書いているLisp方言、 [Nendo]について。

gemをGemCutter.orgに再登録した

私がRubyで書いているLisp方言、 [Nendo]について。

heist:Rubyで実装されたScheme処理系

あまり時間が無くて[Nendo]の開発が滞っているが、[Nendo]の他にもRubyでLisp処理系を実装している人がそれなりに居る様なので、順番に見て行きたいと思う。 手始めとしてheistを調べ始めた。 作者のブログによると、開発動機は実用目的ではなく勉強目的の様だ。 SICPを読んでいるうちに一度実装してみたくなったという感じだろう。 作者のブログには自虐ネタ的なブログエントリもあったり。 April fool: area man releases world’s slowest Scheme interpreter : The If Works

gemを公開した

私がRubyで書いているLisp方言、 [Nendo]について。 だいぶ前にgemを公開したのだけど時間が無くてブログ記事を書けなかったので、とりいそぎの記事です。 インストール方法は[Nendo]を参照して下さい。 Ruby 1.9.2devでしか動かないのでその点だけ御注意下さい。 まだドキュメントが無いので、現在のNendoでどんなことができるかは、kiyoka’s nendo at master - GitHubの中にstowspecというソースコードを参考にして何とかしてもらうしかないです。 処理系の実装をやっている方の参考になればと思い公開しました。 当分時間が取れそうにないので、ドキュメント書きなどの作業は進まないと思います。

Ruby 1.8.x対応を見送った

私がRubyで書いているLisp方言、 [Nendo]について。

シェルトランポリンの実現方法2

私がRubyで書いているLisp方言、 [Nendo]について。

シェルトランポリンの実現方法

私がRubyで書いているLisp方言、 [Nendo]について。

オレオレ参照透明性というアイデア(immutable宣言)

私がRubyで書いているLisp方言、 [Nendo]について。

util.matchってNendoで動くのかな

私がRubyで書いているLisp方言、 [Nendo]について。

次はアプリを試作してみよう(3)

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

次はアプリを試作してみよう(2)

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

次はアプリを試作してみよう

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

Nendoの初期化ライブラリの階層構造

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。 今回は自分用のメモ。

Rubyとの連携を考える(3)

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。 Rubyの世界へのアクセス手段として引きつづき .(ドット)オペレータを実装してみた。 (ここに書いた仕様はおそらく後日変わると思うので注意)

Rubyとの連携を考える(2)

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。 Rubyの世界へのアクセス手段として引きつづき .(ドット)オペレータを考えてみる。

Rubyとの連携を考える(1)

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

quasiquoteが動いた日

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

ついにorとandを定義できた

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

defineをmacroで実装した

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

可変長引数のサポート

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

伝統的なmacroが動いた

ここまで長い道程だったが、macroが動いた。 実際にmacroを実装してみるとmacroがどういうものかやっと理解できた気がする。

伝統的なmacroの実装に向けて

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

undefined variable エラーをRubyの例外システムの上に実装してみた

[Nendo]はせっかくRubyの上に構築している言語なので、エラー処理などもRubyの例外処理をそのまま使って実装してみた。 もちろん、バックトレースの情報にもエラーが起きた行番号を埋めこむ処理も入れた。 以下は、nendo処理系の動作結果 ( rubyExp=«< »> という部分はトランスレートされた後のRubyコードをデバッグ表示したもの )

]のオープンソースライセンスを何にするか

[Nendo]はRubyベースなので、選択肢は二つになりそう Rubyと同じ(GPLとArtisticのデュアルライセンス) 修正BSD

RSpecを学習中

この記事を読みながら概略をつかもうとしているところ Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編) [Nendo]の開発では、一旦ラフなコードを書いては、もっと簡潔になるようにリファクタリングするという繰返して開発しているので、RSpecがうまく使えそう。 とういかテストコードをすでに沢山書いていて、それをちゃんと整理しないとなと思っていたところ。 RSpecのDSLは慣れると読みやすそう。 いつか仕事でも役に立ちそうなのでみっちりやっておこう。 RSpecはオンラインドキュメントが充実しているので、現時点ではこの本を買うまでもないかなと思っている。 The Rspec Book Amazonで見る

Ruby標準ライブラリを使って]のライブラリ実装をサボりまくりな話

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

高階関数の定義(mapとfilter関数)

私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。

mapとfilterが動いた

私がRubyで書いているLisp方言、 [Nendo]の開発状況。 なんとか、mapとfilterを動かす部品がそろったぞ。

87件の記事があります。