2012-04-07 63 views
2

我想寫這個程序在列表中找到一個關鍵字。如果找到,然後打印列表。但錯誤發生,我無法解決它。請給我一些建議。我是lisp的新手。一個簡單的lisp程序

主程序是兩個dolist(兩個用於C),並在list(二維數組)列表中查找關鍵字。

(defun kanna_find (key) 
    (let (
     (result 0) 
     (kanna-table (list 
       (list "あ" "ア" "a") 
       (list "い" "イ" "i") 
       ) 
     )        ;; End of kanna table 
    )         ;; End of let var define 
    (dolist (result kanna-table) 
     (dolist (item result) 
     (if (string= item key) 
      (print result)) 
     )        ;; End of the second dolist 
    )         ;; End of the first dolist 
    )         ;; End of let 
) 

(kanna_find "あ") 

下面是調試信息

Debugger entered--Lisp error: (void-variable  ) 
    (list "い"   "イ"   "i") 
    (list (list "あ" "ア" "a") (list "い"   "イ"   "i")) 
    (let ((result 0) (kanna-table ...)) (dolist (result kanna-table) (dolist ... ...))) 
    kanna_find("あ") 
    eval((kanna_find "あ")) 
    eval-last-sexp-1(nil) 
    eval-last-sexp(nil) 
    call-interactively(eval-last-sexp nil nil) 
    recursive-edit() 
+2

這些是*假名*不*日本漢字*。 :) – Kaz 2012-04-07 04:56:54

+0

謝謝卡茲,你是對的。 :) – louxiu 2012-04-07 07:24:13

回答

9
(list "あ" "ア" "a") 
(list "い" "イ" "i") 

你是否注意到在第二行的空間怎麼比在第一行的時間要長?這是因爲它們不是ASCII空格,所以emacs不會將它們識別爲空格。相反,emacs認爲它們是變量名稱,所以它向你抱怨說沒有變量叫做「」(因此void變量錯誤中的空間)。

+0

這是罪魁禍首。謝謝:-) – louxiu 2012-04-07 04:27:46

7

你似乎在尋找這個一行代碼:

;; return a sublist tail of list-of-strings whose first element is string 
;; or nil if string is not found 
(member string list-of-strings) 

你的代碼是非常格式化。嘗試這種風格,它使用的約99.5億全球100萬個左右的Lisp程序員:

(defun kanji_find (key) 
    (let ((result 0) 
     (kanji-table (list (list "あ" "ア" "a") 
          (list "い" "イ" "i")))) 
    (dolist (result kanji-table) 
     (dolist (item result) 
     (if (string= item key) 
      (print result)))))) 

沒有人寫的關於個別右括號註釋;那太可笑了!你正在把Lisp變成Ada。

您的文本編輯器(畢竟是Emacs)可以顯示平衡的括號對並管理您的縮進。

最後,縮進是您的主要視覺線索。

在您的代碼中綁定的(result 0)是無用的,並且與外部dolist中的result變量無關。

+0

有用的建議,謝謝 – louxiu 2012-04-07 07:28:53