reimplement let macro