为什么newLISP将字符串文字限制为2048个字符



我正试图为我制作的这个newLISP程序编写使用说明,但它一直抱怨字符串太长。

ERR: string token too long : "$$$$$$$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"

我花了大约十分钟的时间诅咒newLISP,并提出了偏执的理论,比如,也许字符串中不应该有引号,或者当我使用原始字符串({})时它会起作用,直到我开始切割字符串。它达到了消息消失的地步,使帮助消息变得毫无帮助。事实证明newLISP不喜欢超过2048(2^11)个字符的字符串。Soo,

为什么要限制字符串文字中的字符数
为什么是2048个字符

将单元内存增加到128MB(在手册中看到过)不会改变任何事情。现在唯一有效的解决方案(一个很粗糙的解决方案)是将帮助字符串拆分为两个字符串,每个字符串都包含2048字符,然后将它们与string连接起来
另一件奇怪的事情是,任何具有2048+字符的字符串在repl:中的打印方式都不同

> (dup "&" 2048)
    [text]&&&&&&&&&&&&&& .....
           ......
                &&&&&&&&&&&&&&&[/text]

> (dup "&" 2040)
    "&&&&&&&&&&&&&&&&&&& .....
        .....
                &&&&&&&&&&&&&&&"

有三种方法可以处理字符串:

  • 在引号中-处理转义字符-限制为2048个字符
  • 大括号中-不处理转义字符-限制为2048个字符
  • 在标记中-不处理转义-长度不受限制

来自手册:

带引号的字符串不能超过2048个字符。较长的字符串应使用[text]和[/text]标记分隔符。newLISP会自动将这些标记用于长度超过2048个字符的字符串输出。

字符串可能很长:

> (quiet (set 's (dup "&" 10E8))) ; don't bother to show the string :)
> (length s)
1000000000
> (10000 20 s)
"&&&&&&&&&&&&&&&&&&&&"
>

您唯一会遇到的问题是,在希望字符串真正结束之前,要处理可能包含[/text]标记的字符串中的源代码。看起来你还没有到那个地步…:)

最新更新