2009-08-01から1ヶ月間の記事一覧

真偽値列

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:>…

LET OVER LAMBDA

http://book.akahoshitakuya.com/があるので書評タグは意味がなくなってきた気がするが、今後無断*1で引用するので載せておく。LET OVER LAMBDA Edition 1.0作者: ダグホイト,Doug Hoyte,タイムインターメディアHOPプロジェクト出版社/メーカー: エスアイビ…