用于嵌套表达式的方案宏

发布于 2024-07-09 22:52:46 字数 402 浏览 9 评论 0原文

可以用Scheme(例如使用define-syntax)编写一个宏,该宏将采用这样的表达式:

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

并将这样的yield表达式作为输出?

(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??]))

Can a macro be written in Scheme (with define-syntax, for example) which will take expressions like this:

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

And yield expressions like this as output?

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

Of course, for arbitrary lengths. I can't think of a way to do it, given some template like this:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

涫野音 2024-07-16 22:52:46
(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)

(define bop list)

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

For example, (op 1 2 3 4) expands to (bop (bop (bop 1 2) 3) 4) and evaluates to (((1 2) 3) 4).

伴我心暖 2024-07-16 22:52:46

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

#!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 ...))))

The function you want to apply to the arguments should itself be an argument to the macro. Barring that, my solution was the same.

#!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 ...))))
千纸鹤带着心事 2024-07-16 22:52:46

显示答案如何计算:

(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 1 2) 3), b=4,就完成了。

To show how the answer works out:

(op 1 2 3 4)

This is an op with 4 statements, so the 2nd case gets selected with a=1, b=2, c=3, ...=4:

(op (bop 1 2) 3 4)

This is an op with 3 statements, so 2nd case again. a=(bop 1 2), b=3, c=4:

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

Now this is a bop with 2 statements, so a=(bop (bop 1 2) 3), b=4, and it's done.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文