0

我有一个声明性语言(twolc,实际上)的源文件,我需要编写许多变体:规范版本和许多非规范版本,每个来自标准的一个或多个变体。例如,假设规范性文件有三个规则:代码管理:生成具有各种规则的细微变化的源文件

Rule A: 
    Do something A-ish 

Rule B: 
    Do something B-ish 

Rule C: 
    Do something C-ish 

然后一个变体可能有相同的规则为准则的AC,但B不同的规则,我会打电话给B-1

Rule A: 
    Do something A-ish 

Rule B-1: 
    Do something B-ish, but with a flourish 

Rule C: 
    Do something C-ish 

想象一下,在许多不同的规则上你有许多不同的微妙变化,你有我的情况。我担心的问题是代码可维护性。如果稍后我决定Rule A需要以某种方式重构,那么我将有50多个文件需要手动编辑完全相同的规则。

我的想法是有单独的文件中每一条规则,并将它们连接成使用cat变化:cat A.twolc B-1.twolc C.twolc > not-norm.twolccat A.twolc B.twolc C.twolc > norm.twolc,等

是否有专门用来管理这类问题的任何工具?有没有比我想到的更好的方法?我提出的解决方案是否存在我应该留意的弱点?

+0

我尝试过在网上搜索,但这似乎是不知道正确的术语是封锁的那些时代之一。 – reynoldsnlp

回答

1

当你添加的makefile文件标签,这里是一家制造基于GNU(只有GNU的make)解决方案:

# Edit this 
RULES  := A B B-1 C 
VARIATIONS := norm not-norm 
norm-rules := A B C 
not-norm-rules := A B-1 C 
# Do not edit below this line 

VARIATIONSTWOLC := $(patsubst %,%.twolc,$(VARIATIONS)) 

all: $(VARIATIONSTWOLC) 

define GEN_rules 
$(1).twolc: $$(patsubst %,%.twolc,$$($(1)-rules)) 
    cat $$^ > [email protected] 
endef 
$(foreach v,$(VARIATIONS),$(eval $(call GEN_rules,$(v)))) 

clean: 
    rm -f $(VARIATIONSTWOLC) 

patsubst很简单。 foreach-eval-call有点棘手。长话短说:它遍及所有变化(foreach)。对于每个变体v,它通过将$(1)替换为$(v)(当前变体)和$$通过$扩大(callGEN_rules。然后将每个展开结果实例化(eval)作为正常制作规则。例如:v=norm,所述GEN_rules膨胀产生:

norm.twolc: $(patsubst %,%.twolc,$(norm-rules)) 
    cat $^ > [email protected] 

其又扩展为(一步工序):

步骤1:

norm.twolc: $(patsubst %,%.twolc,A B C) 
    cat $^ > [email protected] 

第二步:

norm.twolc: A.twolc B.twolc C.twolc 
    cat $^ > [email protected] 

step3:

norm.twolc: A.twolc B.twolc C.twolc 
    cat A.twolc B.twolc C.twolc > norm.twolc 

这你想要做什么:如果norm.twolc不存在或是否有任何A.twolcB.twolcC.twolcnorm.twolc更近,被执行的配方。