2005 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
2014 1 2 3 4 5 6 7 8 9 10 11 12
2015 1 2 3 4 5 6 7 8 9 10 11 12
2016 1 2 3 4 5 6 7 8 9 10 11 12
2017 1 2 3 4 5 6 7 8 9 10

ホーム

2013年01月22日

sl3.cにはもう一つ唸った点があります。S式の解析の処理
です。

sl3.cのS式解析は、次の2つの関数がポイントになります:

obj *readobj() {
  char *token;

  token = gettoken();
  if (!strcmp(token, "("))
    return readlist();
  ...
  return intern(token);
}

obj *readlist() {
  char *token = gettoken();
  obj *tmp;
  if (!strcmp(token, ")"))
    return nil;
  ...
  putback_token(token);
  tmp = readobj(); /* Must force evaluation order */
  return cons(tmp, readlist());
}

ポイントに集中しやすいように、プロパーリストとシンボル
以外の部分は省略しました。

パッと見てわからなかったのが、readlistで呼ばれている
putback_tokenです。これは、ungetcのトークン版といえる
もので、putback_tokenされたトークンが次のgettokenで
取り出されます。

readlistの処理は、空リストならnilを返し、そうでなけ
ればputback_tokenで戻したcar部をreadobjで解析し、
cdr部をreadlistで再帰するという感じです。

このやり方、Lispのイディオムを踏まえたものという見方
もできますね。Lispの入門書でよく見かける次のような
コード:

(defun mycopy (lst)
  (if (null lst)
      nil
    (cons (car lst) (mycopy (cdr lst)))))

これはネストされてないリストのコピーですけど、こうした
再帰のイディオムを思い起こさせます。

S式の解析も、コンスセルの実装と同じように、個性が出る
部分です。よく見かけるのは、最後にリストをひっくり返す
パターンです。(1 2 3)というS式なら、(3 (2 (1 ()))と
なるようにつないでいき、最後にひっくり返す。

ひっくり返すパターンはAwklispで見られます:

https://github.com/darius/awklisp

他には、そもそもコンスセルを使わずに、実装言語の配列
を使ってしまうという豪快なやり方もあります。lis.pyが
それです:

http://norvig.com/lispy.html
http://norvig.com/lispy2.html

sl3.cのトークンを戻すというやり方は、単純でありながら
Lispっぽさが残っていて面白いと思ったのでした。

本家Permlink


2013年01月20日

sl3.cという非常にシンプルなLisp処理系があります:

http://www.sonoma.edu/users/l/luvisi/sl3.c

GCを持たないくらいシンプルです。でも、ちょっとした
トリックが使われていて、それを理解したとき、思わず
「アタマイイ!」と声に出てしまいました。

Lispであるからには、まずセルの定義が来ます:

enum otype { INT, SYM, CONS, PROC, PRIMOP };
typedef struct obj {
  enum otype type;
  struct obj *p[1];
} obj;

ここでおかしいと気づくべきでした。いや、おかしいこと
には気づきました。「要素が1つしかない配列なんて定義
してどういうつもり?」と。

次にcarとcdrの定義を見て混乱に拍車がかかりました:

#define car(X) ((X)->p[0])
#define cdr(X) ((X)->p[1])

特にcdr。定義では存在しないはずの2番めの要素にアクセス
してます。

混乱しながらコードを見てると、consの実体である関数に
ミソがありそうだと分かりました:

#define cons(X, Y) omake(CONS, 2, (X), (Y))

obj *omake(enum otype type, int count, ...) {
  obj *ret;
  va_list ap;
  int i;
  va_start(ap, count);
  ret = (obj *) malloc(sizeof(obj) + (count - 1)*sizeof(obj *));
  ret->type = type;
  for(i = 0; i < count; i++) ret->p[i] = va_arg(ap, obj *);
  va_end(ap);
  return ret;
}

consすると、objの2つ分のサイズのメモリがmallocされる
わけです。その2つは、当然メモリ上に隣接して配置される
わけです。それがどういうことかというと、cdr部への
ポインタを使わずにコンスセルを実現できるということなん
です。

コンスセルの素朴な実装をRubyなんかでやるとすると:

class Cell; end

class Intejer < Cell
  def initialize(n)
    @value = n
  end
end

class Cons < Cell
  def initialize(kar, kdr)
    @kar = kar
    @kdr = kdr
  end
end

みたいに、明示的にcdr部のフィールドを用意しないと
いけない。C言語でやるとしても、コンスセルのために
unionを使うわけにはいかないので、たとえば:

struct Cell {
  int type;
};

struct Integer {
  int type;
  int value;
};

struct Cons {
  int type;
  Cell* kar;
  Cell* kdr;
};

みたいにするでしょう。でも、sl3.cだと構造体はobj
ひとつしかありません。

ただ、sl3.cのやり方だと、メモリ上に隣接しいていること
がコンスセルの必須条件になってしまうので、malloc
みたいなメモリ割り当てがない言語だとダメなんですね。

--

と、長々と書いてみたけど、すべてのセルを配列で用意した
昔のLispの実装を知っていれば、こういうやり方は自然
なのかもなぁ。

--

ああ、ある種、Forthに近いんだな、こういうやり方は。

--

あ、GC関係ないんだな。GCやらないからできる実装かと
思ったけど。mallocがポイントなわけか。


本家Permlink


2013年01月13日

「はじめてのOSコードリーディング」(青柳隆宏著、技術評論社)
が電子書籍で買えるとわかったので衝動買い:

https://gihyo.jp/dp/ebook/2013/978-4-7741-5517-3

ボツボツ読んでいこうかなと思ってるんですけどね。
Nexus7のKindleで読んでるんですけど、しかし、こういう
PDFを読むにはまだまだですね。栞とかつけられないし。

--

それでね、xv6のことを思い出したんですよ:

http://pdos.csail.mit.edu/6.828/2011/xv6.html

これのコードをNexsus7で読めないかと思って。いや、
ソースファイルそのままだと不便じゃないですか。
テキストエディタも貧弱だし。

でね、Gnu Globalのことを思い出して。これだとソース
ファイルを.htmlに変換してくれる。

ただね、Gnu Global、Win7だとうまく動かない。バイナリ
も用意されてるんですけど、なんかコケる。Linuxマシンも
あるんですけど、メインマシンというわけじゃないから
ちょっと面倒なんですよね。

で、VMWare PlayerにDebian入れることにしました。
特に問題なくインストールできて。gitでxv6のソースを
cloneして、htagsで.htmlファイル吐き出して。それを
Nexus7にコピーして終わり。

今回はじめて知ったんですけど、hgfsっていうのでゲスト
OSとホストOSとで共有フォルダできるんですね。scpとか
使ってました。

Nexus7では、Chromeで見ます。HTMLViewerとか腐ってて
使い物になりませんから。例のfile://sdcardではじまる
URLをChromeのアドレスバーで直打ちすればファイルも
見れます。ブックマークもつけれるんですけど、ファイル
の場合は、新しいタブで開かないとダメみたいです。

--

ついでだし、VMWareのDebianでxv6もビルドしちゃうかと
思って。bochsはダメでしたけど、qemuのほうは動きました。

特にこれといったトラブルもなく。トラブルらしいトラブル
といえば、Debianにgccとかmakeとかが入ってなくて、
VMWare Toolsのインストールに手こずったことと、bochsで
xv6が動かなかったことくらいですかね。


本家Permlink


2013年01月12日

ソフトウェア開発のマネジメントにはいろんなたとえが
用いられて来ました。製造業であるとか、ガーデニングで
あるとか。

自分は管理者ではないんですけど、それでもソフトウェア
開発のマネジメントは日々のやりくりだなぁと思うことが
多いです。

やりくりの他にマネジメントの要素をあげるとしたら、
だんどりでしょうね。

やりくりは、限られた資源の有効活用ということになります。
だんどりは、計画と根回しということになります。

マネジメントのやり方によってはビジョンというものが
取り上げられたりします。これは夢ということでいいで
しょう。

やりくりとだんどりとちょっとした夢。これがマネジメント
の実態だとしたら、それに一番近いのは家庭でしょう。

家庭だと子育てや祖父母の世話といった身内の始末もあり
ます。ソフトウェア開発でも手間のかかるメンバがいたり
するでしょう。

家庭モデルの成果物は子どもということになるでしょうね。
子どもはチームのメンバでもあるんですけど。

家庭の管理者といえば、大抵は母親のようです。とすると、
マネジメントはママジメントということもできます。

そう考えると、女性がもっと管理者になってもいいと思う
んですけどね。女性が絶対的に少ない業界ということも
あるとは思うんですけど。


本家Permlink


2013年01月06日

Android向けのテキストエディタを公開しておりまして。
ほんとにごく単純な、notepad.exeにも満たないエディタ
なんですけど:

https://github.com/tkojitu/WagtailED

で、Xperia mini proみたいに画面が小さくて、v2.3.4と
いう古いのなら、メモを取るくらいには不自由はないんです
けど。Nexus7くらいになると、さすがにもうちょっと贅沢
したくなるわけです。

で、タブのエディタを作ろうかとゴソゴソやってるんです
けど。これがまぁ手強い。

何が手強いかっていうとFragmentに尽きるわけです。
Fragmentが導入されたせいか、タブはActionBar.Tabと
Fragmentの組み合わせで実装すべしというのがGoogle様の
方針のようで。

で、今度はもうちょっとマシなエディタにしたいわけで、
検索・置換くらいはできるようにしたいと。で、そのUIを
考えると、ダイアログはイケてない。フローティング・
ウィンドウなんてジャマなだけ。というわけで、最近の
ブラウザで見られるような、出たり引っ込んだりするアレ
にしたいなと思ったわけです。

出たり引っ込んだりするとなると、やっぱりFragmentで
しょう。というか、Fragmentしかないというのが実状な
わけです。ViewGroupはイカれてて、グループ全体を消す
ことすらままならない。

で、ここで問題が起こるわけです。タブで切り替わるのは
Fragmentなわけです。で、出たり引っ込んだりするのも
Fragmentなわけです。つまり、Fragmentをネストしなきゃ
いけない。

幸いなことに、v4.2からFragmentのネストができるように
なりました。って、今ごろになってようやくかよって感じ
なんですけど。ただ、Fragmentのネストは一筋縄じゃ
行かない。ネストしないんならレイアウトファイルに無理
やり詰め込むこともできるんですけど。

で、こっから先、どう書こうか悩むくらいゴチャゴチャ
した話になるんで、まだ実験段階なんですけどサンプルを
githubで公開しておきました:

https://github.com/tkojitu/TabPaneDemo

ポイントはAndroidTabListenerとTabPane#addFragsです
かね。タブを選択する度にTabPane#onCreateViewが呼び
出されます。

いやぁ、予定では正月休みでタブエディタが出来上がってる
はずだったんですよね。Androidは恐い。


本家Permlink


Copyright © 1905 tko at jitu.org

バカが征く on Rails