Lisp batton - Common LISP

1,973 views
1,870 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,973
On SlideShare
0
From Embeds
0
Number of Embeds
164
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lisp batton - Common LISP

  1. 1. Common Lisp  コードバトン
  2. 2. #1 g000001 R6RS SchemeからCLに翻訳してみた CLには、標準ではmatchがない それ程複雑なパターンマッチでもない様子 辞書エントリーのアクセサを定義すればOKかもし れない
  3. 3. アクセサが欲しかったので、defstruct(:type list)で構造体を定義  entry-というアクセサ make-で定義した構造のリストも作れる (defstruct (entry (:type list))   word meaning ok-count ng-count) (defun nomalize-dict (dict)   (mapcar (lambda (e)             (make-entry :word (entry-word e)                         :meaning (entry-meaning e)                         :ok-count (or (entry-ok-count e) 0)                         :ng-count (or (entry-ng-count e) 0)))           dict))
  4. 4. . sortには:keyを指定できるので単純に書ける (defun sort-word-spec* (word-spec*)   (sort word-spec*         #'>         :key (lambda (e)                (- (entry-ng-count e) (entry-ok-count e)))))
  5. 5. 再帰をやめてループ (defun main (file)   (let ((dict (sort-word-spec* (read-dict file))))     (dolist (e dict)       (pr "~&~A: " (entry-word e))       (ready?)       (pr "~&~A y/n? " (entry-meaning e))     :again       (case (query)         ((#Y #y) (incf (entry-ok-count e)))         ((#N #n) (incf (entry-ng-count e)))         ((#Q #q) (return))         (otherwise            (pr "~&Please type Y for yes or N for no or Q for quit.~%")            (go :again))))     (write-dict file dict)))
  6. 6. #2 aka 英単語を登録できる関数追加 (hige:pin) 辞書のCSV一覧表示関数追加 (hige:pun) 名前空間周りの整理 case-sensitive package名での管理 read-char,clear-inputのシーケンスread-lineに変更 documentationストリングをまめに書く 処理に無駄がないように、read time evaluation活用 制御に関わる部分は命令的に。関数の性質がある部分は関数 的に。
  7. 7. aka 正答率でソートする部分は、学習効率を高めるためのストラテジ の部分なので、関数として外に出して交換しやすく(sort-dict- standard) とにかくCLらしく、ということで、(lambda を#'(lambdaにかえたり
  8. 8. #3 quek "~" という処理系拡張を解釈しない処理系のために (merge-pathnames ".hige/words.txt"                             (user-homedir-pathname) (probe-file dict-file) で辞書ファイルの存在をチェック 辞書ファイルがない場合は  (ensure-directories-exist dict-file) でディレクトリだけは作成しておく
  9. 9. #4 snmsts ABCLとswingでぬるめのUI(ABCL限定)
  10. 10. #5 (び) SBCL+Mac OS X縛りで出題単語を読 み上げ (sayコマンドを利用)
  11. 11. #6 naoya_t  辞書から単語をassocしてくる search-dict を実装 単語を入力し、search-dict で検索し、見つかれば意味を、見つ からなければ "Not found." と返す(hige:pan)を実装 aifマクロを追加 (loop :for ... :in ... :do ...) を dolist で置き換えてみた
  12. 12. #7 masatoi iKnow!風にn択問題(hige:pen)を実装.英単語から意味を問うの と意味から英単語を問うのと選べる 繰り返しはnamed-let ;; named-let macro (from "Let Over Lambda") (defmacro nlet (tag var-vals &body body)   `(labels ((,tag ,(mapcar #'car var-vals) ,@body))      (declare (optimize (speed 3))) ; for tail recursion optimization      (,tag ,@(mapcar #'cadr var-vals))))
  13. 13. #8 cranebird with-系のマクロを追加 CLと言えばマルチパラダイムなので CLOSで (defclass dict ()   ((entries     :accessor entries-of     :initform nil     :initarg :entries     :documentation "Entries"))   (:documentation "Container class"))
  14. 14. cranebird print-objectを定義 CL-USER> (hige::make-dict '((hige "ひげ" 0 0))) #<dict: entries: 1 total/ok/ng: 0/0/0>
  15. 15. #9 smeghead  問題の単語表示時にもスコアを表示するように  単語の一覧表示(hige:pun)で指定したスコア以下の単語のみ を表示する機能を追加。 問題の単語表示時にもスコアを表示するように [5]> (hige:pun :score-threshold 5) starbug1,スターバグ1号,3,0 river,川,5,0 NIL [6]>
  16. 16. #10 NANRI untabify format指示子を大文字に揃える "~a~%" => "~A~%" インデントを調整 辞書が存在しない時の動作を修正 パッケージ名がprintされないようにしてみやすく asdfのパッケージ化 (asdf-install:install "http://gist.github. com/gists/280060/download") でインストールできるようになった
  17. 17. #11 snmsts 2回目 (び)さんの変更がSBCL+OS Xなので read-time conditionalizationをらしく修正 #+(and SBCL DARWIN) (sb-ext:run-program "/usr/bin/say" `(,(symbol-name word)) :wait t)
  18. 18. #12 making 辞書ファイルをhttp経由で取得できるようにした。 要drakma(ウェブクライアント)。 (hige:pin "http://gist.github.com/273424.txt") でウェブから辞書を取得できる
  19. 19. #13 深町英太郎 単語登録時に意味を空にした際にGoogle翻訳の結果を登録で きるように。要cl-ppcre。 (defun prompt-for-translate (word)  ...))) (defun google-translate (word)   ...))))
  20. 20. #14 kurohuku Gray Stream(オブジェクト指向なストリーム)を利用して暗記 ゲームの回答時にログをファイル出力 CL-USER> (hige:Pon) ;; setup dict...done lisp (score: 0): 舌足らず [Ynq]: Y ;Yと解答した時点でログが出力されて欲しい
  21. 21. #15 kosh  空のエントリを登録しないようにした(add empty-entry-p) (defun empty-entry-p (entry)   ...))   (defun add-entry (entry &key (if-exists :overwrite))   ...))) ログファイルもディレクトリがない場合は作成するように (ensure-directories-exist ,filename) (newLisp版も作成)
  22. 22. そして伝説へ…  
  23. 23. まとめ  
  24. 24. 参加した人は 結構楽しんでいた様子  
  25. 25. 勉強になるよ  
  26. 26. またやろうよ  
  27. 27.   参加してね

×