删除Racket列表中的括号
我试图编写一个代码,从列表的每个顶级元素中删除括号。例如,输入'((12)(34))将产生'(1234),输入'((x(y))z)应产生'(x(y)z) 有没有办法识别成对的括号?我想我可以找到一对括号并删除它们,但我不知道如何做,也不知道如何只从顶部元素删除 模式“我正在尝试(做一些事情)列表中的每个顶级元素”是一个肯定的迹象,表明删除Racket列表中的括号,racket,Racket,我试图编写一个代码,从列表的每个顶级元素中删除括号。例如,输入'((12)(34))将产生'(1234),输入'((x(y))z)应产生'(x(y)z) 有没有办法识别成对的括号?我想我可以找到一对括号并删除它们,但我不知道如何做,也不知道如何只从顶部元素删除 模式“我正在尝试(做一些事情)列表中的每个顶级元素”是一个肯定的迹象,表明map将参与其中。另外,在您的第一个示例中,有一个重要线索: '((1 2) (3 4)) => '(1 2 3 4) 那只是追加* (append*
map
将参与其中。另外,在您的第一个示例中,有一个重要线索:
'((1 2) (3 4)) => '(1 2 3 4)
那只是追加*
(append* '((1 2) (3 4))) => '(1 2 3 4)
但是'((x(y))z=>'(x(y)z)
的情况并非如此
仔细想想,append*
非常接近您想要的:它从列表中的每个元素中展开一级paren。问题是,输入中的某些元素不是列表,所以没有什么可以展开的
我们可以通过将每个非列表元素包装在一个单例列表中来解决这个问题,这样'((x(y))z
就变成'((x(y))(z))
。然后我们可以使用append*
:
(append* '((x (y)) (z))) => '(x (y) z)
(define (remove-parens lst)
(append* (map maybe-wrap lst)))
这就是map
方便的地方map
是一个函数,它接受一个函数(f
)和一个列表(lst
),并通过对lst
的每个元素应用f
返回一个新列表。例如:
(map symbol? '(a 2 b c 5)) => '(#t #f #t #t #f)
> (unwrap '((1 2) (3 4 (5 (6)))))
'(1 2 3 4 (5 (6)))
> (unwrap '((x (y)) z))
'(x (y) z)
假设您编写了一个函数,该函数接受一个参数,如果它是一个列表,则返回该参数,如果它不是列表,则将其包装为一个单例列表。让我们称之为也许是wrap
。然后您可以将映射到您的输入上,并将结果传递到append*
:
(append* '((x (y)) (z))) => '(x (y) z)
(define (remove-parens lst)
(append* (map maybe-wrap lst)))
我将留给您编写maybe wrap
而不使用append
或map
,您可以定义函数来执行您想要的操作,如下所示:
(define (unwrap lst)
(if (null? lst)
'()
(my-append (car lst) (cdr lst))))
(define (my-append lhs rhs)
(cond
[(null? lhs)
(unwrap rhs)]
[(pair? lhs)
(cons (car lhs)
(my-append (cdr lhs) rhs))]
[else
(cons lhs (unwrap rhs))]))
例如:
(map symbol? '(a 2 b c 5)) => '(#t #f #t #t #f)
> (unwrap '((1 2) (3 4 (5 (6)))))
'(1 2 3 4 (5 (6)))
> (unwrap '((x (y)) z))
'(x (y) z)
您的输入是字符串还是s表达式?输入是列表!不幸的是,我是个新手,我从来没有接触过地图。但从你说的话来看,似乎我可以用append替换“somefunction”?@Vic不太可能。我已经更新了我的答案。看看能不能帮上忙。