用于嵌套表达式的方案宏
可以用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
例如,
(op 1 2 3 4)
扩展为(bop (bop (bop 1 2) 3) 4)
并计算为(((1 2 )3)4)
。For example,
(op 1 2 3 4)
expands to(bop (bop (bop 1 2) 3) 4)
and evaluates to(((1 2) 3) 4)
.您想要应用于参数的函数本身应该是宏的参数。 除此之外,我的解决方案是相同的。
The function you want to apply to the arguments should itself be an argument to the macro. Barring that, my solution was the same.
显示答案如何计算:
这是一个包含 4 个语句的操作,因此选择第二种情况,选择 a=1、b=2、c=3、...=4:
这是一个包含 3 个语句的操作,因此又是第2个案例。 a=(bop 1 2), b=3, c=4:
现在这是一个有 2 条语句的 bop,所以 a=(bop (bop 1 2) 3), b=4,就完成了。
To show how the answer works out:
This is an op with 4 statements, so the 2nd case gets selected with a=1, b=2, c=3, ...=4:
This is an op with 3 statements, so 2nd case again. a=(bop 1 2), b=3, c=4:
Now this is a bop with 2 statements, so a=(bop (bop 1 2) 3), b=4, and it's done.