2013-01-07 40 views
0

這真的讓我頭痛非常奇怪的錯誤在普通的lisp

我有一個簡單的函數寫在一個文件中。

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

它能做什麼是解析從字符串「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 
+0

我還發現其他一些函數的行爲也相似。 – jbchichoko

+0

我將你的函數複製到一個文件中,用(aref字符串0)代替(get-first-letter字符串),加載文件並且它工作。 –

+0

我和@RainerJoswig做的一樣,它也可以。 – juanitofatas

回答

4

順便說一句:

(parse-integer (remove (coerce (get-first-letter string) 'character) string)) 

只是

(parse-integer (remove (aref string 0) string)) 

更好:

(parse-integer (subseq string 1)) 

最好

(parse-integer string :start 1) 
+1

看到重構過程非常高興。 – juanitofatas

+0

這是非常清潔。不能相信我從來沒有發現任何有用的內置函數,而不是以乏味的方式實現我自己的功能。 – jbchichoko

+0

我想我會接受這個答案。 :) – jbchichoko