Scrapping your inefficient engine: using partial evaluation to improve domain-specific language implementation