[PR]テレビ番組表
今夜の番組チェック


なんか作ってみたファイルとか


xyzzy Lisp

100マス計算(100masu.l)

xyzzy 上で動く100マス計算です。昔作ったもので、コードはたぶん美しくありません。

普通に ~/.xyzzy か ~/site-lisp/siteinit.l に (autoload '100masu-mode "100masu" t) とか書いてください。M-x 100masu-mode で使えます。

プロンプトが出るので基数、サイズ、演算を順に入れてください。例えば 16, 7, - とすると16進数で7×7マスの引き算ができます。デフォルト値は *100masu-default-params* で変更できます。

キーバインディングは、移動と文字削除に関しては *global-keymap* を見てそれらしいキーに対応付けてます。その他のバインディングは次の通り。

    TAB         次のセルに進む。forward-char のキー(デフォルトC-f)にも割り当ててます
    LFD, RET    解答を終了し採点結果を表示する
    C-q         モードを終了
    SPC         トライアル中なら次のセルへ、そうでなければ新しいトライアル開始

その他の変数についてはソースコードの最初50行ぐらいを見てください。なお、キーバインディングの変更をしたい場合は直接書き換えるか初期化ファイルで require しておかないとうまくいかないような気がします。autoload のままでできるようにすることはたぶん可能だけど、面倒な気がしたのでやってません。

ファイル名を設定すれば結果の保存ができることになっていますが、バッファの内容をそのままファイルに書き出すだけです。

機械学習

xyzzy にじゃんけんをやらせて、出す手を学習させてみました。ソースコードはこれ。特にダウンロードするようなものでもないので .txt です。scratch にでも貼り付けて最後の let 式を評価してみてください。最初の二つのリストはそれぞれプレイヤー1,2(という言葉が適切なのか?)がグー、チョキを出す確率(%)、最後のは1が勝った回数と2が勝った回数です。片方に不利なバイアスかけても、かなりいい勝負してくれることが多いです。場合によっては出す手がものすごく偏ったりするけど、もう一方はそれを理解しないみたいです。

単純なアルゴリズムだし、専門の人から見たら子供の遊びにしか見えないか。ちなみに機械学習はとある事情により二ヶ月ほど勉強しなければならなかった思い出があります。が、それだけですので詳しくはありません。

あ、関数名がいい加減なのは仕様です。

便利かもしれないスクロール

Wiki の tips/スクロールに前置引数 に書いてみました。

scroll-up などに前置引数を付けてスクロールする行数を指定できるようにしました。C-u C-v とかよく使ってます。

リンクチェック

tips/ローカルHTMLファイルのリンク切れチェックに書きました。

partial-completion 風シンボル名補完

tips/partial-completion 風シンボル名補完

C-S-n とかでセレクション

C-n とかで移動したときに Shift を押していたらセレクションにする設定。コマンド名はいいかげん。

(require "wip/winapi")
(c:define-dll-entry c:short GetKeyState (c:int) "user32")

(setf (get 'define-S-sensitive-cmd 'lisp-indent-hook) 1)
(defmacro define-S-sensitive-cmd (name cmd S-cmd)
  `(defun ,name (&optional (arg 1))
     (interactive "p")
     (if (minusp (GetKeyState #x10)) (setq arg (- arg)))
     ;; 06/03/01 (Wed) 修正
;;;       (dotimes (_ (- arg)) (,S-cmd)))))
;;;     (if (plusp arg) (dotimes (_ arg) (,cmd))
     (let ((com (if (plusp arg) ',cmd ',S-cmd)))
       (dotimes (_ (abs arg) t)
         (unless (funcall com)
           (return nil))))))

(global-set-key #\C-f
  (define-S-sensitive-cmd forward-char-maybe-selection
    forward-char selection-forward-char))
(global-set-key #\C-b
  (define-S-sensitive-cmd backward-char-maybe-selection
    backward-char selection-backward-char))
(global-set-key #\C-n
  (define-S-sensitive-cmd next-virtual-line-maybe-selection
    next-virtual-line selection-next-virtual-line))
(global-set-key #\C-p
  (define-S-sensitive-cmd previous-virtual-line-maybe-selection
    previous-virtual-line selection-previous-virtual-line))
(global-set-key #\C-e
  (define-S-sensitive-cmd end-of-line-maybe-selection
    end-of-line selection-end-of-line))
(global-set-key #\C-a
  (define-S-sensitive-cmd beginning-of-line-maybe-selection
    beginning-of-line selection-beginning-of-line))
(global-set-key #\C-v
  (define-S-sensitive-cmd next-page-maybe-selection
    next-page selection-next-page))
(global-set-key #\C-z
  (define-S-sensitive-cmd previous-page-maybe-selection
    previous-page selection-previous-page))
encapsulate で引数のラムダリストが変更されないようにする (encap+.l)

encap.l を使うと任意の関数定義を上書きしたり元に戻したりできます。ちょっと関数の挙動を変えたいときに便利なのですが、 encapsulate で定義を変更したときに引数のラムダリストまで (&rest argument-list) に変わってしまって ldoc で引数リストが確認できなくなるので、それをなんとかしようと思って頑張ってみました。

オリジナルの encapsulate は関数でしたが、引数の渡し方を defun に近い形にした方がなんとなくいいような気がしたのでマクロにしました。その結果オリジナルとは互換性がなくなりましたが。

;;; 使用例
(require "encap+")

;; indent-region でインデントコマンドがなくても末尾の空白だけ削除
(encapsulate indent-region delete-trailing-spaces
  (interactive "*r")
  (let ((mode-specific-indent-command
         (or mode-specific-indent-command
             (lambda ()))))
    (declare (special mode-specific-indent-command))
    (apply basic-definition argument-list)))

ついでに emacs の {before|after}-advice みたいなマクロ encap-{before|after} も定義してみました。それぞれ本体の後と前に (apply basic-definition argument-list) をくっつけます。ただし例外として encap-after でも interactive は先頭に置かれます (そうしないと意味がないし) 。

;; eval-expression したあとちょっと待つ (paren.l との関係で)
(encap-after eval-expression sit-for-10-sec
  (interactive "xEval: ")
  (if (interactive-p) (sit-for 10)))

;; yank したときに emacs みたいにマークをセットする
(encap-after ed::yank-insert set-mark
  (if *yank-sets-mark* (push-mark ed::*last-yank-point*)))
キーワードファイル編集用モード (kwd-mode.l)

キーワードファイルを編集するためのモードです。

説明は近いうちに書きたいと思います。関数定義に documentation が多少入ってるのでそれを読めば使えるかもしれませんが。

もうちょっといい感じになったら xyzzywiki で公開してみる予定です。


BMS (DP差分)

実は一部とある所で晒していたやつだったり。全部14鍵です。

TITLE / ARTIST コメント 最終更新日
雲の缶詰 / ridis 3,5 前半の分割が不自然な気がしてならないが、よくわからないのでそのまま公開。 05/06/01
時計仕掛けの少女 / ridis(Rai) 6 半分は練習用に作った譜面。ところどころ叩きにくい? 05/06/01
end of white season / ridis 7 そこそこ練習になった気がする。でも☆7もないかも。 05/06/12
deadly daydream / ridis & 草野ほうき 5 意外に割り当てられる音が少なかったり。 05/06/12
sttra lem nattill / fether 5 混フレ入門、かも。 05/06/16
white wind world / fether 6,8 another の方、本人はクリアしてなかったりして。 05/06/16
WHITE ALBUM -STARiNG FANTASiA- / ねこみみ魔法使い 6 scratch 多め、かつ叩きやすい配置を目指し……た記憶がかすかにあります。 05/08/08
雲の湊 / fether 6,0 another は遊びで作ってみただけです。上手い人なら普通にクリアできるのでしょうけど。 05/08/08

トップへ