【问题标题】:Need help reducing the boilerplate in my Scheme macro需要帮助减少我的 Scheme 宏中的样板
【发布时间】:2021-06-11 00:49:58
【问题描述】:

我在 Guile Scheme 工作。我正在制作宏,但我发现我在输出中重复了很多样板。 我对 Scheme 很陌生,所以如果有比语法案例更好的方法来解决这个问题,我愿意接受建议。

在这个宏中,输入只有一个区别,“set”与“setconst”,输出只有一个区别,“elementReference”与“stringValue”。我尝试使用带有#, 的#` 来取消引用,但我收到诸如“语法:表单中缺少省略号(语法集)”之类的错误消息。理想情况下,我想在我的宏中放置一些方案代码来区分 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))))
        )))

【问题讨论】:

    标签: macros scheme guile


    【解决方案1】:

    我提出了一个 解决方案,但我仍然欢迎提供更好的方法来做到这一点。 我没有使用 if-fing 或取消引用,而是为了区别而制作了一个更简单的宏,并在我更大的宏中调用它。当我扩展我的 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))))
          )))
    

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多