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…
ネットインストーラ用 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 同梱の関数とかのリファ…
coding: UTF-8 も使えるように UTF-8 は BOM なしの方で 保存するときに指定した文字コードで ;;; -*- encoding: XXX -*- を取ってくる ;;; encoding じゃなくて coding でもおk(emacs がそうなってるみたい?) (defun file-param-encoding (&optional bu…
object の type を表記する symbol(atomic type specifier)か symbol で始まる list(compound type specifier)。`typep` とかに指定するやつ。その symbol(list の場合は car にある symbol)が xyzzy ではどう扱われてるのかって話。typep とかは symbo…
誰も困らなさそうな非互換を見つけたのでとりあえずメモだけ残しとく。Common Lisp では condition 投げられたとき*1に、どの関数で投げたかで処理系の反応(デバッガ起動するか否か)が変わる。 ;;; Clozure CL にて ? (setq c (make-condition 'simple-con…
PCL 読んでて、なんかできそうな気がしたのでやってみた。restart-case のちゃんとした仕様を把握してないけど、それっぽいことができたのでメモ。 ;; error 投げると restarter を呼び出す ;; restarter は #:restart-case の block からreturn-from するの…
「このモードでは `*pre/post-command-hook*` で何かしたい」という時。とりあえずそれを実現する方法。 A: `*pre/post-command-hook*` を buffer-local に そのモードのフック(かなにか)で `*pre/post-command-hook*` を buffer-local にしておいて `add-…
元々やりたいことは buffer にある expression を read して eval、的なこと。で condition を signal ったら CALL STACK を表示したい。stack-trace という関数があって、呼び出すと CALL STACK を出力してくれる。のだけど、signal ったのを handler-case …
defstruct の NAME-AND-OPTIONS で :type を指定するとなんかできるっぽいので。 :type を指定する インスタンスが structure のインスタンスではなくて、指定された type になる。type は sequence の subtype であればいいみたい。 ;;; 実体が list な str…
作業ログっていうかメモっていうか 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…
lisp/evalmacs.l::defun を変更 関数定義の lambda expression を(とりあえず symbol-plist に)保存 # defun の定義が2つあるので注意 どっかで function-lambda-expression を定義 どっかで expand-inline を定義 lisp package から inline を export し…
関数定義は si:closure-body で取り出せて、inline でやろうとしてることはこんな感じ。 仮引数と実引数から、てきとーに束縛する let form を作って その中に関数の body を突っ込む (defun foo (&rest args) (apply #'+ args)) => foo (si:closure-body 'f…
(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 にあるんだ。全力で無視してたじゃないか。
どうも compiler::optimize-form の関数が返す form は special-form になってはいけないようだ。compile.l の関数が何やってるのかどうにもよくわからん。 macro はとにかく展開するんで、form は最終的に 関数呼び出し special-form のどっちかになるはず…
(let ((arg1 value1) (arg2 value2) ...) <body>) 機械的に展開できるのはここまでで、これ以上は手動で定義してやらにゃならんような。理想としては ;;; 関数定義 (defun ev-oddp (obj) (oddp (example-value obj))) ;;; 関数呼び出し (ev-oddp X) ;;; たぶん最も</body>…
lisp/compile.l を眺めてたら (get 'compiler::optimize-form) に関数を突っ込んでおくと compile 時に inline 展開してくれるっぽいことを発見。compiler::optimize-form に突っ込む関数は 対象の を呼び出す form を受け取る その呼び出す form があったと…
結論: それなりに速くなる、と思ってよさそう。 「それなりに」というのは、今回やったのは処理自体がそんなに時間かかるものではないので関数呼び出しのオーバーヘッドが相対的に大きかったはず。つまり実際の処理がもっと時間かかるものだと関数呼び出しの…
with-slots の完全な仕様を把握してないのでこれでいいのかわからんけど叩き台。 (require "symbol-macrolet") (defmacro with-slots ((&rest slot-entries) object &body body) `(let ((#1=#:object ,object)) (symbol-macrolet ,(mapcar (lambda (slot-ent…
を作ったんだけど*1、labels に対応できない。applyhook に仕掛けた関数には、呼び出す関数とその呼び出しの引数が与えられるのだけど、呼び出す関数っつーか symbol が渡される。んで、その symbol が labels や flet で定義された lexical な関数だった場…
CLtL2 20.1. Run-Time Evaluation of Forms 変数 *evalhook* 関数を突っ込んでおくと、なんらかの式を評価するときに実際に評価する代わりに *evalhook* に設定された関数が呼び出される。引数として以下の2つが与えられる。 本来評価する式 environment obj…
ちゃんと profile とかしてないんだが、どうも generic-function の呼び出しがネックな気がする。 (make-instance 'foo :key <value>) が ;;; 0 (defmethod make-instance ((class symbol) &rest initargs) (apply #'make-instance (find-class class) initargs)) ;</value>…
なんか xyzzy のソースいぢって structure を ~S で format したときも print-function 呼ぶようにしてしまった。closette を byte-compile すると落ちるのを調べるのに デバッグ用のxyzzyにアタッチして、ステップ実行 してみたんだけど、VS の使い方がよく…
半端に 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 …
xyzzy だと ~A のときだけ print-function 使って出力する。~S のときは #S notation になる。今までそーゆーもんだと思ってたけど、sbcl は print-function 指定しておけばどっちでも print-function 使って出力してくれる。closette でけっこー入り組んだ …
;;; :constructor オプションに slot 名を指定しておくと * (defstruct (s1 (:constructor s1 (value))) value) => #<structure-definition: s1> ;;; こう呼び出せる * (s1 "value") => #S(s1 value "value") ただし標準の constructor("make-")とは違う名前じゃないとダメらしい。</structure-definition:>
CLOS に興味がわいた、というか欲しくなった closette というのは CLOS の subset らしい 見てみたら2000行ちょいくらいだった ふるい common-lisp らしいので読めそうな雰囲気だった 「誰か移植しないかな」とかどっかで見かけた とゆーわけでやってみる。…
lisp/handler.l を読んでたら :no-error なんてものを使えることを知って使ってみたら compile するとおかしくなってしまった。 ;;; 再現用関数 * (defun test (x) (handler-case x (:no-error (x) x))) => test ;;; ここまではダイジョブ * (test 3) => 3 *…
major-mode というのは current buffer に対していろいろする関数。以下の「major-mode を適用するときに...」という部分はこの関数でやる。 (defun example-mode () (interactive) ...) お約束: 既存の buffer-local 変数、モード名、buffer-mode 変数 関数…