Вопрос

В последнее время на работе я делал некоторый перевод от Makefiles в альтернативную систему сборки. Я видел какой-то довольно волосатый код в некоторых местах, используя функциональную карту, фильтр и конструкции Foreach. Это удивило меня, поскольку я думаю, что сценарии сборки должны быть максимально декларативными.

Во всяком случае, это заставило меня думать: это язык makefile (скажем, последний GNU, чтобы быть конкретным) Turing Complete?

Это было полезно?

Решение

Да, см это. Отказ Как только у вас есть лямбда, это все вниз оттуда.

Вот плагиат Пример Фибоначчи

Это должно быть достаточно, чтобы построить фундамент для более общности (я должен вернуться на работу, или я бы играю больше.)

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 что снимает это ограничение новым -М. Опция (см обсуждение). Он отлично работает для меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top