背景:我一直在Scheme(R5RS)写一个小翻译。
阅读器/词法分析器从输入中获取(有时很长)字符串并对其进行标记。它通过将字符串的前几个字符与某个标记匹配并返回该标记和该字符串的剩余不匹配部分来实现此目的。
问题:要返回字符串的剩余部分,每次读取令牌时都会创建一个新字符串。这意味着读者在字符串中存在的令牌数量为O(n ^ 2)。
可能的解决方案:将字符串转换为列表,可以在时间O(n)中完成,然后从列表而不是字符串中提取令牌,返回列表的其余部分而不是字符串的其余部分。但这似乎非常低效和人为。
问题:我想象一下,或者由于纯粹的功能性展望,在Scheme中没有其他方法可以有效地做到这一点吗?
编辑:在R5RS Scheme中,没有办法将指针返回到字符串中。 “substring”函数是提取一个本身就是字符串的对象的唯一函数。但Scheme标准坚持认为这是一个新分配的字符串。为什么?因为字符串在Scheme R5RS中不是不可变的,例如看到“字符串集!”功能!!
下面建议的一个解决方案是将索引存储到字符串中。然后,人们可以从该索引一次一个地读取字符,直到读取令牌。我用于标记化的regexp库太糟糕了,需要一个实际的字符串而不是一个索引...
答案 0 :(得分:1)
考虑创建字符串的shared-substring实现(例如,Java就是这样做的)。因此,当您想要获取给定字符串的子字符串而不是复制字符时,只需将指针指向(某些位置)这些字符和长度。