gpt4 book ai didi

list - LISP 查找最后一对括号

转载 作者:太空宇宙 更新时间:2023-11-03 18:43:49 24 4
gpt4 key购买 nike

我编写的函数必须返回 } 的位置,它对应于它从一开始就找到的 { 的第一次出现(我不是在寻找 } 的最后一次出现)。例如,给定这个 JSON 类型的结构化字符串

(paired-b (coerce "[{\"b\": {\"c\": [[1, {\"d\": 1}] , {\"e\": 3}]},\"g\": 2}, {\"a\": 2}]"'列表)

函数应该返回子序列 -> 之前的 }(与字符串的第一个 { 配对),{\"a\": 2} ",而是返回子序列 -> 之前的位置 -> ,\"g\": 2} ...但是如果我尝试用

(paired-b (coerce "[ {\"a\" : 1} , {\"b\" : 2} ]" 'list))

函数返回所需 } 的正确位置,即逗号之前的位置。代码的哪一部分被窃听了?还有其他方法可以实现这样的功能吗?

(defun paired-b (list)
(if (position #\{ list)
(if (< (position #\{ list) (position #\} list))
(if (eql (position #\{ list) (- (position #\} list) 1))
(position #\} list :start
(+ (position #\{ list)
(paired-b (subseq list (+ (position #\{ list) 1))) 1))
(position #\} list :start
(+ (position #\{ list)
(paired-b (subseq list (+ (position #\{ list) 1) 2))))) 0) 0))

编辑:我尝试了一些完全不同的东西

(defun return-c (input open close pos)
(if (and (eql open close) (not (and (eql 0 open) (eql 0 close))))
(- pos 1)
(cond ((eql (car input) #\{)
(return-c (cdr input) (+ 1 open) close (+ 1 pos)))
((eql (car input) #\})
(return-c (cdr input) open (+ 1 close) (+ 1 pos)))
(t (return-c (cdr input) open close (+ 1 pos)))
)
)
)

open = count {, close = count }, pos = 位置索引

此代码似乎有效,但在解析器内部,如果我解析长字符串,则其他函数调用它,程序将进入 stackoverflow。

最佳答案

寻找第一个 {。从那里循环,计算嵌套级别。当级别达到 0 时,您就找到了匹配项。

(defun curly-positions (string)
"Looks for the first #\{ in `string', then finds the matching #\}.
Returns these positions as two values."
(let* ((open-position (position #\{ string :test #'char=))
(close-position (loop :for i :upfrom (1+ open-position)
:for c := (char string i)
:for level := 1
:then (case c
(#\{ (1+ level))
(#\} (1- level))
(t level))
:when (zerop level)
:do (return i))))
(values open-position
close-position))))

关于list - LISP 查找最后一对括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239263/

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