2

リスト内のキーワードを検索するこのプログラムを書きたいと思います。見つかった場合は、リストを印刷します。しかし、エラーが発生し、解決できません。いくつかの提案をお願いします。私はLispの初心者です。

主なプログラムは2つのdolist(Cでは2つのfor)とリストのリスト(2次元配列)の中のfindキーワードです。

(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()
4

2 に答える 2

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

2 行目のスペースが 1 行目のスペースよりも長いことに気付きましたか? これは、ASCII スペースではないため、emacs はそれらをスペースとして認識しません。むしろ、emacs はそれらを変数名と見なすため、" " という名前の変数がないと不平を言います (したがって、void-variable エラーのスペース)。

于 2012-04-07T04:14:48.200 に答える
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)

あなたのコードはひどくフォーマットされています。世界中の 1 億人ほどの Lisp プログラマのうち、約 9950 万人が使用しているこのスタイルを試してください。

(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 です) は、バランスの取れた括弧のペアを表示し、インデントを管理できます。

結局のところ、インデントは、何が何と組み合わされるかについての主な視覚的手がかりです。

コード内のバインディングは役に立たず、outer 内の変数(result 0)とは何の関係もありません。resultdolist

于 2012-04-07T05:10:13.397 に答える