【问题标题】:Scheme Macro for nesting expressions用于嵌套表达式的方案宏
【发布时间】:2010-09-25 07:24:08
【问题描述】:

是否可以在 Scheme 中编写宏(例如 define-syntax),它将采用如下表达式:

(op a b c d e f g h i j)

然后将这样的表达式作为输出?

(op (op (op (op (op (op (op (op (op a b) c) d) e) f) g) h) i) j) 

当然,对于任意长度。鉴于这样的模板,我想不出办法:

(define-syntax op
  (syntax-rules ()
    [(_) 'base-case]
    [(v1 v2 ...) 'nested-case??]))

【问题讨论】:

  • 我很好奇。这只是一个理论上的问题,还是您有一个有趣的用例?一般来说,这种包装可以通过 foldLeft 来实现。
  • 嗯,好点。我问这个主要是因为我没有想到你的方式=P。我没有意识到这正是 foldl 所做的。

标签: scheme macros nested define-syntax


【解决方案1】:
(define bop list)

(define-syntax op
  (syntax-rules ()
    ((op a b) (bop a b))
    ((op a b c ...) (op (bop a b) c ...))))

例如,(op 1 2 3 4) 扩展为 (bop (bop (bop 1 2) 3) 4) 并计算为 (((1 2) 3) 4)

【讨论】:

  • 如果不匹配,为什么要在文字标识符中使用 bop?
  • 方案宏真的很聪明……不是吗?
【解决方案2】:

显示答案的结果:

(op 1 2 3 4)

这是一个有 4 条语句的操作,因此选择第二种情况 a=1, b=2, c=3, ...=4:

(op (bop 1 2) 3 4)

这是一个有 3 个语句的操作,所以又是第 2 种情况。 a=(bop 1 2), b=3, c=4:

(op (bop (bop 1 2) 3) 4)

现在这是一个有 2 个语句的 bop,所以 a=(bop (bop 2) 3), b=4,就完成了。

【讨论】:

    【解决方案3】:

    您要应用于参数的函数本身应该是宏的参数。除此之外,我的解决方案是一样的。

    #!r6rs
    
    (import (rnrs base))
    
    (define-syntax claudiu
      (syntax-rules ()
        ((claudiu fun first second)
         (fun first second))
        ((claudiu fun first second rest ...)
         (claudiu fun (claudiu fun first second) rest ...))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多