一个简单的lisp程序

时间:2012-04-07 04:05:23

标签: emacs lisp elisp

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

主程序是两个dolist(两个用于C)并在列表列表中找到关键字(二维数组)。

(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 个答案:

答案 0 :(得分:9)

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

您是否注意到第二行中的空格如何比第一行的空格长?那是因为它们不是ASCII空格,所以emacs不会将它们识别为空格。相反,emacs认为它们是变量名,因此它向你抱怨没有名为“”的变量(因此空间变量错误中的空格)。

答案 1 :(得分: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程序员使用了这种风格:

(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变量无关。