gpt4 book ai didi

racket - 将字符串映射到列表 Racket

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

我想要一个函数,它接受一个字符串,由一个 python 格式的树组成,就像这样

"[0, [1, 0]]"

并输出一个可用的 Racket 列表,像这样

'(0 (1 0))

我的第一步是将字符串转换为字符列表,用这个

(string->list treestring)

当在上面的字符串上调用时,结果为

'(#\[ #\0 #\, #\space #\[ #\1 #\, #\space #\0 #\] #\])

然后我打算检查我期望的各种字符并相应地解析它们,就像这样

(define (py-treestringlst-to-rkt-lst treestringlst result)
(cond
[(empty? treestringlst) result]
[(char=? (car treestringlst) #\[) (append (append result

但我在这里打住了,因为我意识到我不知道如何在 racket 中构建一个未闭合的括号。

我想更优雅的解决方案将涉及build-list;左括号 #\[ 将被解释为在每个后续字符上运行构建列表,直到找到右括号 #\]

但也许我还缺少一种更简单的方法,因为(如果还不清楚的话)我是一个敲诈勒索的新手。

编辑:

非常感谢,ex nihilo 和 Óscar López。我相信我可以更好地欣赏你的解决方案的优雅,以及他们所表现出的精通,既然我已经犯下了下面的暴行。然而,我并没有假装自己是 Racket 的狂热学生,以至于我宁愿在续集之前阅读你的文章,这样我就不会心痛了。

; On the other hand, it works — kind of. Always gives a result two layers deep, but I could fix that.... enough... to bed with me
(define (py-treestringlst-to-rkt-lst treestringlst result)
(cond
[(empty? treestringlst) result]
[(char=? (car treestringlst) #\[) (py-treestringlst-to-rkt-lst (cdr treestringlst) (append result (build-list 1 (lambda (x) '()))))]
[(char=? (car treestringlst) #\]) (py-treestringlst-to-rkt-lst (cdr treestringlst) (append result '(bracket)))]
[(and (char=? (car treestringlst) #\0) (list? (last result))) (py-treestringlst-to-rkt-lst (cdr treestringlst) (reverse (cons (reverse (cons 0 (reverse (car (reverse result))))) (cdr (reverse result)))))]
[(and (char=? (car treestringlst) #\1) (list? (last result))) (py-treestringlst-to-rkt-lst (cdr treestringlst) (reverse (cons (reverse (cons 1 (reverse (car (reverse result))))) (cdr (reverse result)))))]
[(and (char=? (car treestringlst) #\0) (not (list? (last result)))) (py-treestringlst-to-rkt-lst (cdr treestringlst) (append result '(0)))]
[(and (char=? (car treestringlst) #\1) (not (list? (last result)))) (py-treestringlst-to-rkt-lst (cdr treestringlst) (append result '(1)))]
[else (py-treestringlst-to-rkt-lst (cdr treestringlst) result)]))


(define (cleanit lst)
(filter (lambda (x) (not (equal? x '()))) (filter (lambda (x) (not (equal? x 'bracket))) lst)))

; Example call
(cleanit (py-treestringlst-to-rkt-lst '(#\[
#\[
#\0
#\,
#\space
#\1
#\]
#\,
#\space
#\0
#\,
#\space
#\1
#\,
#\space
#\[
#\0
#\,
#\space
#\1
#\]
#\,
#\space
#\0
#\,
#\space
#\1
#\,
#\space
#\0
#\,
#\space
#\[
#\1
#\,
#\space
#\0
#\]
#\]) '()))

编辑 2(关于 ex nihilo 的编辑和 tfb 的回复和评论):

的确,从无到有,我只是想出了同样的事情,使用你原来的 brackets->parenths 函数。

叫我疯子,tfb,但是这个

(define (brackets->parenths s)
(read
(open-input-string
(list->string (map (lambda (x)
(case x
[(#\[) #\(]
[(#\]) #\)]
[(#\') #\"]
[else x]))
(remove* '(#\,)
(string->list s)))))))

(brackets->parenths "['get', ['me', 'for'], 'not']")

对我来说,实际上看起来比这更干净

(require json)

(string->jsexpr (string-replace "['get', ['me', 'for'], 'not']" "\'" "\""))

可能是因为如果我的输入变得奇怪,它似乎更容易操纵。

最佳答案

如果您的输入相当受限——特别是如果它是 Python 文字的子集,并且像您的示例一样在语法上与 JSON 相同,那么您可以这样做:

(require json)
(string->jsexpr "[0, [1, 0]]")

这将导致 (0 (1 0))

如果您的 Python 文字子集在 JSON 中是相同的,我强烈建议使用 Python 的 JSON 支持来编写 JSON,然后将 JSON 读回 Racket 。手动重新实现大量 JSON 并不是我想要重新发明的轮子。

关于racket - 将字符串映射到列表 Racket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64885805/

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