[トップ][一覧][最近の更新]

archives/2005/09/13

Lisp/Scheme/pp

Category of Lisp
Category of Scheme

WiLiKi:Gauche:PrettyPrintに昔書いたコードをぺたり。 オリジナルの方を貼るのは恥ずかしいので(末尾再帰ですらない。hehe)、 WiLiKi:hiraさんの改良版の方をば。

そういえば、WiLiKi:hiraさん最近見かけないのですが、 どうしたんでしょうか。日記も更新が止まってるし。

WiLiKi/Hack

Category of Hack

WiLiKiのちょっとしたハックをまとめたページを作ろう。

どこまで増えるかな。

Erlang/string

Category of Erlang

Erlang/2005/09/05/こんなLLはXXだにて文字列型がないと書いたが、 どういうことかというと、あれだ。 Cといっしょ。 Erlangにおける文字列は要するにリスト。Cだとポインタだから正確には違うか。

> string:equal("hello", [104,101,108,108,111]).
true

Cと違った明白な利点はやはり、car, cdrがそのまま引っぱってこれることでしょう。

例えば、公式配布のドキュメントに付いてくるサンプルとして、 下のような順列のリストを作る関数permsを例にとってみる。

The following example generates all permutations of the elements in a list:

perms([]) -> [[]];
perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

We take take H from L in all possible ways. The result is the set of all lists [H|T], where T is the set of all possible permutations of L with H removed.

> perms([b,u,g]).
[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

リストの内包表記の例なんだけど、この話は置いておいて、 これがそのまま文字列にも適用できる。

> lists:foreach(fun (X) -> io:fwrite("~s ", [X]) end, perms:perms("anagram")).

おお、アナグラム生成プログラムが3行で書けた。

でもまあ文字列型がないと、他のLL言語のように正規表現でウヴォアー、 ってができないのでちと痛い。