xyzzy

クロージャ

いままで、「ふーん」くらいにしか思ってなかったけど、すごく分かりやすい解説を見つけたのでメモる。 猿でもわかるクロージャ超入門xyzzy でやってみる。 ;; 問題:呼び出すたびに、1,2,3,...を返すような関数 f( )を定義せよ。 (defun outer () (let ((x …

仮置き: cl 用の小物(作りかけ)

適当に作った clozure CL 用の cl-mode と、その native-compile 用のコマンド。 scheme-mode をパクらせていただいた。念のために、作りかけを置いとく。プロセス周りがかなり怪しい。

scratch バッファ専用の auto-save-buffers

scratch バッファでプログラムをテストしてると、まれに xyzzy がフリーズしてしまうことがある。フリーズすると、いままで scratch バッファで書いてたものがパーになるのでつらい。 そこで scratch バッファだけを RAM ディスクに自動保存するようにしてみ…

ビルトイン関数かどうか

以前から探してて、あるにはあった。 ココによると、 si::*builtin-function-p だそうな。ただ、ちょっと使いにくいので、ラップしとく。 (defun builtin-function-p (symbol) "symbol がビルトイン関数かどうかを返す。" (and (fboundp symbol) (si::*built…

テンポラリなバッファを作る

他のアプリからテキストをコピペして置換とかするとき、一時的なバッファがほしくなるときがある。 (if (fboundp 'temp-buffer) (msgbox "`temp-buffer' という関数はすでに存在します。") (defun temp-buffer () (interactive) (set-buffer (create-new-buf…

フラグを反転する

フラグの反転くらい、さらっと書きたい。 (setq *hoge-state* (not *hoge-state*)) ってのを (notf *hoge-state*) ってやりたい。 (defmacro notf (var) `(setq ,var (not ,var))) 名前が今ひとつナニだが。

xyzzy で common lisp hyperspec を引いてみる (2)

ココに書いたやつの続き。hyperspecのコマンドとしては、hyperspec と hyperspec-format がある。 でも ふつうに書いた .xyzzy ("user"パッケージ)からは見えなくて、hyperspec::hyperspec とかしないといけない。hyperspec.l を見る限り、ちゃんと export …

xyzzy で common lisp hyperspec を引いてみる

common lisp のリファレンスとしては common lisp hyperspec が有名。 xyzzy から common lisp hyperspec を引けるようにしてくれた方がおられた。http://lispuser.net/emacs/lisphacking.html#sec-4以下使い方。1 ココから hyperspec.l を落として、load-pa…

shell-mode で C-k したとき、サブプロセス を消す

これも、だいぶ前に書いたもの。 M-x shell でコマンドプロンプトに入って、作業後に C-k して "サブプロセスが走っています。" とか言われてムキッとなった人に。 けっこう重宝するので貼っておく。 (defun kill-process-and-buffer () (interactive) (let*…

xyzzy で重複行を削除する

CSVファイルとか、XMLのタグ抽出したりとかで、何かと必要になることが多いのが重複行の削除。 xyzzy では C-x # uniq して、外部の uniq.exe を使うのがデフォの様子。 だけど、これぐらいの日常タスクなら xyzzy だけでやりたいと思ったから適当に書いとい…

refer-for で定義元のソースにジャンプ

refer-for で、 [File ]: なんちゃら.l の行で enter 押すとそのファイルを開いて、定義の箇所を見れるようにした。今のところ、対応しているのは下記だけ。 関数名 変数名 マクロ名 (defvar *refer-for-jump-dir* `(,(merge-pathnames "lisp" (si:system-ro…

ファイル名をディレクトリから探してフルパスを返す

(defun find-path-from-top-directory (name dirs) "name というファイル名をディレクトリ配下で検索して、フルパスを返す。存在しなければ nil を返す。 同名ファイルが複数個存在したとしても、最初に見つけた1つしか返さない。 検索対象のディレクトリは…

きょうの「なんでやねん」

common lisp の教本ばっかり読んでると、シンボルは内部的には大文字になってるんだよなと漠然と思ってた。 なので common な処理系ならなんでも (eq 'HOGE 'hoge ) は t になるんじゃないかと。xyzzy では下のようになった。 ;;; xyzzy (eq 'hoge 'hoge) ;=…

xyzzy をリビルドした

とりあえず自分が必要なものだけパッチ当てた。 出先で使えるように Dropbox に入れておいたのでメモ。

xyzzy の関数名とかを grep

xyzzy の describe-function は emacs みたいに関数の定義元へのリンクを出してくれないので、毎回 xyzzy のインストール先の lisp ディレクトリ を grep していた。 いい加減めんどくさくなってきたので、専用のコマンドを作った。(かなりテキトーだけど) ;…

encap.l を使ってみる

以前 trace を見つけたときにインストールした、encap.l を使ってみる。 既存の関数を簡単にラップできるみたい。簡単そうなのを試す。describe-function したとき、ポイント付近の単語をデフォルト文字列として与える。 (encapsulate 'describe-function 'w…

xyzzy のメインメニューを消す

メニューはほとんど使わないので消す。 まったく消してしまうと不安なので、右クリックしたときのコンテキストメニューでメインメニューを出せるようにしとく。 ;;; toggle-menu でメインメニュー表示を切り替え (defvar *main-menu* *app-menu*) (defun tog…

scratch バッファ用の変なもの

なんか変なのができた。 ふつう scratch バッファは need-not-save が nil なので、xyzzy を終了するときに保存するかどうか、聞かれない。 これは emacs ゆずりのふつうの動作。 ただ、最近はちょこっと lisp のテストコードを書いては終了したりするので、…

バッファを1行ずつ処理するマクロ

まあ、置換とかは replace-buffer とかで一発なんだが、もちょっと凝ったことをしたいときがある。 今まではバッファを1行づつ処理するときは、 (while (null (eobp)) (let* ((beg (save-excursion (goto-bol) (point))) (end (save-excursion (goto-eol) (p…

文字がアルファベットかどうかを調べる

文字列中の 1文字がアルファベットかどうか知りたいことがたまにある。 たとえば、こう書ける。 (defun char-alphabet-p (ch) (if (char-not-greaterp #\a ch #\z) t nil)) char-not-greaterp は char 関係ないけど、Wikipedia によると A〜Z, a〜z を「アル…

ちょっと変わってる recentf

xyzzy の recentf は これがわりと有名だとおもう。 でもなぜかそれは使ってなくて、むかし適当に自分で書いたのをちょこちょこ直しながら現在に至っている。変り種としては、 最近使ったもの順に自然とソートされる。recentf で開いたファイルは、リストの…

discrete.l 小コマンド群

これも、バックアップとして置いておく。discrete.l - 小さなコマンド群

lib.l 自前のライブラリ

結構増えてきてしまったので、バックアップとして置いておく。lib.l - コマンドにならない小さな関数群*1 *1:先人達から拝借させてもらったものも含む

行末のスペースを目立たせる(途中まで)

emacs には whitespace.elというのがあって、行末に限らず空白文字を目立たせることができる。 xyzzy では表示の設定で全角スペースやタブ文字の表示を設定できるので、行末の空白文字だけを目立たせればいいかな。 途中まで書いてみた。 (defun show-trail-…

error って。(3)

そもそも、なんで例外なんてものがあるかというと、実行時におかしなことが起きても継続してプログラムを実行させたいからだ。 たとえば、ユーザーの入力が原因で「予期せぬエラーが発生しました」とか出て強制終了したりするプログラムは、誰も使いたがらな…

error って結局・・・

さあ、例外のつづきをしよう・・・と思ったがよく分からなくなってきた。エラーを発行する (error) の引数として、文字列の代わりに (make-condition) を使うんだった。 このエラーの型を自前で定義してやれば、細かなエラー処理を書けるという話しだろう。 で…

eval-buffer をちょこっといじる

ほんとに些細なことなんだけど eval-buffer でいちいちバッファの名前を聞かれるのがうざい。 カレントバッファ以外を eval-buffer することはめったにないので、インタラクティブに呼ばれたときはカレントバッファを対象とするようにした。 (defvar eval-bu…

find-file をちょっとだけいじる

find-file でタイプミスして新しいファイルを開いてしまうことがよくある。 そんなときは、ほんとに新しいファイルを開くのかと聞いてほしい。 (defun my-find-file (fn) (interactive "FFind file: ") (cond ((file-exist-p fn) (find-file fn)) ((y-or-n-p…

error って。

error という関数がある。ヘルプで見てみる。 出た。「例外」だ。なんとなくしか分かってない。うそです。まったく分かっていない(w 試してみる。たとえば、 (defvar a 0) (defun test () (interactive) (error "!!!") ; ここで抜けてる (incf a)) ;; test (…

pme の 文字列中の改行文字をなんとかしてみる

pme はすごく便利だけど、少しだけ困ったことがある。 マクロ定義の中の文字列に改行が含まれていた場合は、そこで改行してしまって見づらくなることだ。 たとえば、以前書いたこのマクロは、 (pme (dbg-msgbox 'foo 'bar)) (msgbox (concat "~S " "~S ") 'f…