Macros 使用defmac模拟where-in方案

Macros 使用defmac模拟where-in方案,macros,scheme,Macros,Scheme,实际上,我在计划中遇到了一个问题。我只是不知道如何解决它。这很容易理解,我想对任何方案专家来说都很容易。我只需要在定义宏“操作”的scheme中使用defmac函数模拟haskell的where表达式。例如,执行如下代码 > (operation (+ x y) where ([x 1] [y (+ x 32)])) 34 我有点熟悉用宏(defmac)在scheme中表示简单对象的方法,但现在我真的被这个问题困住了 任何帮助或想法都是非常受欢迎的。 提前谢谢

实际上,我在计划中遇到了一个问题。我只是不知道如何解决它。这很容易理解,我想对任何方案专家来说都很容易。我只需要在定义宏“操作”的scheme中使用defmac函数模拟haskell的where表达式。例如,执行如下代码

> (operation (+ x y) 
   where ([x 1]
          [y (+ x 32)]))
34
我有点熟悉用宏(defmac)在scheme中表示简单对象的方法,但现在我真的被这个问题困住了

任何帮助或想法都是非常受欢迎的。
提前谢谢。

听起来应该这样做(使用以下定义):

它只是将您的
操作
形式转换为等效的
let*
,这样您的示例将变成:

(let* ((x 1)
       (y (+ x 32)))
  (+ x y))

如果我理解正确,您希望将代码转换为

(let* ((x 1)
       (y (+ x 32))
  (+ x y))

(define-syntax operation
 (syntax-rules (where)
   ((operation expression where body)
    (let* body expression))))

应该这样做,但只有在“where”紧跟在短语后面的地方,伙计,你才迟到13分钟-DDrat,我的生活故事。但是Haskell的
where
也允许
(操作(+xy)where([y(+x32)][x1])
)当然,我们还不清楚OP是打算解决这个问题还是忽略它…@Will In Haskell,这很容易实现,因为普遍存在惰性评估。在Scheme中,这有点棘手。:-)谢谢你们的帮助,但我更需要这样的开始。问题是我的老师有一些急迫的要求:(defmac(val-where())#关键词:val-where(let((val-expr)…)(@user2480503
defmac
不是一个标准的Scheme宏,所以我不得不四处寻找它。我找到的版本是,我已经重新格式化了宏以使用该版本。@user2480503我找到了一个不同的版本,可能是您正在使用的版本:
(let* ((x 1)
       (y (+ x 32))
  (+ x y))

(define-syntax operation
 (syntax-rules (where)
   ((operation expression where body)
    (let* body expression))))