一个简单的lisp程序

lou*_*xiu 2 lisp emacs 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 "?")
Run Code Online (Sandbox Code Playgroud)

以下是调试信息

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()
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 9

(list "?" "?" "a")
(list "?"?"?"?"i")
Run Code Online (Sandbox Code Playgroud)

你注意到第二行中的空格比第一行的空格长吗?那是因为它们不是ASCII空格,所以emacs不会将它们识别为空格.相反,emacs认为它们是变量名称,所以它向你抱怨没有名为""的变量(因此void-variable错误中的空格).


Kaz*_*Kaz 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)
Run Code Online (Sandbox Code Playgroud)

您的代码格式非常糟糕.试试这种风格,世界上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))))))
Run Code Online (Sandbox Code Playgroud)

没有人写关于个别结束括号的评论; 太荒谬了!你把Lisp变成了Ada.

您的文本编辑器(毕竟是Emacs)可以显示平衡的括号对并为您管理缩进.

最后,缩进是关于什么与什么有关的主要视觉线索.

(result 0)代码中的绑定是无用的,与result外部的变量无关dolist.