GNUmake:如何编写一个真正的lambda

时间:2017-03-31 13:36:16

标签: lambda functional-programming gnu-make

以下是我对GNUmake中一个lambda表达式的仿真模拟:

space := $(strip) $(strip)
comma := ,

# convert a space-separated list in $1 into a comma-separated list:
list2param = $(subst $(space),$(comma),$(strip $1))

# param $1 = quoted GUNmake expression
# param $2 = parameters to the expression as space-separated list
lambda = $(eval _lambda=$1)$(eval _lambda:=$$(call _lambda,$(call list2param,$2)))$(_lambda)

示例:

$(info $(call lambda,$$1 .. $$2 .. $$3,foo bar baz))

输出:

foo .. bar .. baz

但这不太令人满意,因为我必须使用变量" _lambda"窗帘后面的机制并不像lambda那样,因为评估与定义没有分开。是否有一种干净,直接的方式来实现lambda?或者是否已经实现了一些机制,我的盲目程序编程眼睛并没有实现?

1 个答案:

答案 0 :(得分:0)

与任何原始替代语言一样,您通过引用推迟评估。下面的示例看起来很糟糕,并且不会让你嵌套lambda,但是否则可以起作用:

define lambda
$(eval lambda-f=$1)lambda-f
endef

$(foreach n,1 2 3,$(call $(call lambda,$$(info $$(shell seq -s ' ' $$1))),$n))

通过修改语法,可以(可以说)重新获得一些可读性:

define lambda
$(eval lambda-f=$(subst ^,$$,$1))lambda-f
endef

$(foreach n,1 2 3,$(call $(call lambda,^(info ^(shell seq -s ' ' ^1))),$n))