Re: [情報] 電腦輔助工程製圖LISP的除錯
這是part2
前一篇是原則上的問題 這篇是技巧上的說明
什麼無法載入 括號出問題的 就不需要看這篇了
LISP最麻煩的地方
就是沒有類似C語言的介面--會提示哪一行出錯
但我們可以創造這些介面!
舉個例子
(defun c:test (/ IP R P1 PI/2)
(setq IP '(0 0) R 10) ;定義圓心與半徑
(command "circle" IP R) ;畫圓
(setq P1 (polar IP PI/2 R) ;定義P1
(command "line" IP P1 "") ;畫線
);end defun
這個執行時,會出現; error: bad argument type: numberp: nil
眼力好的人應該可以發現是PI/2沒有定義
但如果我們眼力不好,那怎麼辦呢?
最好的除錯方法 就是觀察「程式執行到哪兒了」
很顯然的
執行程式中畫出了圓 >>有執行這行 (command "circle" IP R) ;畫圓
但是線沒有畫出來 >>沒有執行這行 (command "line" IP P1 "") ;畫線
因此可以知道 出錯的程式一定是這邊附近
(setq P1 (polar IP PI/2 R) ;定義P1
(command "line" IP P1 "") ;畫線
這時候眼力再差,也可以看出來PI/2沒有定義吧!
=============================================================
上面的例子很簡單 但是如果遇到這麼一串(setq)呢
(defun c:test2 (/ a b c d e f g)
(setq a 1
b 2
c 3
d b
e '(a b)
f (- a f)
g (+ b c)
);end_setq
(princ)
);end_defun
錯誤訊息是; error: bad argument type: numberp: nil
這時候沒有圓,沒有線,啥都沒有!
我常用的方法 是利用(princ)這個function
例如用(princ "AAA")會在命令回應視窗中印出AAA的字樣
所以我可以把上面的程式改成
(defun c:test2 (/ a b c d e f g)
(setq a 1
b 2
c 3
d b )(princ "AAA") (setq
e '(a b)
f (- a f)
g (+ b c)
);end_setq
(princ)
);end_defun
第一個右括號 ")"是讓前面的(setq 完結 後面的(setq則是跟原本的);end_setq一對
在不破壞程式結構的情況下,我增加一個列印"AAA"的動作
然後載入程式,並執行,而結果是
AAA; error: bad argument type: numberp: nil
注意前面的AAA,這表示(princ "AAA")被執行了!
也就是說 大概是後面的程式出錯
你們可以選擇兩個作法 一個是移動 )(princ "AAA") (setq 以確定哪裡出錯
另一個作法是......我就貼一堆 )(princ "AAA") (setq
例如
(defun c:test2 (/ a b c d e f g)
(setq a 1
b 2
c 3
d b )(princ "AAA") (setq
e '(a b) )(princ "AAA") (setq
f (- a f) )(princ "AAA") (setq
g (+ b c)
)
(princ)
);end defun
這個執行結果是
AAAAAA; error: bad argument type: numberp: nil
很顯然他印出兩次AAA,那就是" f (- a f) "出錯了!
果然(- a f)中間的f沒有定義到
以上 LISP除錯技巧 這次沒有WORD檔可以下載
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.230.59
※ 編輯: chintei 來自: 140.112.230.59 (04/26 11:03)
推
04/26 21:12, , 1F
04/26 21:12, 1F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):