2012-04-07 10 views
2

このプログラムを書いて、リストにキーワードを見つけたいと思っています。見つかった場合は、リストを印刷します。しかし、エラーが発生し、私はそれを解決することはできません。私にいくつかの提案をお願いします。私はlispの初心者です。シンプルなlispプログラム

メインプログラムは、2つのdolist(Cにするための2つ)は、リストのリスト(二次元アレイ)でキーワードを見つけます。以下は

(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

+0

ありがとうKaz、あなたは正しいです。 :) – louxiu

答えて

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

は、2行目のスペースが最初の行にものよりも長く、どのように気づく者ですか? ASCIIスペースではないので、emacsはそれらをスペースとして認識しません。むしろemacsは変数名であると考えるので、 ""と呼ばれる変数がない(つまり、void-variableエラーのスペース)という不満があります。

+0

それは原因です。ありがとう:-) – louxiu

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) 

あなたのコードはひどくフォーマットされます。およそ9950万世界の億かそこら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)バインディングは役に立たず、外側のresult変数とは関係ありません。dolist

+0

便利な提案、ありがとう – louxiu

関連する問題