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