Peano arithmetic at compile time
CP-1610 assembly, 37 bytes
This is simply using macro expansion.
Z EQU 0
MACRO S(n)
(%n%+1)
ENDM
 DCW [expression]

Example
With the expression S(S(Z)) * S(S(S(Z))), this gets compiled as:
00000000 Z                          
0x0                             Z EQU 0
                                MACRO S(n)
                                (%n%+1)
                                ENDM
                                ;DCW S(S(Z)) * S(S(S(Z)))
                                ;DCW (S(Z)+1) * S(S(S(Z)))
                                ;DCW ((Z+1)+1) * S(S(S(Z)))
                                ;DCW ((Z+1)+1) * (S(S(Z))+1)
                                ;DCW ((Z+1)+1) * ((S(Z)+1)+1)
0000   0006                      DCW ((Z+1)+1) * (((Z+1)+1)+1)
 ERROR SUMMARY - ERRORS DETECTED 0
               -  WARNINGS       0

(compiled with as1600 from the SDK included with jzIntv)