2012-04-07 2 views
2

Я хочу написать эту программу, чтобы найти ключевое слово в списке. Если найдено, распечатайте список. Но ошибки возникают, я не могу ее решить. Пожалуйста, дайте мне несколько предложений. Я новичок в lisp.Простая программа 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

Это * kana * нет * кандзи *. :) – Kaz

+0

Спасибо Каз, ты прав. :) – louxiu

ответ

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

Вы заметили, как пробелы во второй строке больше, чем те, на первой линии? Это потому, что они не ASCII-пространства, поэтому emacs не распознает их как пробелы. Скорее emacs считает, что они являются переменными именами, поэтому он жалуется на то, что нет переменной под названием «» (таким образом, пространство в ошибке переменной void).

+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) 

Ваш код ужасно отформатирована. Попробуйте этот стиль, который используется около 99,5 млн из 100 млн или около Лисп программистов в мире:

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

Никто не пишет комментарии по поводу отдельных закрывающих скобок; это смешно! Ты превращаешь Лиспа в Аду.

Ваш текстовый редактор (будучи Emacs, в конце концов) может показать вам балансировочные пары круглых скобок и управлять отступом для вас.

В конце концов, отступы - это ваш основной визуальный ключ о том, что происходит с чем.

Переплет (result 0) в вашем коде бесполезна и не имеет никакого отношения к переменной result во внешнем dolist.

+0

Полезные предложения, спасибо – louxiu

Смежные вопросы