lisp

htmlを書く。

htmlはS式と同じ構造をしており、構造上の相互変換は容易に行え、さまざまなスクリプトが公開されている。 しかし、htmlのS式での表現方法はいくつかバリエーションが考えられるので、それらのスクリプトから希望する表現を探すより、自分で書いた方が早い。…

オブジェクトっぽく書きたい!

javascriptでは変数に対するメソッドを 変数.メソッド で指定できる。メソッドを定義するのは面倒だが、今回はメソッドにこだわる必要はなく、関数でよい。このような書式の方がデータが見やすくなるので、lispでも使えたら便利だろうと思う。 ; オブジェク…

真偽値列

HSPにはカーソルなどの入力を受け付けるための命令があって、HSPを使い始めたら、まずこれに親しむことだろう*1。 ; loopとかは割愛 stick a if a&1 :gosub *left_routine if a&2 :gosub *up_routine if a&4 :gosub *right_routine if a&8 :gosub *down_rout…

マクロの動作(2)

(defmacro m7 (n) (+ n 1)) (m7 -15) | -14 (macroexpand'(m7 -15)) | -14 ;展開時に縮約されている。 (defmacro ms1 (macro) `(macroexpand'(,macro -15))) (macroexpand'(ms1 m7)) | (macroexpand '(m7 -15)) ;たるいので適当なマクロを導入 (defmacro m8 …

マクロの動作(1)

(defmacro m1 () (1+ 1)) (m1) | 2 (macroexpand'(m1)) | 2 ;展開時に評価される。 (defmacro m2 () '(1+ 1)) (m2) | 2 (macroexpand'(m2)) | (1+ 1) ;これが実行時に評価される。 ;参考 'hoge = (quote hoge) | hoge (defmacro m3 () ''(1+ 1)) (m3) | (1+ …

マクロに現れるprogn

気になるけど、気にするだけ無駄なんだよね。ということの確認。 (defmacro nprogn (num &rest body) (nprogn-f (1- num) `(progn ,@body))) (defun nprogn-f (num body) (if (plusp num) (list 'let nil (nprogn-f (1- num) body)) body)) (macroexpand '(n…

deform

let* let labels macrolet は使用頻度が高く、組み合わせて使うことも多い。すると、必然的に入れ子になり、自然にインデントを行うとインデント量が大きくなる。これは見づらいということで、入れ子を解消する書き方を考えてみた。 これらの関数(マクロ、…

closed-let

letで束縛された変数は外からは見えないが、関数を介してアクセスすることが出来る。定義されたときの変数を参照するのがレキシカルクロージャの特徴である。 (defun f1 () (let ((foo 100)) (values (lambda (n) (+ foo n)) (* foo foo)))) (f1) | #<lexical-closure: (anonymous)> 10000 </lexical-closure:>…

リージョンコマンド

リージョンに関するコマンドは色々ある。それらはばらばら、ってわけでもないが、色々なキーにちりばめてバインドされている。バインドされてないものもある。ここでもキーが足りない! と思うわけで、リージョン操作を一手に引き受けるコマンドを作ろう。 …

もっと便利なマーカが欲しい。

標準のマーカは各バッファに1つずつついてるのだが、現在の位置に他の位置からコピペしたいときは結構面倒くさい。コピーにマーカを使ってしまうため、セレクションを使うか、自力で戻らなくてはならない。グローバルマーカやレジスタもあるが、妙に使い勝手…

子を生むクロージャ

LOLでlabelsを使ったクロージャが紹介されている(On Lispから借りている)。ごく簡単に端折って書くと (defun f1 () (labels ((foo () 'bar)) #'foo)) (f1) | #<lexical-closure: (anonymous)> このようにlabelsで定義した関数を取り出すことができる。これはlabels内で定義された他の関数も</lexical-closure:>…

普通のタイマー

xyzzyにはタイマー機能がある。javascriptのsetInterval()と同じようなもので、次のように書ける。 ;一回のみ (start-timer 1 'ding t) ;繰り返し (progn (start-timer 0.5 'ding) (start-timer 0.6 'ding) (start-timer 0.7 'ding) (start-timer 0.8 'ding)…

執拗な再帰マクロ展開

処理系に依るかも知れないが、macroexpandは全てのマクロを展開してくれない。 (defmacro macro (&body body) `(progn (foo) ,@body (bar))) (defmacro macro2 (&body body) `(prog1 ,@body (buzz))) (defmacro macro3 () ''fizz) (macroexpand '(macro (mac…

関数の挙動を調べたい

xyzzyにはデバッグのためにstack-traceとstepが用意されている。ところが、これらの関数・マクロの使い方がよくわからない。 (stack-trace) >CALL STACK 9: (stack-trace) >CALL STACK 8: (eval (stack-trace)) >CALL STACK 7: (system:*byte-code ...) >CAL…

nthcdrとsubseq

nthcdrはn番目のcdrであり、subseqはfromからtoまでのシーケンスを取る。このsubseqをfromだけ指定してリストに適用すると、nthcdrと同じような結果が得られる。 (setq x (list 1 2 3 4 5 6 7 8 9 10)) (nthcdr 3 x) | (4 5 6 7 8 9 10) (subseq x 3) | (4 5…

ファイル毎にバッファの色を変更する

前からそのようなスクリプトを使っていたのだが、set-buffer-colorsはベクタで指定するため、変更したいところの前に変更したくない箇所があっても、配列を埋める必要があって面倒だった。 そこで、色を個別に指定できる形式で書いてみた。xyzzyはなぜかバッ…

edictの挙動にうんざりした

ので、ちょっと改変。妙な挙動でバッファを出すのを止めて、ポップアップで表示するように。 ;;;edict.l(Tetsuya Kamei)より。 ;;; (in-package "editor") ;;; で実行すること。 ;;; 同名の関数を上書きします。 (defun edict-lookup-dictionary (from to di…

ffパズル

転倒数を数えるようにしたので、結構大きめのサイズでも大丈夫。netinstallerの方だけupdateしてある。ffパズルとかも作れるけど、解くのは正直面倒くさい。 ■問題例 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │ 52 │ 1c │ 56 │ 8d │ 61 │ 75 │ fc…

15パズル

折角問題が生成できるようになったので遊べるようにしてみた。↓かnetinstallerからDLできる。 ■15パズルのパッケージ 特に目新しいものでもないけど、emacsカーソル移動の練習には向いてるかも。ちなみに、私は矢印キーを使う。 それと手抜き感いっぱいの作…

3.4 8パズルの解の存在

昨日の続き。また、同内容の問が3.4にあったりする。 15パズル - Wikipediaの「不可能な配置」の項目にあるように、「14 と 15 を入れ替えた状態」は解が存在しないパターンである。このように、任意の隣り合うピースを奇数回入れ替えると解なしとなり、一方…

3.10 8パズルと2つの後者関数

今回は完全な探索関数の作成ではなく、2種類の後者関数を実装して比較する課題である。作るのは 状態をコピーし、それを修正することで一度にすべての後者を生成するもの 呼び出されるたびに状態を直接修正することで逐次後者を生成するもの の2種類だ。8パ…

2.7 掃除機問題(1)

サンプルコード見たらdefstructureとか使ってて泣いた。まあ、common lispなら標準だし、CLISPでも使えばいいんだけど。。サンプルコードはさっくり無視して、道をつくる - xyzzysims制作中 - 人工知能一般で作ったコードを流用することにしよう。それまでに…

リストの破壊的操作をする

10分でコーディング x 2 〜リストの破壊的操作篇〜 - 'T - cadr group これだ。お題を出されたので解いてみよう。似たような問題をOn Lispで見た気がするなあ。相変わらず記事別に見てる人には意味ないけど、解答は続き。

データが扱える人を探せ! 再考

データっていうか高階関数なら使えます - 日々ごちゃごちゃと考えるを読んで、map-canの使い方を知ったので試してみる。モジュールをみて勉強できるけど、こうやって書き比べをするのも参考になって有り難い。

データが扱える人を探せ!

JAVA5.0でGO!! | プログラミングに自信があるやつこい!! というわけで、気楽に作ってみた。topcoderからの出題なのね。

10分でカード配りな!

10分でコーディング | プログラミングに自信があるやつこい!! via トランプを配る - 日々ごちゃごちゃと考える ということで、気軽に作ってみた。

乱数降下法(3) 境界面を求める。

今回で乱数降下法(1) 関数推定 - 象徴ヶ淵のrdmは一通り終わりである。ちなみにrdmがキーワードになってるけど、random descent methodの頭字語なので別物である。 今度は、測定点が空間内で、ある関係式で二分できるときに、その係数を決定させたい。実際、…

乱数降下法(2) 関数を解く

今回も乱数降下法(1) 関数推定 - 象徴ヶ淵で作ったrdmの話である。係数決定に使えるのだから、当然普通に方程式を解くことも出来る。 (defun f1 (x) (lambda () (+ 11 (* -3 x) (* x x)))) f1のように、変数を持たない関数を返すようにすれば、その式の結果…

乱数降下法(1) 関数推定

いくつかの変数の組があって、それらの間の関係式の形がわかっているとき、式の係数を探したいときがある。たとえば、次のようなデータがあるとする。 #x y z f(x,y)=z 10 3 -19 16 9 -19 9 2 -19 15 16 -19 12 12 -19 17 16 -19 5 13 -17 4 19 -15 15 3 -19…

簡単な分数と小数の対応表

不明な式を解析するのに便利そうなので作ってみた。1〜100までのx,yを使ってx/yを作り、整数値となるものを外してソートするだけである。下のコードは手抜きのため、非常に遅いので実行する際は注意。 ;分数早見表を作る。 (let (l) (dotimes (a 100) (dotim…