まず、私はこの問題を抱えています。私が生成したコードは、各単語を反復処理するのではなく、渡された引数全体を反復処理します。doループを使用して情報をハッシュテーブルに渡します。
(defun set_isa (partOfSpeech &rest words)
(do ((wordVar words))
((null wordVar) nil)
(putp partOfSpeech word-dict wordVar)
(setf wordVar (cdr wordVar))))
これで、トレースを使用した結果としてこれを取得しています
(set_isa 'Verb 'Talk 'Run 'jump )
1. Trace: (SET_ISA 'VERB 'TALK 'RUN 'JUMP)
1. Trace: SET_ISA ==> NIL
NIL
そして、ハッシュテーブルを呼び出すと、最後に渡された引数のみが追加されます
#S(HASH-TABLE :TEST FASTHASH-EQL (VERB . (JUMP)))
したがって、ここで何が起こっているのかを理解する方法は、コードに注釈を付けて、コードが何をしているのかを示すことです。これはデバッグの古風な方法のように思えるかもしれませんが、CLのような動的な会話言語では、非常に優れたアプローチです。これは、物事に従来の名前を使用し、従来の独立性を使用して、欠落しているコードのスタブを使用してすべてを実行可能にする関数のバージョンです。
(defvar *word-dict* nil)
(defun set-isa (part-of-speech &rest words)
(do ((wtail words))
((null wtail) nil)
(putp part-of-speech *word-dict* wtail)
(setf wtail (cdr wtail))))
(defun putp (part-of-speech dict thing)
(format *debug-io* "~&putp: ~A ~A ~A~%" part-of-speech dict thing))
したがって、これは実行可能になり、putp
取得したものを引数として出力します。
> (set-isa 'verb 'talk 'run 'jump )
putp: verb nil (talk run jump)
putp: verb nil (run jump)
putp: verb nil (jump)
nil
したがって、ここで実際にバグのあるコードがなくても、ほぼ確実putp
に、問題が何であるかを理解できます。ハッシュテーブルに格納されている値を引数にputp
置き換えます。したがって、テーブルに表示される唯一の値は最後の値です。ですから、それを修正する必要があります。これについては後で行います。
しかし実際には、それだけが問題ではありません。
まず第一に、あなたはdo
非常に奇妙な方法で使用しています。の構文ではdo
、初期化フォームとステッピングフォームが明示的に許可されているため、本体で行うのではなく、実際にステッピングフォームを使用する必要があります。
(defun set-isa (part-of-speech &rest words)
(do ((wtail words (rest wtail)))
((null wtail) nil)
(putp part-of-speech *word-dict* wtail)))
第二に、あなたが呼んでいるputp
にあなたのリストのすべての尾:あなたはおそらく、個々の単語にそれを呼び出すことにしたいです。これは、各テールの車を渡すだけで実行できますが、Martin Buchmannが他の回答で指摘しているように、代わりに、リストの要素を反復処理する言語の構成を探すこともできます。そして、これらはたくさんありdolist
、そのうちの1つです。
(defun set-isa (part-of-speech &rest words)
(dolist (word words)
(putp part-of-speech *word-dict* word)))
そして今
(set-isa 'verb 'talk 'run 'jump )
putp: verb nil talk
putp: verb nil run
putp: verb nil jump
nil
putp
呼び出される方法は以前のバージョンと互換性がないことに注意してください。リストの末尾ではなく、単語で呼び出されるようになりました。
それで最後に、putp
その作品のバージョンを書いてみましょう。私は最初に非常に素朴なバージョンを書きます:
(defvar *word-dict* (make-hash-table))
(defun putp (part-of-speech dict thing)
(let ((entries (gethash part-of-speech dict '())))
(setf (gethash part-of-speech dict) (cons thing entries))))
そして、これは機能しますが、あまり良い方法ではありません。
> (gethash 'verb *word-dict* '())
nil
nil
> (set-isa 'verb 'talk 'run 'jump )
nil
> (gethash 'verb *word-dict* '())
(jump run talk)
t
> (set-isa 'verb 'talk 'run 'jump )
nil
> (gethash 'verb *word-dict* '())
(jump run talk jump run talk)
t
一度だけ実行する限り、それは問題ありません。まあ、私たちはこれよりもうまくいくことができます:
このような:
(defun putp (part-of-speech dict thing)
(pushnew thing (gethash part-of-speech dict)))
だから、今:
> (gethash 'verb *word-dict* '())
nil
nil
> (set-isa 'verb 'talk 'run 'jump )
nil
> (gethash 'verb *word-dict* '())
(jump run talk)
t
> (set-isa 'verb 'talk 'run 'jump )
nil
> (gethash 'verb *word-dict* '())
(jump run talk)
これははるかに優れています。あなたは調べてpush
、pushnew
彼らが何をしているのか見ることができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加