PLT方案:转换“在LISP中投射SPEL”中的一个宏

时间:2010-01-11 23:54:07

标签: scheme racket

    (defspel game-action (command subj obj place &rest rest)
  `(defspel ,command (subject object)
     `(cond ((and (eq *location* ',',place)
                  (eq ',subject ',',subj)
                  (eq ',object ',',obj)
                  (have ',',subj))
             ,@',rest)
            (t '(i cant ,',command like that.)))))

来自http://www.lisperati.com/actions.html的代码用于'宏定义宏'。我似乎无法将其恰当地转换为方案。有人可以向我解释在Scheme中创建同类事物的过程吗?

1 个答案:

答案 0 :(得分:4)

这种宏在Scheme中实际上要简单得多,因为您可以使用define-syntax-rule完成所有操作(在标准的Scheme代码中,您需要define-syntax + syntax-rules)。你基本上做同样的事情,减去整个报价/不引用的混乱。

(defspel (game-action command subj obj place rest ...)
  (defspel (command subject object)
    (cond [(and (eq? *location* 'place)
                (eq? 'subject 'subj)
                (eq? 'object 'obj)
                (have 'subj))
           rest ...]
          [else '(i cant command like that.)])))

由于这实际上是大部分代码,我将整个内容移植到PLT - 请参阅邮件列表中的post