2012-04-07 1 views
2

Je veux écrire ce programme pour trouver un mot-clé dans une liste. Si trouvé, imprimez la liste. Mais les erreurs se produisent, je ne peux pas le résoudre. S'il vous plaît donnez-moi quelques suggestions. Je suis un débutant pour Lisp.Un simple programme Lisp

Le programme principal est deux dolist (deux pour C) et trouve le mot-clé dans une liste de liste (tableau à deux dimensions).

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

est inférieure à la mise au point d'info

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

Ce sont * kana * et non * kanji *. :) – Kaz

+0

Merci Kaz, vous avez raison. :) – louxiu

Répondre

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

Avez-vous remarqué comment les espaces dans la deuxième ligne sont plus longues que celles sur la première ligne? C'est parce qu'ils ne sont pas des espaces ASCII, donc emacs ne les reconnaît pas comme des espaces. Plutôt, emacs pense qu'il s'agit de noms de variables, donc il se plaint à vous qu'il n'y a pas de variable appelée "" (donc l'espace dans l'erreur void-variable).

+0

C'est le coupable. Merci :-) – louxiu

7

Vous semblez être à la recherche de ce one-liner:

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

Votre code est terriblement formaté. Essayez ce style, qui est utilisé par environ 99,5 millions de 100 millions ou programmeurs Lisp du monde:

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

Personne écrit des commentaires sur parenthèses de fermeture individuels; C'est ridicule! Vous transformez Lisp en Ada. Votre éditeur de texte (étant Emacs, après tout) peut vous montrer les paires d'équilibrage de parenthèses et gérer l'indentation pour vous. En fin de compte, l'indentation est votre principal indice visuel de ce qui va avec quoi.

La liaison (result 0) dans votre code est inutile et n'a rien à voir avec la variable result dans le dolist externe.

+0

Suggestions utiles, Merci – louxiu