2017-03-31 6 views
0

Das schreibt folgende ist mein Nehmen auf einem so lala Emulation eines Lambda-Ausdruck in gnumake:gnumake: wie eine echte 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) 

Beispiel:

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

Ausgang:

foo .. bar .. baz 

Aber das ist weniger als befriedigend, da ich eine Variable "_lambda" hinter dem Vorhang verwenden muss und der Mechanismus ist nicht wirklich wie Lambda da die Bewertung nicht von der Definition getrennt ist. Gibt es einen sauberen, direkten Weg, ein Lambda zu implementieren? Oder ist bereits ein Mechanismus implementiert, den meine blinden prozeduralen Programmieraugen nicht verstanden haben?

+1

Was ist Ihr Hoch -Level-Problem? –

+0

@ MaximEgorushkin In einer Tabelle muss ich einen Sortierschlüssel haben, den ich als Code übergeben habe: '$ (info Sortiertabelle: $ (Aufruf sort_tbl, $ (Aufruf select_from_MEMORY, 1 2, where_name_FBL), 3, $$ (Aufruf lpad, $$ (Call lstrip, $$ 1,0x), 8,0))) '. Das '$$ (call lpad ...' 'nimmt das Element (eine hexadezimale Zahl) von Spalte 1, entfernt das Präfix 0x und belässt es mit Nullen, um einen Schlüssel zu erzeugen, der für make sortierbar ist. – Vroomfondel

Antwort

0

Wie in jeder primitiven Ersetzungssprache wird die Auswertung durch Quoting verzögert. Das Beispiel sieht unten schrecklich und nicht Sie nisten lambdas lassen, aber ansonsten funktioniert:

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

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

Einige Lesbarkeit kann (wohl) wiedergewonnen werden, indem die Syntax wie folgt Änderung:

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

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

Mit den zwei Funktionen '# Zähle ein binäres Literal um 1 (zB 010011 -> 010100) bincnt = $ (wenn $ 1, $ (wenn $ (patsubst% 1 ,, $ 1), $ (patsubst% 0,% 1, $ 1), $ (Aufruf bincent, $ (patsubst% 1,%, $ 1)) 0), 1) # Erzeuge bei jedem Aufruf ein anderes Symbol symgen = $ (eval last_symgen: = sym $ (Aufruf bincnt, $ (subst sym ,, $ (last_symgen)))) $ (last_symgen) 'man könnte bei jedem Aufruf verschiedene Lambda-Namen erzeugen. – Vroomfondel

Verwandte Themen