GNUmake:如何编写真正的lambda

GNUmake:如何编写真正的lambda,lambda,functional-programming,gnu-make,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

以下是我对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?或者已经有某种机制实现了,而我的盲目的过程编程眼睛却看不到?

就像在任何原始替换语言中一样,您通过引用来推迟评估。下面的示例看起来很糟糕,不允许您嵌套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))

您的高级问题是什么?@MaximeGroushkin,例如,在表排序中,我需要一个排序键,我决定将其作为代码传递:
$(信息排序表:$(调用sort\u tbl,$(调用select\u from\u MEMORY,12,where\u name\u FBL),3,$$(调用lpad,$$(调用lstrip,$$1,0x),8,0))
$$(call lpad…
将取第1列的元素(十六进制数),去掉0x前缀并用0左键填充,以创建一个可排序的make键。使用这两个函数
#按1(例如010011->010100)bincnt=$(如果$1,$(如果$(patsubst%1,,$1),$(patsubst%0,,%1),$(调用bincnt$(patsubst%1,%,$1))0),1)#在每次调用时生成不同的符号symgen=$(eval last_symgen:=sym$(call bincnt,$(subst sym,,,$(last_symgen)))$(last_symgen)
每次调用时可以生成不同的lambda名称。