2010-01-01から1年間の記事一覧

しょーもない再起動の使い方: typo

"apply" をよく "appyl" と typo して undefined-function とか怒られるので、もうちょっと気を利かせてくれないかな、とこんなことをした。 (defun appyl (fn &rest args) (restart-case (error 'undefined-function :name 'appyl) (apply () :report "「ご…

速度

3つとか5つとかそれくらいのデータをまとめて扱いたい時は割とすぐ defstruct してて、他にも list とか vector とか hash-table とか色々やり方はあるんで、それぞれ速度的にどーなのよ?と。xyzzy だとそこまで速度を気にすることはあんまりない(compile …

let* とスペシャル変数のバグ

http://fixdap.com/p/xyzzy/34388/ (defvar *special* :global) => *special* (let* ((*special* :local) (x *special*)) ; ここで *special* がシャドウされてない x) => :global 関係ありそうなのが src/eval.cc#1024 Flet_star xyzzy.src/eval.cc at mast…

Re: Re: case 構文のキーを括弧でくくると何が変わるのか

Re: case 構文のキーを括弧でくくると何が変わるのか - the Unspeakable One http://d.hatena.ne.jp/kitokitoki/20101001/p1 参考: CLHS: Macro CASE, CCASE, ECASE otherwise-clause なしの case をざっくり実装してみると、こんな感じ。 (defmacro %with-c…

setf expansion

setf 式を展開するのに使う5つの値。get-setf-expansion(xyzzy だと get-setf-method-multiple-value)で取得できるあれ。何度読んでも覚えられないので中途半端だけどメモ。 CLHS: Section 5.1.1.2 Setf Expansion (setf (ACCESSOR . ARGS) NEW-VALUE) tem…

setf の最適化に bug

以下の条件を満たすと place の subforms が評価される順番が変わってしまう。 PLACE に2つ以上の引数(subforms) その中にシンボルがある シンボルより後にシンボルではない式がある 3つ目の「シンボルではない式」が2つ目の「シンボル」の値に影響するよ…

再起動を使ってコンパイルしてなかったらコンパイルできる load-library とか

condition-restart 実装しといてどう使うのかよくわかってなかったりするので試しに使ってみた。とりあえず書いてみたレベルだけど gist に貼っといた。ライブラリ(*load-path* にあるやつ)をロードする時に コンパイル済みのが無かったら バイトコンパイ…

condition-restart をリリースしました

netinstaller 用 packages.l からどうぞ。インストールして *scratch* から↓やってみたらなんとなくわかると思いたい。 (require "condition-restart") (require "condition-restart-support") (restart:setup-key-bindings) (let ((age -3)) (assert (and (…

Condition System #2 error とかの引数

${XYZZY}/lisp/handler.l 参照。error, warn, signal 全部共通。 A. error CONDITION コンディション・オブジェクト(make-condition で作る奴)を渡すと、そのまま投げる。 B. error CONDITION-TYPE &rest ARGS CONDITION-TYPE のコンディション・オブジェ…

Condition System #1 handler-case と handler-bind の違い

${XYZZY}/lisp/handler.l 参照。 handler-bind (handler-bind ((CONDITION-TYPE 'HANDLER-FN)) FORM*) FORM* を実行中に CONDITION-TYPE 型のコンディションが投げられると、HANDLER-FN に引数として投げられたコンディションを与えて呼び出す。 handler-bin…

バイトコンパイルしてないファイルの一覧を得る

http://d.hatena.ne.jp/kitokitoki/20100520/p1 をパクった。 elisp には load-history なんてものがあるようだけど xyzzy にはないので *load-path* にあるものから。 (mapcan (lambda (dir) (mapcan (lambda (source) (unless (file-exist-p (concat sourc…

拡張にリファレンスを添付する方法

まずへなちょこリファレンス形式の xml でリファレンスを書く。addref 使うと title, type, arguments, package あたりは上手いこと生成してくれるんでラクチン。他の項目もタグだけ生成しといてもらえば中身埋めるだけなんでラクチン。というわけでまず add…

symbol-macrolet にリファレンスつけました

ネットインストーラ用 http://bowbow99.sakura.ne.jp/xyzzy/packages.l リファレンスって info-modoki-mode で見れるあれ。詳しくは http://xyzzy.s53.xrea.com/wiki/index.php?%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9 あたり。 xyzzy 同梱の関数とかのリファ…

-*- encoding: UTF-8 -*- とか

coding: UTF-8 も使えるように UTF-8 は BOM なしの方で 保存するときに指定した文字コードで ;;; -*- encoding: XXX -*- を取ってくる ;;; encoding じゃなくて coding でもおk(emacs がそうなってるみたい?) (defun file-param-encoding (&optional bu…

typespec メモ

object の type を表記する symbol(atomic type specifier)か symbol で始まる list(compound type specifier)。`typep` とかに指定するやつ。その symbol(list の場合は car にある symbol)が xyzzy ではどう扱われてるのかって話。typep とかは symbo…

addref > info-modoki-mode

xyzzy-lisp 書いてるときは引数とか忘れたら F1 で info-modoki-mode 見てて、それだと reference に入ってないものが見れないんで自分で追加する方法。 必要なもの 全部 netinstaller からインストールできる。 info-modoki-mode: 見るために addref: 追加…

Condition を投げる人

誰も困らなさそうな非互換を見つけたのでとりあえずメモだけ残しとく。Common Lisp では condition 投げられたとき*1に、どの関数で投げたかで処理系の反応(デバッガ起動するか否か)が変わる。 ;;; Clozure CL にて ? (setq c (make-condition 'simple-con…

restart-case

PCL 読んでて、なんかできそうな気がしたのでやってみた。restart-case のちゃんとした仕様を把握してないけど、それっぽいことができたのでメモ。 ;; error 投げると restarter を呼び出す ;; restarter は #:restart-case の block からreturn-from するの…

(make-local-variable '*pre/post-command-hook*)

「このモードでは `*pre/post-command-hook*` で何かしたい」という時。とりあえずそれを実現する方法。 A: `*pre/post-command-hook*` を buffer-local に そのモードのフック(かなにか)で `*pre/post-command-hook*` を buffer-local にしておいて `add-…

CALL STACK を使いたい、のだけど

元々やりたいことは buffer にある expression を read して eval、的なこと。で condition を signal ったら CALL STACK を表示したい。stack-trace という関数があって、呼び出すと CALL STACK を出力してくれる。のだけど、signal ったのを handler-case …

list とか vector を使う structure

defstruct の NAME-AND-OPTIONS で :type を指定するとなんかできるっぽいので。 :type を指定する インスタンスが structure のインスタンスではなくて、指定された type になる。type は sequence の subtype であればいいみたい。 ;;; 実体が list な str…

FORM が XXX するか調べる方法

作業ログっていうかメモっていうか Return Values (expect (+ 2 1) (returns 3)) equal? It is OK to ignore too many values (let ((#1=#:results (multiple-value-list (+ 2 1)))) (equal (list 3) #1#)) => t Condition (expect (+ #\f #\o #\o) (signals…

apply の引数

apply: FUNCTION ARG &rest MORE-ARGS apply は何気に引数を複数に分けて受けられる。でも funcall とは違って、最初見たときは意味がわからん動作をする。 というのは、ARG と MORE-ARGS のうち一番最後の引数は list に突っ込んでおかねばならず、それ以外…

anything について勘違いしてた

というか何に使うのかよくわかってなかった。何かの理由で anything.el について調べてて EmacsWiki: Anything を読んだ。でやっとわかった。anything 自体は何かするものじゃなくって、何をするかを指定するものなんだ。それも今までとは違うやり方で。anyt…

入力乗っ取り+疑似バックグラウンド実行

よい子は真似しちゃダメ ;;; キーボードの入力を乗っ取る ;;; とりあえず乗っ取ってみたかっただけなので、入力されたキーを ;;; そのまま buffer に insert ;;; C-g か RET で終了 (defun read-input () (popup-string "*** キーボード入力 横取り中 ***" (…

define-key で多ストロークを設定

keymap というのは car が editor:keymap とゆー symbol で、cdr が (key . command) の alist らしい。 (setq *keymap* (make-sparse-keymap)) => (keymap) (define-key *keymap* #\C-b 'command) => t *keymap* => (keymap (#\C-b . command)) んで、多ス…

Alcor の Abbreviation Scoring

steps to phantasien: Alcor の Abbreviation Scoring を xyzzy lisp に直訳してみた。ac-mode とかの絞り込みに使えないかと思ったんだけど、そのままだと使いにくそう。将来やっぱ使おうと思ったときのためにメモ。ぐちゃぐちゃ書いてるけど、リンク先の記…

ゲームプログラマになる前に覚えておきたい技術 GameLib/Framework を使う準備

2章から使う GUI 用のライブラリを使う設定。何度もやることになるので。本で言うと P.64-67 あたり。 新しいプロジェクトを作る C-S-n テンプレートから "Win32 プロジェクト" を選んで プロジェクト名を決めて ソリューションはてきとーに設定*1して [OK] …

ゲームプログラマになる前に覚えておきたい技術 Ch.2 - スクロール

大きなステージを読み込んだときにはプレイヤーを中心にした一画面分だけを描画するか、 やってみた。妄想した動作は、ステージが画面に 収まる => 画面の真ん中にステージを表示して動かない 収まらない => 基本的にプレイヤーを中心に表示する ただし、ス…

++ を後置より前置で使う理由

こないだ @rayfillさんに教えてもらったので。 そもそも前置と後置はどう違う 前置はインクリメントした後の状態を返す、後置はインクリメントする前の状態を返す。 int a = 3, b = 3; cout << ++a // 4 << b++ // 3 << endl; 後置は変更前の値を保持する必…