もう、単に面白がっているだけですが:
ちなみに、Make言語でリスト処理関数を書こうとしたらうまくいきませんでした。再帰呼び出しが禁止されているんですよ。関数型言語で再帰が使えないと、、、、トホホですわ。
これどういうことか、以下に。
リストを逆順にする関数reverseはたいてい前もってありますが、しいて書けば(Lisp);
(defun my-reverse (lis)
(if lis (append (my-reverse (cdr lis)) (list (car lis)))
lis))
まず、cdr(先頭を除いた残り)にあたる関数をMake言語で書きましょ。組み込み関数の組み合わせで出来ます。
wordsはリストとしてのlengthのこと、wordlistは部分リスト(スライス)を返します。
butfirst = $(wordlist 2,$(words $(1)),$(1))
それで、
見づらいわなー。ホントはダメだけど、説明用に引数変数に名前付けて、改行インデントして、callを省略すると:
reverse = \
$(if $(1),$(call reverse,$(call butfirst,$(1))) $(firstword $(1)),$(1))
ifはLispと同じで、空文字列が偽、それ以外は真として分岐します。
reverse,$(lis) =
$(if $(lis), $(reverse, $(butfirst,$(lis))) $(firstword $(lis)),
$(lis))
さて、
ショボン。
*** Recursive variable `reverse' references itself (eventually). Stop.
[追記]id:aljeeさんの情報によると、最新のGNU Makeでは再帰呼び出しができるようです。条文分岐と再帰呼び出しがあるなら何でもできるので、原理的には、Make言語で本格的なアプリケーションを書くこともできます。(原理的にはね)[/追記]
[追記 time="2007-09-26 09:45:24"]GNU Make 3.80で確認しました。再帰呼び出しが許可され、reverseは動きます。が、なんか空白が余分につくな。空白の制御は難しい、、[追記]