Lisp/Scheme/pp
WiLiKi:Gauche:PrettyPrintに昔書いたコードをぺたり。 オリジナルの方を貼るのは恥ずかしいので(末尾再帰ですらない。hehe)、 WiLiKi:hiraさんの改良版の方をば。
そういえば、WiLiKi:hiraさん最近見かけないのですが、 どうしたんでしょうか。日記も更新が止まってるし。
WiLiKi:Gauche:PrettyPrintに昔書いたコードをぺたり。 オリジナルの方を貼るのは恥ずかしいので(末尾再帰ですらない。hehe)、 WiLiKi:hiraさんの改良版の方をば。
そういえば、WiLiKi:hiraさん最近見かけないのですが、 どうしたんでしょうか。日記も更新が止まってるし。
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言語のように正規表現でウヴォアー、 ってができないのでちと痛い。