xyzzy-lisp

プロジェクトの site-lisp を *load-path* に追加する

xyzzy の拡張書くときは ~/work/<プロジェクト名> にこんな風にファイルが配置される。 ~/work/<プロジェクト名>/ README.md site-lisp/ <プロジェクト名>.l <プロジェクト名>/ packages.l util.l ... 最初は <プロジェクト名>.l に全部書いてるんだけど、何…

特定の場合のみ違うことをするコマンドを作る

たとえば C-k (kill-line) は普通、現在位置から行末を kill して改行が残るんだけど、行頭でやったら改行も含めて kill する(1行まるっと kill)にしたい。という場合。 よくあるやり方は、そういうコマンドを作って置き換えるパターン。xyzzyの音 - 編集 …

defvar で再定義

lisp を書いてると defvar の初期値を変更して読み込んでも値は変わらなくて、「めんどくせーな」とか言いながら repl から setf し直すハメになることがちょくちょくあるので、defvar で再定義したときに最初(前回)の初期値から変更されてなければ値を更…

キーワードテーブルが大文字小文字を区別するかどうか

結論: (hash-table-test ) が equal なら区別する、equalp なら同一視する (defun keyword-table-ignore-case-p (table) (eql (keyword-table-test table) 'equalp)) 説明 キーワードテーブルは load-keyword-file でキーワードファイルを読み込むと作成され…

パッケージ名をキーワードで書く理由

一言で言うと: xyzzy でも CL でも同じように書けるから 文字列で書くと... xyzzy でも CL でも文字列は大文字/小文字の変換などされないので、小文字はそのまま扱われる。defpackage でパッケージ名を文字列で書くと、パッケージ名に小文字を含んだパッケー…

main-loop と {exit,quit}-recursive-edit

昔見つけたのをちょいと調べてみた。 main-loop 呼び出すと、現在実行中の処理をポーズしたまま xyzzy が操作を受け付けるようになる。ミニバッファに突入しない read-string みたいな感じ。 {exit,quit}-recursive-edit main-loop のポーズを解除して元の処…

ロカール関数で (setf READER) を諦めた記録

CL だとこんなことができる。 ;; Clozure CL での例 CL-USER> (let ((table (make-hash-table))) (labels ((key (key) (gethash key table)) ((setf key) (value key) (setf (gethash key table) value))) (setf (key 1) "foo" (key 2) "bar") (maphash (lam…

local-window-flag

http://xyzzy.s53.xrea.com/reference/wiki.cgi?p=set-local-window-flags で設定する行番号とかのやつ。 フラグは on か off か未設定か window と buffer がそれぞれにフラグを覚えてる 優先順位は buffer > window > (グローバルな設定) `get-local-win…

ansify 0.01.01 バグ修正

早速 id:miyamuko さんからバグ報告もらったので修正しました。毎度ありがとうございます。 case, typecase で `ansify::otherwise` ではなく `lisp:otherwise` を使うように修正 xyzzy には otherwise は無いものと思い込んでたけどあった print-unreadable…

case の途中で (otherwise ...)

keys---a designator for a list of objects. In the case of case, the symbols t and otherwise may not be used as the keys designator. To refer to these symbols by themselves as keys, the designators (t) and (otherwise), respectively, must be…

setf-values 0.01.02 更新しました

しょーもないミスでおかしな展開形になってたのを修正した(miyamuko さんからパッチ頂きました。ありがとうございます。)のと、変数以外の atom に setf しようとしたのはマクロ展開時にエラーに。 NetInstaller 用 packages.l 手動ダウンロード用 setf-va…

ansify 0.01.00 をリリースしました

今までバラバラに作ってた ANSI Common Lisp からもらってきたようなものを1つにまとめました。 具体的には NetInstaller 対応してたもの condition-restart symbol-macrolet typespec+ GitHub あたりでこっそり作ってたもの GitHub - bowbow99/xyzzy.typeca…

XTAGS #2 飛ぶ

タグジャンプ(jump-tag)できるようにするための何やら。 ローカル変数 ed:tags-find-target この変数にセットした関数が引数なしで呼び出されるので、カーソル位置の単語を調べて クラス名 名前 関数か否か を多値で返す。 3つ目の値は、nil なら変数、'li…

XTAGS #1 作る

XTAGS を作る(make-tags-file)ための何やら。 変数 ed::*maketag-list* XTAGS を作る時は ed::*maketag-list* に設定された (タグ作る関数 ワイルドカード...) に従ってワイルドカードにマッチするファイルをタグ作る関数で処理していく。ワイルドカードの…

symbol-macrolet 更新しました。

NetInstaller 用 packages.l multiple-value-bind の body の先頭に symbol-macro を置いた場合に展開されなかったのを修正。どうして以前 lambda でほぼ同じバグを潰した時に修正しておかなかったのかと小一時間問い詰めたい。 ついでにリファレンスのファ…

typespec+ を更新しました

NetInsaller 用 カフェイン中毒 変数の名前変えたのに古い名前のまま残ってたのがあったのを修正しました。せっかくなので紹介。xyzzy デフォルトの `typep` に未定義の typespec を与えると、黙って nil を返します。 (typep 3 'hoge) => nil typespec+ を…

condition-restart を更新しました

バグ修正とリファレンス書き直したり、とか。 NetInsaller 用 カフェイン中毒 変更点とか check-type でこないだ作った typespec+ を使うようにしました check-type 使ってたコードがちょびっと速くなったり、deftype した型を使えるようになります。 それで…

関数 abort と関数 muffle-warning

たぶん自分用メモ。CLHS ではこうなってるのだけど If no such restart exists, ..., and the functions abort and muffle-warning signal an error of type control-error.もし該当する再起動が見つからなければ、...、関数 abort および muffle-warning は…

typespec+ をリリースしました

type specifier(型指定子、以下 typespec)をもっと便利に使いたいなと思って。 NetInsaller 用 カフェイン中毒 何が問題なのか? typep が比較的遅いだとか、xyzzy だと deftype した型は si:canonicalize-type しないといけないだとか、そんなこんなで ty…

symbol-macrolet を更新しました

いくつかバグ潰した。 symbol-macrolet 内の macrolet で定義したローカルマクロが展開されない場合があったバグを修正 オペレータに置いた lambda 式内の symbol-macro が展開されてなかったバグを修正 lambda, labels, flet, macrolet の lambda-list (仮…

eval-when

よくわかってなかったので調べた。ファイルのトップレベルに `(eval-when (SITUATION*) ...)` を書いて、色んな読み込み方をした場合に評価されるか否か。「ただの式」ってのは eval-when で包んでない場合。 --- :execute :load-toplevel :compile-toplevel…

しょーもない再起動の使い方: 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…

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…