使用defmac模拟scheme中的位置

时间:2013-08-23 02:27:21

标签: macros scheme

我实际上遇到了Scheme中的问题。我只是不知道如何解决它。理解起来非常简单,我觉得任何Scheme专家都很容易。我只需要在定义宏“操作”的方案中用defmac函数模拟haskell的where表达式。例如,执行如下代码

> (operation (+ x y) 
   where ([x 1]
          [y (+ x 32)]))
34

我对使用宏(defmac)在方案中表示简单对象的方式很熟悉,但现在我真的遇到了这个问题。

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

2 个答案:

答案 0 :(得分:2)

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

的代码
(let* ((x 1)
       (y (+ x 32))
  (+ x y))

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

应该这样做,但只能在表达式

之后的“where”之后

答案 1 :(得分:1)

听起来应该这样做(使用defmac的定义):

(defmac (operation expr
          where (binding ...))
        #:keywords where
  (let* (binding ...)
    expr))

它只是将您的operation表单转换为等效的let*,以便您的示例成为:

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