xyzzy-lisp

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

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…

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…

inline #6 一旦まとめ

lisp/evalmacs.l::defun を変更 関数定義の lambda expression を(とりあえず symbol-plist に)保存 # defun の定義が2つあるので注意 どっかで function-lambda-expression を定義 どっかで expand-inline を定義 lisp package から inline を export し…

inline #5 元の関数定義が必要な件について

関数定義は si:closure-body で取り出せて、inline でやろうとしてることはこんな感じ。 仮引数と実引数から、てきとーに束縛する let form を作って その中に関数の body を突っ込む (defun foo (&rest args) (apply #'+ args)) => foo (si:closure-body 'f…

condition 一覧

(compile (defun find-all-condition-and-slot-accessors () (do-all-symbols (sym) (let ((it (ignore-errors (make-condition sym)))) (when it (let ((def (si:*structure-definition it))) (format t "- ~S~%" (si:*structure-definition-name def)) (do…

誰だ、宝物をゴミ箱に放り込んだのは

http://xyzzy.s53.xrea.com/wiki/index.php?cmd=read&page=trash%2Fdisassemble こんなものがあったのか。なんで trash にあるんだ。全力で無視してたじゃないか。

inline #4 special-form に展開しちゃダメ?

どうも compiler::optimize-form の関数が返す form は special-form になってはいけないようだ。compile.l の関数が何やってるのかどうにもよくわからん。 macro はとにかく展開するんで、form は最終的に 関数呼び出し special-form のどっちかになるはず…

inline #3 どう展開すりゃいいんだ?

(let ((arg1 value1) (arg2 value2) ...) <body>) 機械的に展開できるのはここまでで、これ以上は手動で定義してやらにゃならんような。理想としては ;;; 関数定義 (defun ev-oddp (obj) (oddp (example-value obj))) ;;; 関数呼び出し (ev-oddp X) ;;; たぶん最も</body>…

inline #2 compiler::optimize-form

lisp/compile.l を眺めてたら (get 'compiler::optimize-form) に関数を突っ込んでおくと compile 時に inline 展開してくれるっぽいことを発見。compiler::optimize-form に突っ込む関数は 対象の を呼び出す form を受け取る その呼び出す form があったと…

inline #1 ほんとに速くなる?

結論: それなりに速くなる、と思ってよさそう。 「それなりに」というのは、今回やったのは処理自体がそんなに時間かかるものではないので関数呼び出しのオーバーヘッドが相対的に大きかったはず。つまり実際の処理がもっと時間かかるものだと関数呼び出しの…

with-slots

with-slots の完全な仕様を把握してないのでこれでいいのかわからんけど叩き台。 (require "symbol-macrolet") (defmacro with-slots ((&rest slot-entries) object &body body) `(let ((#1=#:object ,object)) (symbol-macrolet ,(mapcar (lambda (slot-ent…

applyhook を使った profiler

を作ったんだけど*1、labels に対応できない。applyhook に仕掛けた関数には、呼び出す関数とその呼び出しの引数が与えられるのだけど、呼び出す関数っつーか symbol が渡される。んで、その symbol が labels や flet で定義された lexical な関数だった場…

*evalhook* とか applyhook とか

CLtL2 20.1. Run-Time Evaluation of Forms 変数 *evalhook* 関数を突っ込んでおくと、なんらかの式を評価するときに実際に評価する代わりに *evalhook* に設定された関数が呼び出される。引数として以下の2つが与えられる。 本来評価する式 environment obj…

#4 make-instance

ちゃんと profile とかしてないんだが、どうも generic-function の呼び出しがネックな気がする。 (make-instance 'foo :key <value>) が ;;; 0 (defmethod make-instance ((class symbol) &rest initargs) (apply #'make-instance (find-class class) initargs)) ;</value>…

structure の print-function (2)

なんか xyzzy のソースいぢって structure を ~S で format したときも print-function 呼ぶようにしてしまった。closette を byte-compile すると落ちるのを調べるのに デバッグ用のxyzzyにアタッチして、ステップ実行 してみたんだけど、VS の使い方がよく…

#3 たらい回してみた

半端に compile するだけでもだいぶマシだけど、それでも200倍か・・・。 -- (tak 12 6 0) (tak 12 6 1) 遅さ defun 0.203 0.063 --- defmethod 508.641 128.438 2505, 2038 defmethod(compile 後) 46.25 12.204 227, 193 ;;; 生の xyzzy-lisp (defun tak (x …

#2 structure の print-function (1)

xyzzy だと ~A のときだけ print-function 使って出力する。~S のときは #S notation になる。今までそーゆーもんだと思ってたけど、sbcl は print-function 指定しておけばどっちでも print-function 使って出力してくれる。closette でけっこー入り組んだ …

structure の constructor の引数

;;; :constructor オプションに slot 名を指定しておくと * (defstruct (s1 (:constructor s1 (value))) value) => #<structure-definition: s1> ;;; こう呼び出せる * (s1 "value") => #S(s1 value "value") ただし標準の constructor("make-")とは違う名前じゃないとダメらしい。</structure-definition:>

#1 (defun (setf ) ...)

CLOS に興味がわいた、というか欲しくなった closette というのは CLOS の subset らしい 見てみたら2000行ちょいくらいだった ふるい common-lisp らしいので読めそうな雰囲気だった 「誰か移植しないかな」とかどっかで見かけた とゆーわけでやってみる。…

handler-case が bug ってる?

lisp/handler.l を読んでたら :no-error なんてものを使えることを知って使ってみたら compile するとおかしくなってしまった。 ;;; 再現用関数 * (defun test (x) (handler-case x (:no-error (x) x))) => test ;;; ここまではダイジョブ * (test 3) => 3 *…

major-mode のつくり方 -- 調査中 #1

major-mode というのは current buffer に対していろいろする関数。以下の「major-mode を適用するときに...」という部分はこの関数でやる。 (defun example-mode () (interactive) ...) お約束: 既存の buffer-local 変数、モード名、buffer-mode 変数 関数…