Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-12-11

Practical Common Lisp (4)

| 21:54 | Practical Common Lisp (4) - わだばLisperになる を含むブックマーク はてなブックマーク - Practical Common Lisp (4) - わだばLisperになる

引き続きPractical Common Lisp 第三章3. Practical: A Simple Databaseを読んでみています。

Improving the User Interaction

とりあえず出てきたコードを写経して感想をメモ
(defun prompt-read (prompt)
  (format *query-io* "~A:" prompt)
  (force-output *query-io*)
  (read-line *query-io*))

できた。

*query-io*は初めて使った。

promptに好きな文字列を指定できるらしい。

多分、これでユーザからの問い合わせるのだろう。

(defun prompt-for-cd ()
  (make-cd
   (prompt-read "Title")
   (prompt-read "Artist")
   (prompt-read "Rating")
   (prompt-read "Ripped [Y/N]")))

できた、make-cdの対話的なバージョンの様子。

でもこれだと、rippedがy/nの入力ってことになるが。後で内部的にt/nilに変更するのだろうか。

(defun prompt-for-cd ()
  (make-cd
   (prompt-read "Title")
   (prompt-read "Artist")
   (or (parse-integer (prompt-read "Rating") :junk-allowed 'T) 0)
   (y-or-n-p "Ripped:")))

できた。y-or-n-pを使うことにしたらしい。これだと、y/nを、t/nilに変換できる。

それと、レイティングの数字は、そのままだと、文字列で取得することになるので、parse-integerでパーズしているのだろう。

それで、:junk-allowedをtにすることにより、不正な入力の場合でもエラーにしないで、nilを返すようにして、orでくるんで、デフォルト値を設定している様子。

しかし、y-or-n-pは、処理系によって微妙に動作が違うみたい。Clozure CL(OpenMCL)だと、前後に改行が入ったりする(printの動作に似た感じ)SBCLならそういうことはない。

(defun add-cds ()
  (loop (add-record (prompt-for-cd))
        (if (not (y-or-n-p "Another?")) (return))))

add-recordを対話的にするためのラッパーの様子。

本文を読む
  • *QUERY-IO*を使った問い合わせ方法の説明。
    • FORCE-OUTPUTの実行が必要な処理系もある。
  • READ-LINE関数の説明。
    • 取得する文字列に改行文字は含まれない。
  • PARSE-INTEGEの説明。
    • 不正な値の入力はデフォルトだとエラーになるが、:JUNK-ALLOWEDでTを指定すると、その場合でもNILを返すという挙動になる。
  • ORによるデフォルト値の設定
    • Perl等の、||や、&&演算子と同じ感覚で、and、orが使える。
  • Y-OR-N-Pの説明。
    • ユーザのy/nの入力をt/nilで返す。
  • LOOPの説明。
    • 簡単な無限ループとしての使い方の説明。脱出には、RETURNを使う。

次回、Saving and Loading the Databaseより再開。