Common Lisp 中非常奇怪的错误

jbc*_*oko 0 command-line function common-lisp

这实在是让我很头疼

我在文件中编写了以下简单函数。

 (defun find-num (string)
   (if (> (length string) 1)
       (parse-integer (remove (coerce (get-first-letter string)
                                      'character)
                              string))
     ;else
     1))
Run Code Online (Sandbox Code Playgroud)

它的作用是在删除第一个字母后解析字符串“a23”中的数字。我假设只有第一个字符是字母,其余的都是“数字”。

我加载文件,当我尝试运行该函数时,它给我错误,说: 正确的列表不能以“a3”结尾......什么???

但是,当我直接在命令行中复制并粘贴相同的代码时,该函数将按预期工作。

这是什么 ?常见的 Lisp 错误?还是有什么我没有看到的?

 ;; Loading file C:\Users ... (hidden)
 ;; Loaded file C:\Users ... (hidden)
 T
 [2]> (find-num "a3")

 *** - ENDP: A proper list must not end with "a3"
 The following restarts are available:
 ABORT          :R1      Abort main loop
 Break 1 [3]> :a

 [4]> (defun find-num (string)
   (if (> (length string) 1)
  (coerce (get-first-letter string) 'character) string))

     ;else
     1))
 WARNING: DEFUN/DEFMACRO: redefining function FIND-NUM in top-level, was
     defined in C:\Users\.... (hidden)
 FIND-NUM
 [5]> (find-num "a3")
 3 ;
 1
Run Code Online (Sandbox Code Playgroud)

Rai*_*wig 5

顺便提一句。:

(parse-integer (remove (coerce (get-first-letter string)
                               'character)
                       string))
Run Code Online (Sandbox Code Playgroud)

只是

(parse-integer (remove (aref string 0) string))
Run Code Online (Sandbox Code Playgroud)

更好:

(parse-integer (subseq string 1))
Run Code Online (Sandbox Code Playgroud)

是最好的

(parse-integer string :start 1)
Run Code Online (Sandbox Code Playgroud)

  • 很高兴看到重构过程。 (2认同)
  • (aref string 1) 实际上不是 (aref string 0) 返回第一个字母吗? (2认同)