defadvice
関数の挙動を変更するのにdefadviceが便利
- GNU Emacs Lispリファレンスマニュアル: 16. Emacs Lisp関数のアドバイス
- = (car emacs-advent-calendar-2010) ;=>defadvice - ぺっくブログミラー@peccul
(defun foo (x) (+ x 1)) (defadvice foo (before my-foo (x) activate) ;; foo関数を実行する前に動作させる。 (ad-set-arg 0 5)) ;; 第一引数に5をセットする。 (foo 1) ⇒ 6 ;; 第一引数に常に5がセットされるため6になる。
上のプログラムは何の意味もないプログラムだし、アドバイスした意味もないプログラムだが、動きがわかりやすいと思う。
すごく簡単に関数に変更加えれるね。
consを使ったリスト
consはドット対というリストを作るものである。ドット対とは( 値 . 参照先 )で成り立つリストである。
仮に( a . b )というドット対があった場合、aが値でbが参照先となる。
以下に例を示す。
(cons 'a 'b) ;; ( a . b ) ① (cons 'a '(b c)) ;; (a b c) ② (cons 'a (cons 'b (cons 'c nil)))と同じ (cons '(a b) '(b c)) ;; ((a b) b c) ③ (cons '(a c) 'b) ;; ((a c) . b) ④
①は前に説明したとおりでaが値で、bが参照先となっている。
②はaが値で、'(b c)ではなく'bが参照先となるため、(a b c)というリストになる。
③②と同様に'(a b)が値と見なされ、'(b c)ではなく'bが参照先となるため、((a b) b c)となる。
④②と同様に(ry
説明出来てるような出来てないような感じだけど、結局リストは見かけ上'(a b c)で配列っぽく見えるかもしれないが、きちんと( 値 . 参照先 )でつながってるって事を言いたかった。
まとめると、
(equal '(a b) '(a . (b . nil))) t
であり、(a b) 、( a . ( b . nil))は同じであることがわかる。
ドット対とリスト
ドット対とリストがどのような物か
consセル、ドット対、リスト - バリケンのRuby日記 - Rubyist
Lisp 一夜漬け -- 2.リスト
を読んだ。
なんとなくわかった気がする。
/* ドット対 */ struct LIST { int data; struct LIST* next; };
が↑で、リストはこれによりつながったリストという意味だと思う
大量のファイルをリネームする
cygwinで大量のファイルをリネームしたいなーと思い、
UNIXコマンドを調べていると、大量にリネームするコマンドは無いらしい。
(Linuxなら、renameコマンドがある。)
しかし、下記のようにすれば可能
$ for i in * > do > name=`echo $i | cut -c5-10` # ファイル名から任意の文字を切り出す。ここでは、5〜10文字目を切り取っている。 > mv $i hoge$name.txt > done
forとcutとmvの組合せで容易に大量リネームできる。
非常に便利だ。
ほんとはシェルスクリプトを作りたかったが、いいシェルスクリプトが思いつかなかったため、断念した。
一番いいのはrenameコマンドのソースを拾ってくればいいのだがどこにあるのかさっぱりわからなかったw
参考文献
http://www.k4.dion.ne.jp/~mms/unix/linux_com/cut.html
UNIXコマンド
cygwinでWindowsプログラムを実行する方法
cygwinでWindowsプログラムを実行するのにやたらと苦労した。
以下が実行するスクリプト
passwd="hogehoge" lhaplus="/cygdrive/c/Program Files/Lhaplus/Lhaplus.exe" cygstart "$lhaplus" /c:zip /p:$passwd /o:./ ./"hoge.txt" #←$lhaplusを""で囲むのを忘れるとエラーが出る
$lhaplusを参照し、実行するには""で囲む必要がある。
なぜならファイルパスにスペースが含まれているから。
なぜLhaplusなんだ?zipでいいじゃないかと言われそうだが、ファイル名が文字化けしちゃうんですよ。なので、仕方無しにLhaplusで。