Macros 需要帮助减少我的Scheme宏中的样板文件吗

Macros 需要帮助减少我的Scheme宏中的样板文件吗,macros,scheme,guile,Macros,Scheme,Guile,我在搞诡计。我在制作宏,但我发现我在输出中重复了很多样板文件。 我是Scheme的新手,所以如果有比语法案例更好的方法,我愿意听取建议 在这个宏中,输入“set”与“setconst”之间只有一个区别,输出“elementReference”与“stringValue”之间只有一个区别。我曾尝试使用#` with#来取消引号,但我收到了错误消息,如“语法:表单(语法集)中缺少省略号”。理想情况下,我想在我的宏中放入一些scheme代码来区分set和setconst,并相应地更改输出,但正如我所说

我在搞诡计。我在制作宏,但我发现我在输出中重复了很多样板文件。 我是Scheme的新手,所以如果有比语法案例更好的方法,我愿意听取建议

在这个宏中,输入“set”与“setconst”之间只有一个区别,输出“elementReference”与“stringValue”之间只有一个区别。我曾尝试使用#` with#来取消引号,但我收到了错误消息,如“语法:表单(语法集)中缺少省略号”。理想情况下,我想在我的宏中放入一些scheme代码来区分set和setconst,并相应地更改输出,但正如我所说的,这是新的,如果有更好的方法来获得结果,我是开放的

这是我的密码:

  (define-syntax assign
    (lambda (stx)
      (syntax-case stx (then)
        ((assign aname then target (set to from) ...) #'(assignments (name aname) 
                                                                     (label aname) 
                                                                     (locationX 50) 
                                                                     (locationY 50) 
                                                                     ((assignmentItems 
                                                                       (operator Assign) 
                                                                       (assignToReference to) 
                                                                       (value (elementReference from))) ...)
                                                                     (connector (targetReference target))))
        ((assign aname then target (setconst to from) ...) #'(assignments (name aname) 
                                                                     (label aname) 
                                                                     (locationX 50) 
                                                                     (locationY 50) 
                                                                     ((assignmentItems 
                                                                       (operator Assign) 
                                                                       (assignToReference to) 
                                                                       (value (stringValue from))) ...)
                                                                     (connector (targetReference target))))
        )))

我提出了一个解决方案,但我仍然欢迎大家提出更好的方法。 我没有使用if-fing或unquote,而是制作了一个更简单的宏,只是为了区别,我在更大的宏中调用它。这应该在我扩展DSL时起作用

(define-syntax assign-from
  (lambda (stx)
    (syntax-case stx (set setconst)
      ((assign-operator set to from) #'(elementReference from))
      ((assign-operator setconst to from) #'(stringValue from)))))

(define-syntax assign
  (lambda (stx)
    (syntax-case stx (then)
      ((assign aname then target (set to from) ...) #'(assignments (name aname) 
                                                                   (label aname) 
                                                                   (locationX 50) 
                                                                   (locationY 50)
                                                                   ((assignmentItems 
                                                                     (assignToReference to) 
                                                                     (operator Assign) 
                                                                     (value (assign-from set to from))) ...)
                                                                   (connector (targetReference target))))
      )))