lispの問題と繰り返しの構築

user33plus1

まず、私はこの問題を抱えています。私が生成したコードは、各単語を反復処理するのではなく、渡された引数全体を反復処理します。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)))
tfb

したがって、ここで何が起こっているのかを理解する方法は、コードに注釈を付けて、コードが何をしているのかを示すことです。これはデバッグの古風な方法のように思えるかもしれませんが、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)

これははるかに優れています。あなたは調べてpushpushnew彼らが何をしているのか見ることができます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OrbeonXFormsの繰り返しの問題

分類Dev

SSRS繰り返し背景画像の問題

分類Dev

それを繰り返した後のvbaのSubの問題

分類Dev

PHP配列の問題、array_merge()foreachの繰り返しの問題

分類Dev

数字の繰り返しやintの再構築はありません

分類Dev

AQGridViewセルデータの繰り返しの問題

分類Dev

コンテキストの構築と破棄を繰り返すと、エラー#1260が発生します

分類Dev

docoptに繰り返し要素を実装する際の問題

分類Dev

CollectionView更新ImageButtonスクロール繰り返しUIの問題

分類Dev

Ubuntu12.04-繰り返し起動の問題

分類Dev

不正確なAlarmManager.set繰り返しの問題

分類Dev

AngularJS- $リソース+繰り返しの問題

分類Dev

順列機能の繰り返しに関する問題

分類Dev

Mysqlビューの問題(繰り返し)

分類Dev

PandasDataFrameを繰り返し構築するための最良の方法

分類Dev

Rの繰り返し値に応じたデータの再構築

分類Dev

繰り返し値のないk-aryツリーを構築します

分類Dev

nth-child(n) の問題、繰り返しが最初のバルクと同じように動作しない

分類Dev

Dockerfileを使用したreactアプリとwebpackの構築に問題があります

分類Dev

jsonデータの問題を繰り返し、同じデータを何度も繰り返す

分類Dev

VagrantBoxでLaravelを使用して繰り返し発生する権限の問題

分類Dev

いくつかの繰り返し要素を含むCSVファイルからの多次元Python辞書からの値の構築と抽出

分類Dev

私の解決策で問題「繰り返し文字列一致」

分類Dev

UITableViewCellsの繰り返しコンテンツに関する問題

分類Dev

setTimeout()の繰り返しアクションに関する問題

分類Dev

構築時のサーバーとDBの通信の問題

分類Dev

配列と繰り返し出力に関する問題

分類Dev

setinterval問題繰り返し関数

分類Dev

関数を繰り返す際のsetTimeoutの問題

Related 関連記事

  1. 1

    OrbeonXFormsの繰り返しの問題

  2. 2

    SSRS繰り返し背景画像の問題

  3. 3

    それを繰り返した後のvbaのSubの問題

  4. 4

    PHP配列の問題、array_merge()foreachの繰り返しの問題

  5. 5

    数字の繰り返しやintの再構築はありません

  6. 6

    AQGridViewセルデータの繰り返しの問題

  7. 7

    コンテキストの構築と破棄を繰り返すと、エラー#1260が発生します

  8. 8

    docoptに繰り返し要素を実装する際の問題

  9. 9

    CollectionView更新ImageButtonスクロール繰り返しUIの問題

  10. 10

    Ubuntu12.04-繰り返し起動の問題

  11. 11

    不正確なAlarmManager.set繰り返しの問題

  12. 12

    AngularJS- $リソース+繰り返しの問題

  13. 13

    順列機能の繰り返しに関する問題

  14. 14

    Mysqlビューの問題(繰り返し)

  15. 15

    PandasDataFrameを繰り返し構築するための最良の方法

  16. 16

    Rの繰り返し値に応じたデータの再構築

  17. 17

    繰り返し値のないk-aryツリーを構築します

  18. 18

    nth-child(n) の問題、繰り返しが最初のバルクと同じように動作しない

  19. 19

    Dockerfileを使用したreactアプリとwebpackの構築に問題があります

  20. 20

    jsonデータの問題を繰り返し、同じデータを何度も繰り返す

  21. 21

    VagrantBoxでLaravelを使用して繰り返し発生する権限の問題

  22. 22

    いくつかの繰り返し要素を含むCSVファイルからの多次元Python辞書からの値の構築と抽出

  23. 23

    私の解決策で問題「繰り返し文字列一致」

  24. 24

    UITableViewCellsの繰り返しコンテンツに関する問題

  25. 25

    setTimeout()の繰り返しアクションに関する問題

  26. 26

    構築時のサーバーとDBの通信の問題

  27. 27

    配列と繰り返し出力に関する問題

  28. 28

    setinterval問題繰り返し関数

  29. 29

    関数を繰り返す際のsetTimeoutの問題

ホットタグ

アーカイブ