gpt4 book ai didi

functional-programming - 在 Scheme 中定义一个宏来创建花哨的子列表

转载 作者:行者123 更新时间:2023-12-04 08:42:03 25 4
gpt4 key购买 nike

我想解决一个关于宏的问题:

Define this construct: (subl e_1 e_2 ... -> e_i ... e_j <- e_j+1 ... e_n); its evalutation returns the sublist (e_i ... e_j). E.g. (subl 1 -> 2 3 4 <- 5 6) should be (2 3 4).

我试图解决它(以下是部分解决方案)但没有奏效...

(define-syntax subl
(syntax-rules(> <)
((_ x y ... > x ... y < c v )
(begin
'(x y)))))

错误是:

syntax-rules: misplaced ellipsis in pattern (follows other ellipsis) in: ...

最佳答案

您不能在一对括号中使用多个省略号,如果您使用关键字 -> 也没关系和 <-语言不够聪明,无法知道在哪里停止扩展。

例子:
(_ x ...)是合法的并且x ...捕获结束括号之前的所有内容。
(_ x y ... z)是合法的并且x匹配开头的单个元素,y ...捕获所有内容,但最后一个元素和 z匹配末尾的单个元素。
(_ (x ...) y ...)是合法的并且x ...捕获内部括号和 y ... 内的所有内容外括号内的所有内容。
(_ x ... y ...)这是合法的,因为您无法判断将这两个组扩展到多远。

所以你必须分多个步骤解决这个问题:删除->之前的元素,去掉<-之后的元素最后捕获中间的列表。

(define-syntax subl
(syntax-rules (-> <-)
((_ -> x ... <-)
'(x ...))
((_ -> x ... y)
(subl -> x ...))
((_ x y ...)
(subl y ...))))

关于functional-programming - 在 Scheme 中定义一个宏来创建花哨的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34239461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com