2

我想编写这个程序来在列表中查找关键字。如果找到,则打印列表。但是出现错误,我无法解决。请给我一些建议。我是lisp的新手。

主程序是两个dolist(C中的两个)和一个list列表中的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")

你注意到第二行的空格比第一行的长吗?那是因为它们不是 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)可以向您显示平衡的括号对并为您管理缩进。

最后,缩进是你关于什么与什么搭配的主要视觉线索。

您代码中的绑定是无用的,与external 中的变量(result 0)无关。resultdolist

于 2012-04-07T05:10:13.397 回答