即使最后一个字符是分隔符,也要拆分字符串

Sim*_*mon 0 lisp string split common-lisp

我想删除字符串末尾的一些字符.

我做了这个功能:

(defun del-delimiter-at-end (string)
  (cond
    ((eq (delimiterp (char string (- (length string) 1))) nil) 
        string )
    (t 
        (del-delimiterp-at-end (subseq string 0 (- (length string) 1))) ) ) )
Run Code Online (Sandbox Code Playgroud)

有了这个 :

(defun delimiterp (c) (position c " ,.;!?/"))
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么它不起作用.我有以下错误:

Index must be positive and not -1
Run Code Online (Sandbox Code Playgroud)

请注意,我想在字符串列表中拆分字符串,我已经在这里看了一下:

Lisp - 将输入拆分为单独的字符串

但是如果字符串的结尾是分隔符,它就不起作用,这就是我试图这样做的原因.

我究竟做错了什么?提前致谢.

sds*_*sds 8

简单的方法

只需使用string-right-trim:

(string-right-trim " ,.;!?/" s)
Run Code Online (Sandbox Code Playgroud)

你的错误

如果您向您传递一个空字符串del-delimiter-at-end,您将-1作为第二个参数传递给char.

你的守则

  1. 没有理由这样做(eq (delimiterp ...) nil); 只需使用(delimiterp ...)(并切换条款!)

  2. 使用模式是惯用的,if而不是cond只有两个子句,每个只有一个表单.

  3. 您可以subseq递归调用,这意味着您不仅无缘无故地分配内存,您的算法也是字符串长度的二次方.