separate sematics from syntax