質問

最近職場で、私はMakeFilesから代替ビルドシステムへの翻訳を行ってきました。関数マップ、フィルター、およびforeachコンストラクトを使用して、いくつかの場所でかなり毛むくじゃらのメーカーコードを見てきました。ビルドスクリプトはできるだけ宣言的であるべきだと思うので、これは私を驚かせました。

とにかく、これは私に考えさせられました:MakeFile言語(最新のGNUが具体的になると言っています)はチューリングが完全ですか?

役に立ちましたか?

解決

はい、参照してください これ. 。ラムダができたら、そこからすべて下り坂になります。

がここにあります 盗用 フィボナッチの例

これは、より一般性のための基盤を構築するのに十分なはずです(私は仕事に戻らなければならない、またはもっとプレイする必要があります。)

dec = $(patsubst .%,%,$1)

not = $(if $1,,.)

lteq = $(if $1,$(if $(findstring $1,$2),.,),.)
gteq = $(if $2,$(if $(findstring $2,$1),.,),.)
eq = $(and $(call lteq,$1,$2),$(call gteq,$1,$2))
lt = $(and $(call lteq,$1,$2),$(call not,$(call gteq,$1,$2)))

add = $1$2
sub = $(if $(call not,$2),$1,$(call sub,$(call dec,$1),$(call dec,$2)))
mul = $(if $(call not,$2),$2,$(call add,$1,$(call mul,$1,$(call dec,$2))))
fibo = $(if $(call lt,$1,..),$1,$(call add,$(call fibo,$(call dec,$1)),$(call fibo,$(call sub,$1,..))))
fact = $(if $(call lt,$1,..),.,$(call mul,$1,$(call fact,$(call dec,$1))))

numeral = $(words $(subst .,. ,$1))

go = $(or $(info $(call numeral,$(call mul,$1,$1)) $(call numeral,$(call fibo,$1)) $(call numeral,$(call fact,$1)) ),$(call go,.$1))

_ := $(call go,)

これにより、正方形、フィボナッチの数字、要因が印刷されます。数値サイズに16ビット制限があるようです。バマー。

他のヒント

否定的な答えのために:GNUは再帰を作成するためのいくつかのメカニズムを積極的にブロックします。

1) 再帰的に拡張された変数

「再帰機能」の意味で再帰的ではありません。彼らは自分自身の観点から定義することはできません。

Actually make detects the infinite loop and reports an error.

(ちなみに、実際に彼らがどのように役立つかはわかりません。)

2) ルールチェーン

再帰的になることもできません:

No single implicit rule can appear more than once in a chain. (...)
This constraint has the added benefit of preventing any infinite loop
in the search for an implicit rule chain.

(MakeFilesをデバッグしながら、これでかなりの時間を失いました。

私が書いた最近のプロジェクトのPS GNUへのパッチは3.82を作成します これにより、この制限は新しいもので削除されます -m オプション(参照してください 討論)。それは私にとってうまく機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top