このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Make 補遺の補遺:遊んでいるだけ

もう、単に面白がっているだけですが:

ちなみに、Make言語でリスト処理関数を書こうとしたらうまくいきませんでした。再帰呼び出しが禁止されているんですよ。関数型言語再帰が使えないと、、、、トホホですわ。

これどういうことか、以下に。

リストを逆順にする関数reverseはたいてい前もってありますが、しいて書けば(Lisp);


(defun my-reverse (lis)
(if lis (append (my-reverse (cdr lis)) (list (car lis)))
lis))

まず、cdr(先頭を除いた残り)にあたる関数をMake言語で書きましょ。組み込み関数の組み合わせで出来ます。


butfirst = $(wordlist 2,$(words $(1)),$(1))
wordsはリストとしてのlengthのこと、wordlistは部分リスト(スライス)を返します。

それで、


reverse = \
$(if $(1),$(call reverse,$(call butfirst,$(1))) $(firstword $(1)),$(1))
見づらいわなー。ホントはダメだけど、説明用に引数変数に名前付けて、改行インデントして、callを省略すると:

reverse,$(lis) =
$(if $(lis), $(reverse, $(butfirst,$(lis))) $(firstword $(lis)),
$(lis))
ifはLispと同じで、空文字列が偽、それ以外は真として分岐します。

さて、


*** Recursive variable `reverse' references itself (eventually). Stop.
ショボン。

[追記]id:aljeeさんの情報によると、最新のGNU Makeでは再帰呼び出しができるようです。条文分岐と再帰呼び出しがあるなら何でもできるので、原理的には、Make言語で本格的なアプリケーションを書くこともできます。(原理的にはね)[/追記]

[追記 time="2007-09-26 09:45:24"]GNU Make 3.80で確認しました。再帰呼び出しが許可され、reverseは動きます。が、なんか空白が余分につくな。空白の制御は難しい、、[追記]