codegen should take arbitrary blocks; let expressions