Usando `With` com uma lista de` Rules` - mas sem afetar o comportamento normal de `With`

Digamos que eu tenha uma lista deRules

rules = {a -> b, c -> d};

que eu uso em todo o notebook. Então, a certa altura, faz sentido querer que as regras sejam aplicadasantes de qualquer outra avaliação ocorrer em uma expressão. Normalmente, se você quiser algo assim, você usaria

In[2]:= With[{a=b,c=d}, expr[a,b,c,d]]
Out[2]= expr[b, b, d, d]

Como posso tomarrules e insira-o no primeiro argumento deWith?

Editar

AmbosAlgumas soluções falham fazem tudo o que eu estava procurando - mas eu deveria ter enfatizado esse ponto um pouco mais. Veja a parte em negrito acima.

Por exemplo, vejamos

rules = {a -> {1, 2}, c -> 1};

Se eu usar esses vaules emWith, Eu recebo

In[10]:= With[{a={1,2},c=1}, Head/@{a,c}]
Out[10]= {List,Integer}

Algumas versões doWithRules produção

In[11]:= WithRules[rules, Head/@{a,c}]
Out[11]= {Symbol, Symbol}

(Na realidade, Eu não percebi que a resposta de Andrew tinha o atributoHoldRest - para que funcione exatamente como eu queria.)