xyzzy

xyzzy からDOS窓(cmd.exe)を開く

コレの DOS窓版を作った。 カレントバッファがファイルのときは、そのファイルがあるフォルダで実行 そうじゃないときは、 xyzzy.exe があるフォルダで実行 M-x c で実行 (defun c () (interactive) (let* ((fn (get-buffer-file-name)) (ed::*launch-app-di…

xyzzy からエクスプローラを開く

ココを見つけた。 カレントバッファがファイルを持ってないときは xyzzy.exe があるフォルダを開くのはいいアイデアだと思った。 ちょっとだけ変更させてもらった。 カレントバッファがファイルのときは、エクスプローラで開いたとき、そのファイルを選択 M-…

ローカル関数 flet と labels

いわゆる、(defun ... の中だけで生きる関数なんだが、 flet と labels のどちらでも定義できる。が、微妙に振る舞いが違う。 flet let みたいに並列に定義する labels let* みたいに直列に定義する xyzzy で試してみた。 ;; flet の場合 (defun test (a) (f…

桁数を求める

再帰で書いてみた。 (defun digit (num) (if (< num 10) 1 (1+ (digit (/ num 10))))) ;; test (digit 1000) 4 はげしくガイシュツな気が・・・

文字列から数値へ型変換

いつも忘れるのでメモっておく。 parse-integerリファレンスによると、xyzzy は一部 common lisp と動作が違うみたい。 下記は xyzzy でのテスト。 ;; まずは基本 (parse-integer "00003") ; 多値で返す 3 ; 整数値 5 ; 読み込んだ最後の文字のインデクス(1…

Emacs の moccur-grep っぽい grep コマンド

grep-dialog は正直使いづらいので、ミニバッファで入力する grep コマンドを作ってみた。emacs では grep を使わずにほぼ moccur-grep だけで過ごしていたので、体がそれになじんでしまった。 なので、操作は moccur-grepっぽくなっている。ただ、下記はち…

パス文字列のドライブレターを大文字にする

ちょっと気になったので、書いてみた。 (defun upcase-drive-letter (s) (if (char= #\: (char s 1)) (string-upcase s :start 0 :end 1) s)) ;; test (let (( s "d:/util/xyzzy")) (upcase-drive-letter s)) "D:/util/xyzzy"

文字列リストの重複をなくす

たとえば、パス文字列を保存したリストの重複をなくしたい時はどうするか。 (let ((l '("d:/work" "C:/foo/bar" "D:/work" "d:/work/lisp" "D:/work/lisp"))) (remove-duplicates l :test #'string-equal :from-end t)) ("d:/work" "C:/foo/bar" "d:/work/li…

プロパティをテストしてみる

(defun foo (x) "increment" (1+ x)) (get 'foo 'lisp::function-documentation) "increment" (defvar hoge nil "hogehoge") (get 'hoge 'lisp::variable-documentation) "hogehoge" おもしろい! ところで、variable-documentation とかのプロパティ名(イ…

ミニバッファで入力するときのヒストリーの使い方 (2)

interactive 以外でやってみる。 下記は read-string の例 (setq inserttest-history nil) (setf (get 'inserttest 'ed::minibuffer-history-variable) 'inserttest-history) (defun inserttest () (insert (read-string "string: " :history 'inserttest)))…

ミニバッファで入力するときのヒストリーの使い方

read-string とかのヘルプを見ても、:history には minibuffer-history-variableプロパティを持つシンボルを指定します としか書かれてなくて、どうしたらいいもんか分からなかった。ココが参考になった。 下記のテストは転記だが、 (setq inserttest-histor…

format 関数の書式?

http://oreshiki.net/programming/lisp/memo/format.html違うものを探してて偶然見つけた。 正直いまさらと思っていたんだけど、「繰り返し」のところを見て絶句。xyzzy でやってみた。 (format t "~{~D\n~}" '(11 22 33 44)) 11 22 33 44 nil 最強だと思っ…

hatena-insert はてな記法を入力補助

今に始まったことじゃないが、どうも物忘れがひどい。 はてな記法もそのうちのひとつ。すさまじい勢いで忘れている。というか憶える気がないのか。頭が悪いのはツールで補う。いつものことだ。 決まったキーを押すたびに候補を順繰りに挿入してくれるやつを…

windows に Clozure CL をインストールしてみる

lisp の勉強をしてると xyzzy に限界を感じてきた。といっても xyzzy が悪いわけじゃなく、処理系が1つだけなのが問題。 例題のコードを書いて動かなかったときとか、common lisp に準拠してない部分か、ただ単にタイプミスなのかが分からなくなってきて混…

trace の表示が狂う。

こないだ入れた trace だけど、 書いた再帰がバグってたりすると、無限ループになってスタックオーバーフローが出ることがある。 するとそれ以降は、結果表示のインデントが大幅に狂ってしまうようだ。いかにもパッチ当てだけど、使えるようにしてみた。 ;; …

lisp の and と or

そういえば、lisp の and と or は、 C言語とかの論理演算子(&& ||)と違って、多項で使える(3個以上の引数を取れる)。 はまりそうだから覚え書きしておく。and の例 ; 左から評価していき、 (and 1 2 nil 4 5) nil ; ひとつでも 偽 を見つけると、そこで評価…

末尾再帰

末尾再帰をやってみる。 (defun my-fact (n) ; 普通の再帰 (if (= n 0) 1 (* n (my-fact (1- n))))) ↓ (defun my-fact (n) ; 末尾再帰 (my-fact-loop n 1 1)) (defun my-fact-loop (n i p) (if (> i n) p (my-fact-loop n (1+ i) (* i p)))) ;; test (trace …

lambda って

勉強になったのでメモしておく。 http://dev.ariel-networks.com/wp/archives/198とくに、この部分 (lambda (x) x) ;; この"lambda" は lambdaマクロを持つフォーム ↓ #'(lambda (x) x) ;; この"lambda" は ラムダ式 ↓ (function (lambda (x) x)) ;; この"la…

xyzzy で trace を使ってみる

ウェブで lisp の入門とか講義テキストとかを見ていると、 trace という関数で呼び出しの引数と戻り値の履歴を確認できるようだ。 これは再帰を勉強しているときはめちゃめちゃ役に立つに違いない。 でも xyzzy には trace 関数がないみたいだ。じゃあ作ろう…

netinstaller のキーバインドを変えてみる

コマンドとキーマップがわかったので適当に変更してみる。 ;; 配布元サイトをブラウザで開く ;; o --> e に変更 (define-key ni::*site-map* #\e 'ni::site-open-in-browser) (undefine-key ni::*site-map* #\o) ;; アンインストール ;; d --> u に変更 (def…

netinstaller の操作

netinstaller のキーバインドを毎回忘れるので、デフォルトの状態の (describe-bindings) の結果を貼っておく。 (というか、xyzzy インストールフォルダの site-lisp/ni/readme.txt の50行目あたりをみればいいんだが。) ついでにそれぞれのキーマップ名も書…

xyzzy の C-k (kill-line)

職場の xyzzy は入れてからずいぶん経つので、自分にはかなり枯れてきている。 対して家のは全然そこまで行ってなくて、同じ感覚で使っていると「ムムム」と思うことがよくある。 まぁ、家の xyzzy は lisp 練習器 なので lisp-mode が適当に動いてくれれば…

lisp 再帰ドリル

dolist もいいけど、もうちょっと lispっぽく行きたい。 そういうことなら、まずは再帰だ。そもそも体が再帰を考えることに慣れてないと自覚したので、ココを見て練習してみる。1. まずは恒例の n! を求めるやつ。n! = 1 * 2 * 3 * ... n 。 (defun my-fact …

xyzzycli.exe に 関連づけたファイルをダブルクリックすると・・・

だいぶ前に .l を xyzzycli.exe に関連づけてたんだが、それをダブルクリックすると、 が出る。 load-path に問題ありそうってことで、 (push "D:/work/lisp" *load-path*) を .xyzzy の先頭に追加したら出なくなった。 いろんな lisp package を、net-insta…

lisp-mode で インデントをスペースにする

今ごろ気づいたんだが。 xyzzy はデフォルトの状態では、lisp-mode のインデントがタブ文字になっているようだ。 (setq *lisp-indent-tabs-mode* nil) ;; use spaces for indentation としとけば、タブじゃなくてスペースでインデントしてくれる。 lisp-inte…

dolistって

たとえば、あるリストの要素をループで回して処理したいことがよくある。それこそ頻繁に。今まで、そんなときは while 一本やりで通してきた*1。たとえばこんな感じ。 (let ((lst '(11 22 33 44 55))) (while lst (dbg-msgbox (car lst)) (setq lst (cdr lst…

concat-path

xyzzy には、パス文字列を連結する merge-pathnames という関数がある。 ;; test (merge-pathnames "bar.l" "c:/foo") "c:/foo/bar.l" 第1引数がスラで始まっているかどうかや第2引数がスラで終わっているかどうかを心配しなくても、きれいに連結してくれる…

pme (print macro expansion) が便利

Emacs系で lisp を書き出して10年くらい経ってしまった。 でもいまだに マクロがよくわかってなくて、適当にクォートやらバッククォートつけながら試行錯誤している始末。このままじゃ恥ずかしいので少しは勉強しようと、このサイトを拝見していたら、いいも…

lisp デバッグ用 msgbox

xyzzy のコマンドを作ったりしてるときはよく、 (msgbox "~S" hoge) とかしてデバッグプリントしてたりする。実に原始的だ。 (べつにダイアログボックスに出さんでも、一時バッファに流したりすればいいんだが、それはそれでめんどくさい) しかしこの msgbox…

よく開くファイルを登録しとく

いっつも開くファイルなんてたかだか 5〜6 個だけど、探すのがめんどくさい。 とくに今はカスタマイズ中なので、.xyzzy は頻繁に開くし、自前のライブラリとかもしょっちゅう開く。 じゃあ、登録しとけばってことで、こんなのを作ってみた。 ;;; ;;; @@@ fin…