【叩かれて】Emacs Lisp道場【強くなれ】

このエントリーをはてなブックマークに追加
501名無しさん@お腹いっぱい。
emacs lisp は info のヘルプが超便利だと思うよ。
502名無しさん@お腹いっぱい。:2005/06/15(水) 01:28:29
そだね
いろんな日本語のinfoを捜して、
それ読むだけでもいいんじゃない
503名無しさん@お腹いっぱい。:2005/06/23(木) 13:33:40
lisp 以下のソースを見たらいいんじゃない?
使用したい function の使用例として。
504名無しさん@お腹いっぱい。:2005/06/25(土) 10:23:50
文字列で与えられたシンボルを束縛したいんだけどどうやればいいでしょうか。

font-lock-mode => t

(let* ((bound-str "font-lock-mode")
(intern-soft bound-str))
font-lock-mode)
=> t

これじゃ駄目だし orz
505名無しさん@お腹いっぱい。:2005/06/25(土) 10:32:34
eval すればいい
(let ((bound-str "font-lock-mode"))
(eval `(let ((,(intern bound-str) nil))
font-lock-mode)))
=> nil
よく使うならマクロに
(defmacro hoge (str value &rest body)
(let ((sym (intern (eval str))))
`(let ((,sym ,value))
,@body)))
(let ((bound-str "font-lock-mode"))
(hoge bound-str nil font-lock-mode))
=> nil
506名無しさん@お腹いっぱい。:2005/06/25(土) 11:09:42
>>505
おおー、できました。
eval すりゃいいのか…ってまだよく理解できてないけど。感謝。
507名無しさん@お腹いっぱい。:2005/06/26(日) 18:11:07
eval 必要ないみたい。
(defmacro let-string (str-value-list &rest body)
`(let ,(mapcar (lambda (sval)
(list (intern (car sval)) (cadr sval)))
str-value-list) ,@body))
(let-string (("font-lock-mode" nil)
("test" 11))
(cons font-lock-mode test))
=> (nil . 11)
508名無しさん@お腹いっぱい。:2005/06/26(日) 18:24:34
eval 無いと
(let ((bound-str "font-lock-mode")) (let-string ((bound-str nil)) ...))
みたいに使えないよね。
文字列リテラル書けるのなら最初からシンボルにすればいいんだから、
よそから持って来た文字列に値を束縛したいって話なんじゃないの?
509名無しさん@お腹いっぱい。:2005/06/26(日) 19:24:09
すみません、書いてから気付きました。
510名無しさん@お腹いっぱい。:2005/08/07(日) 01:07:26
hoge という関数が定義されているか調べるにはどのように書けばよいのでしょ
うか?
511名無しさん@お腹いっぱい。:2005/08/07(日) 01:22:09
(fboundp 'hoge)
512名無しさん@お腹いっぱい。:2005/08/17(水) 15:11:54
Linux板のAtok Wnnスレで放置されたんで作ってみた。
(defun to-hankaku ()
"change current word from zenkaku to hankaku"
(interactive)
(save-excursion
(push-mark)
(backward-word 1)
(japanese-hankaku-region (region-beginning) (region-end))
(pop-mark)))
(global-set-key "\M-n" 'to-hankaku)

どなたか叩いてくだひゃい。
本当に聞きたいのはWnn7eggで半角カタカナ入力できるか否かなんだが
513名無しさん@お腹いっぱい。:2005/08/17(水) 16:07:04
普通、関数内部の処理では mark は使わない。
mark は基本的に、ユーザーが手動で region 指定したり移動したりするためのもの。
移動コマンドなんかで、あとでユーザーが使えるように push-mark しとくとか、そういうときに使う。

普段の処理で使うのは marker のほう。
でもこの場合は、その場で region 指定するだけだから、 marker も使わないで済みそうかな。

(save-excursion
(let ((end (point)))
(backward-word 1)
(japanese-hankaku-region (point) end)))

みたいな。
514名無しさん@お腹いっぱい。:2005/08/17(水) 17:00:47
>>513
ありがとさんです。regionといっても
markしなきゃいけないわけじゃないんですね。
えらくすっきりしました。
またなんかあったらよろしく
515名無しさん@お腹いっぱい。:2005/08/21(日) 20:15:39
質問なんですが、例えば(decode-time)の結果のようなリストを
これまた例えば(sec minute hour day month)のような変数(のリスト)に
一気に代入するようなコマンドってないもんでしょうか。
Perlでいう
($sec, $minute, $day, $mon, $year) = localtime();
みたいなイメージなんですが。

あと、Emacs-Lisp Farm ていうMLがあるようですが
過去ログって見れないんでしょうか?
516名無しさん@お腹いっぱい。:2005/08/21(日) 21:07:43
間違った使い方な気がするけど、multiple-value-setqとか?
ログはMLはいってからコマンドメール投げれば取得できるよ。
517名無しさん@お腹いっぱい。:2005/08/21(日) 21:31:55
>>515
(apply (lambda (sec minute hour day month year dow dst zone)
...)
(decode-time))
とか CL 使うなら
(destructuring-bind
(sec minute hour day month year dow dst zone)
(decode-time)
...)
518名無しさん@お腹いっぱい。:2005/08/21(日) 21:55:07
>>516,517
レスどうもっす。
(setq num '(1 2 3 4))
(multiple-value-setq (a b c d) num)
みたいに簡単にできるのですね。助かります。
「間違った使い方」つうのが気になるけど、、。

(apply (lambda (sec minute hour day month year dow dst zone)
(message "%d年%d月%d日%d時%d分" year month day hour minute sec)
)
(decode-time))
として動くのは確認しました。が、当方未だラムダ式とかよくわかっていないので
じっくり考えてみようと思います。
とりあえずapplyのドキュメントを丸のみすれば
「(decode-time)で返されたリストを引数(リスト)としたlambda式が実行された」
ということですね?
519名無しさん@お腹いっぱい。:2005/08/21(日) 23:12:02
間違った使い方な気が……っていうのは、
elispには多値はないのにmultiple-value-*を使ってるから。
520Zeno ◆5nZQbNmQPs :2005/08/23(火) 11:25:55


            ユニバーサルな解釈など存在しない為
             間違った使い方など存在しない


_________________
If T is consistent then T !|- R_T
If T is consistent then T !|- ¬R_T. -- John B. Rosser
521名無しさん@お腹いっぱい。:2005/08/23(火) 12:55:11
そういう考えだとあらゆる価値が平等に無意味になって
思考停止に陥るお。
522名無しさん@お腹いっぱい。:2005/08/23(火) 13:10:54
思考する前に馬鹿を殺そう
523Zeno ◆5nZQbNmQPs :2005/08/23(火) 21:34:07
Reply-to:>>521
          知っていた (る) 人の文調に似ている・・・
             君は吾がそう思っている人物か?

> そういう考えだとあらゆる価値が平等に無意味になって
> 思考停止に陥るお。

       人間は無限近くのチョイスを全て吟味するパワーはない為、
      結局はプラグマティク、若しくは他人が選んでいるチョイスを
                 選んでしまう。

   ただ 520 は「Lisp のような自由度の高い -- 故に創造性の必要とされる --
     言語でただ一つの解釈を強要するのは間違っているのではないのか」
            ということを伝えたかっただけだ。

> Reply-to:>>522
                  お前誰だよ
_________________
If T is consistent then T !|- R_T
If T is consistent then T !|- ¬R_T. -- John B. Rosser
524名無しさん@お腹いっぱい。:2005/08/23(火) 21:53:28
520と523がみえない
525名無しさん@お腹いっぱい。:2005/08/24(水) 00:18:17
見えないのが気になるならフィルタ使わないほうがいいよ
526521:2005/08/24(水) 04:51:42
よくわからんがニューハーフに知り合いはいないよ。
527名無しさん@お腹いっぱい。:2005/08/24(水) 11:37:34
ゴキブリを見て見ぬふりする愚かさ
528名無しさん@お腹いっぱい。:2005/08/24(水) 13:29:28
今は一匹なんだから叩いてつぶしちゃうよりは、
どっかに行くのを待ってもらった方がいい。
529Zeno ◆5nZQbNmQPs :2005/08/24(水) 13:45:30
Reply-to:>>524 お前もな
Reply-to:>>526
> よくわからんがニューハーフに知り合いはいないよ。
                 人違いのようだ

Reply-to:>>528 お前誰だよ
_________________
If T is consistent then T !|- R_T
If T is consistent then T !|- ¬R_T. -- John B. Rosser
530名無しさん@お腹いっぱい。:2005/08/24(水) 14:20:22
Reply-to:>>529
                う   ざ   い

_________________
If T is consistent then T !|- R_T
If T is consistent then T !|- ¬R_T. -- John B. Rosser
531名無しさん@お腹いっぱい。:2005/08/24(水) 16:44:22
インライン関数を変更した際、
それを呼出している関数(バイトコンパイル済み)に反映させる
手軽な方法はないでしょうか?
いちいち定義してるとこに飛んで評価するのは面倒なもので。
532名無しさん@お腹いっぱい。:2005/08/29(月) 14:30:23
>>531
unload-featureとか使えない?
わたし自身、一度も使った事が無いから
良く分かんないけど。
533名無しさん@お腹いっぱい。:2005/08/31(水) 09:25:32
テキストファイルを Emacs でバッチ処理して結果を stdout に吐きたいんです
が、

--- testout.el ---
(defun testout (file)
(insert-file-contents file)
;; なんか処理する とりあえずここではなにもしない
(princ (buffer-string)))
--- testout.el ends here ---

emacs -Q --batch -l testout.el --execute='(testout "in.txt")' > out.txt

とした時に、in.txt にある日本語が out.txt では化けてしまいます。(各文字
の頭に '\222' が付くみたい、ascii は大丈夫)

ちゃんと動かすにはどうすりゃいいでしょうか。
534名無しさん@お腹いっぱい。:2005/08/31(水) 10:32:55
a) coding systemを設定する。
b) testout.elの中でout.txtに書く。

535名無しさん@お腹いっぱい。:2005/08/31(水) 10:38:22
>>533
set-terminal-coding-system
536名無しさん@お腹いっぱい。:2005/08/31(水) 10:44:24
stdout がファイルの場合は terminal-coding-system は無視されて
emacs-mule になるよ。なので 534 の b のようにするしかない。
537533:2005/08/31(水) 18:13:37
>>534-536
むむ、write-file するしかないのかあ。フィルタの類ではないとはいえちょっ
と意外な気も。まあ、関数内でファイルに書いてもなんとかなるのでそうしま
す。サンクスでした。
538名無しさん@お腹いっぱい。:2005/09/01(木) 17:23:05
encode-coding-string したものを princ するのはだめか?
(未確認)
539名無しさん@お腹いっぱい。:2005/09/01(木) 23:28:29
>>538
おお、なるほど。

(princ (encode-coding-string (buffer-string) 'euc-jp))

でやってみたら大丈夫なようです。エンコードが決め打ちなのが格好悪いです
が、まぁしょうがないかな。ありがとうございました。
540名無しさん@お腹いっぱい。:2005/09/01(木) 23:45:04
terminal-coding-systemにすれば?
541名無しさん@お腹いっぱい。:2005/09/02(金) 00:11:15
>>540
emacs -Q --batch --execute='(print (terminal-coding-system))'

で japanese-iso-8bit が返ってきますね。.emacs 読んでなくても大丈夫なの
か。terminal-coding-system 使うことにします。どうもでした。
542ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/02(金) 00:35:37
>>541
ロケール見てるっぽいね。

$ LC_ALL=C emacs -Q --batch --execute='(print (terminal-coding-system))'

だと nil だったから。nil の時だけ us-ascii にしておけば問題ないと思う。
543名無しさん@お腹いっぱい。:2005/09/02(金) 09:32:49
>>539

入力ファイルと同じ coding-system にしたいのであれば,
insert-file-contents した直後の last-coding-system-used を
使うというのはどうだろう。
544名無しさん@お腹いっぱい。:2005/09/04(日) 13:45:39
Elispを初めて改造してみたのですが
うまく行きませんでした

changeが設定されていれば、nonにchangeを入れたいのですが
以下のように書いたところうまくいきませんでした
間違っているでしょうか?

(if change
(setq non change))
545544:2005/09/04(日) 13:49:30
ちなみに、
(setq change 'hoge)
のように設定されていると、うまくどうさします
546544:2005/09/04(日) 13:51:48
解決しました
変更しない場合は
(setq change ')
として、変数は作成しておかないとダメなんですね

変数が無い場合も正しく動作するようにはできないでしょうか?
547名無しさん@お腹いっぱい。:2005/09/04(日) 14:04:21
質問は上げとけ
548名無しさん@お腹いっぱい。:2005/09/04(日) 14:17:23
>>543
なるほど。今回のは元ファイルと常に同じって訳でもなかったんですが、そう
限定できる場合はいいかもしれませんね。アドバイスどうもです。

>>546
よくわからんが

(and (boundp 'change) change
(setq non change))

とか?
549名無しさん@お腹いっぱい。:2005/09/05(月) 15:14:56
>>546
そんな構文あるのかー!
と思って思わず確認しちゃったよ。
550名無しさん@お腹いっぱい。:2005/09/06(火) 09:40:12
emacs-cvs 使おうと思ったら、its とやらが含まれてないっぽいんんだけど、
どうしたらいい?
551名無しさん@お腹いっぱい。:2005/09/06(火) 09:52:04
あ、みっけた。
552名無しさん@お腹いっぱい。:2005/09/06(火) 12:38:05
>>550
tamgao入れれ。
553名無しさん@お腹いっぱい。:2005/09/06(火) 13:27:48
>>552
emcws あてますた。
Makefile.in は手でなおして、configure は autoconf で作りなおしますた。

tamago と emcws ってどっちがいいの?
554名無しさん@お腹いっぱい。:2005/09/06(火) 13:52:42
tamago
555名無しさん@お腹いっぱい。:2005/09/15(木) 03:44:22
Elispはじめて間もないのですが、質問です。
ある変数に入っている文字コードを判別するのって
どうやればいいのでしょうか??
例えば、

(setq hoge1 "ほげ" hoge2 "hoge")

ここで、hoge2 に入っている文字列がローマ字であるかどうかだけ
分かれば、もしくは hoge1 に2バイト文字が入っているかどうかが
分かれば分かればいいのですが・・・

get-text-property あたりを見ているのですが・・・
ご教授お願いします。
556名無しさん@お腹いっぱい。:2005/09/15(木) 04:06:20
>>555
その目的なら multibyte-string-p でよさそうな気がする。
正規表現で調べるって手もあるだろうけど。
557名無しさん@お腹いっぱい。:2005/09/15(木) 04:07:42
「ローマ字であるかどうかだけ」
これは、「アルファベットのみからなる」と置き換えてもいいの?
558名無しさん@お腹いっぱい。:2005/09/15(木) 04:09:45
そーいえばset-buffer-multibyteの使い方よくわからん
559名無しさん@お腹いっぱい。:2005/09/15(木) 04:27:26
>>556
全然よくない。
560555:2005/09/15(木) 10:03:45
皆様、レスありがとうございます。
>>557さんの言うとおり、入っている文字列が
ただ単に日本語かまた違うものかを判別したいだけ
なので”アルファベットのみからなる”と
置き換えても構わないと思います。

すみません、よろしくお願いします。
561名無しさん@お腹いっぱい。:2005/09/15(木) 10:10:12
Ro-maji hyouki no nihongo wa dousuruno?
562名無しさん@お腹いっぱい。:2005/09/15(木) 10:10:53
hoge が、アルファベットのみで構成された文字列かどうか調べるなら、

(string-match "\\`[A-Za-z]+\\'" hoge)

charset で調べるなら、

(let ((charsets (find-charset-string hoge)))
(catch 'done
(while charsets
(unless (memq (car charsets)
'(ascii eight-bit-control eight-bit-graphic))
(throw 'done t))
(setq charsets (cdr charsets)))
nil))

とか?
563555:2005/09/15(木) 10:34:56
おお、素早いレスありがとうございます!!
今試して見ます!!
564555:2005/09/15(木) 10:50:33
>>562
おお、出来ました!!
正規表現での判別と文字そのものの判別ですか〜
なるほどなるほど。どうもありがとうございます。
勉強になりました。
565名無しさん@お腹いっぱい。:2005/09/15(木) 11:32:24
カテゴリ使って
(string-match "\\Ca" "abc")
=> nil
(string-match "\\Ca" "あいうえお")
=> 0
566名無しさん@お腹いっぱい。:2005/09/15(木) 19:09:26
再度書き込みすみません。
例えば、以下のように関数の続きとして>>562さんのコードを
使いたいのですが、(let を外してしまうと
上手く動いてくれません。let は局所的変数宣言でしたよね?

(defun .....
.
.
(setq hoge (split-string "name1 name2 name3"))
(setq name_s (length hoge) name_n 0 mew-from-sex 1)
(if (let ((charsets (find-charset-string (nth name_n hoge))))
(catch 'done
(while charsets
(unless (memq (car charsets)
'(ascii eight-bit-control eight-bit-graphic))
(throw 'done t))
(setq charsets (cdr charsets)))
nil))
(setq people 0)
(setq people 1))
.
)
よろしくお願いします。。。
567名無しさん@お腹いっぱい。:2005/09/15(木) 19:17:35
(let を外したいのは何故?
568名無しさん@お腹いっぱい。:2005/09/15(木) 19:27:46
関数の始めにいっきに let で変数宣言したくて、

(let ((charsets (find-charset-string (nth name_n hoge))))
も含めて宣言しようと外したのですが。。。
569名無しさん@お腹いっぱい。:2005/09/15(木) 19:42:22
多段let撲滅
570名無しさん@お腹いっぱい。:2005/09/15(木) 19:45:03
該当の部分を函数にする
途中に let がある事に慣れる
(let (charsets)
...
(if (progn
(setq charsets (find-charset-string ...

のどれか
571名無しさん@お腹いっぱい。:2005/09/15(木) 19:54:27
>>569
参考までに教えて欲しんだけど
1. 実行速度
2.可読性
のいづれかの理由によるものでしょうか? それとも他の理由?
572569:2005/09/15(木) 19:55:16
>>571
いや、俺はちょっと皮肉(?)ってみただけで。
573名無しさん@お腹いっぱい。:2005/09/15(木) 19:57:03
えっと、以下のようにするということでしょうか??

(let (charsets) hoge name_s name_n people mew-from-sex
(setq hoge (split-string "name1 name2 name3"))
(setq name_s (length hoge) name_n 0 mew-from-sex 1)
(if (progn setq charsets (find-charset-string (nth name_n hoge))
(catch 'done
(while charsets
(unless (memq (car charsets)
'(ascii eight-bit-control eight-bit-graphic))
(throw 'done t))
(setq charsets (cdr charsets)))
nil))
(setq people 0)
(setq people 1)))
574名無しさん@お腹いっぱい。:2005/09/15(木) 19:58:15
うわ、空白がすごくみずらいですね。。。
すみません。。
575名無しさん@お腹いっぱい。:2005/09/15(木) 19:58:33
>>573
letの使い方理解してないぞ
576名無しさん@お腹いっぱい。:2005/09/15(木) 20:01:27
あ、申し訳ないです。
変数リストを()でひとまとめにしていなかったですね。

(let (charsets) hoge name_s name_n people mew-from-sex

こんな感じでしょうか??
577名無しさん@お腹いっぱい。:2005/09/15(木) 20:02:36
こうでした、何度もすみません。
(let ((charsets) hoge name_s name_n people mew-from-sex)
578名無しさん@お腹いっぱい。:2005/09/15(木) 20:50:17
初心者は setq 禁止
579名無しさん@お腹いっぱい。:2005/09/15(木) 21:34:54
Emacs をわたし色に染めて♪ の人は自殺しそうでしたがまだ生きてますか?
580名無しさん@お腹いっぱい。:2005/09/15(木) 21:46:13
>>579
なにがあったの?
581名無しさん@お腹いっぱい。:2005/09/17(土) 06:30:27
LISPのクラスを取るか迷っている初心者ですが、LISPが出きると、どういうことができるようになるのか教えてください。
582名無しさん@お腹いっぱい。:2005/09/17(土) 08:00:56
>>581
特にない。
583名無しさん@お腹いっぱい。:2005/09/17(土) 08:54:52
>>581
普通のやつらの上を行ける。
584名無しさん@お腹いっぱい。:2005/09/17(土) 11:44:54
>>583
どういう点で?
585名無しさん@お腹いっぱい。:2005/09/17(土) 13:42:35
586名無しさん@お腹いっぱい。:2005/09/17(土) 14:05:26
>>581
クラスって大学か何かか。
EmacsLispでCLOSみたいなもんを誰か作ったのかと思った。
587名無しさん@お腹いっぱい。:2005/09/17(土) 14:29:15
学校の授業という意味です。
588名無しさん@お腹いっぱい。:2005/09/17(土) 14:44:13
>>585
ありがとうございます。読みました。
中で「Lispはパワフルな言語だとは知っているけど」等、LISPは凄いと絶賛していますが、
具体的にどう凄いのかってのが、どんなところで使われているのかってのが分からないのですが…。
LISPが出きると、どういうときにそれを活かせますか?

この授業は卒業のため取らなければならない科目ではないのですが、
将来役に立つのなら、取って見ようかなと迷っています。
589名無しさん@お腹いっぱい。:2005/09/17(土) 15:16:50
学生なのに自分からは何も調べようとしないやつには、どんなことであろうと将来役に立たない
590名無しさん@お腹いっぱい。:2005/09/17(土) 15:17:55
lisp なんかできたとして、将来研究所とかに行かない限り用途ないのでは?
perl なり php なり使えたほうがバイトも出来ておとく。
591名無しさん@お腹いっぱい。:2005/09/17(土) 15:41:04
perlなんか授業でやるか?
592名無しさん@お腹いっぱい。:2005/09/17(土) 16:06:14
perlの授業あります。
将来はネットワークエンジニア希望です。
593sage:2005/09/17(土) 17:56:43
>>592
いらないんじゃね?
594名無しさん@お腹いっぱい。:2005/09/17(土) 17:59:54
久しぶりに2chに来たらsageるつもりがageちまった。
595名無しさん@お腹いっぱい。:2005/09/17(土) 18:06:49
とりあえず、この板ってのは古い知識しか持たない老人が多いので、
こんな場所で進路相談をするのは不適切なんじゃないかなと思う。
596名無しさん@お腹いっぱい。:2005/09/17(土) 20:58:02
将来役に立つかっつったら微妙だわな。
だけど大学において考え方を学ぶ、学び方を学ぶって意味ではlispはおすすめ
かもしれず。
関係ないけど、「出きる」って変換は気持ち悪いな。
597名無しさん@お腹いっぱい。:2005/09/17(土) 21:02:25
LISPを使って(応用して)なにをするかによるだろう。

単純に、LISPを勉強するだけなら独学で(Emacs使ってるうちに)勉強
できるよ。なにしろ、単純な言語だからな。

インタプリタの作成とかまでやるんだったらいいんじゃないかな?
言語仕様が簡単だから結構楽しいと思うよ。
598名無しさん@お腹いっぱい。:2005/09/17(土) 21:07:32
> 将来役に立つかっつったら微妙だわな。
> だけど大学において考え方を学ぶ、学び方を学ぶって意味ではlispはおすすめ
> かもしれず。

関係ないけど、気持悪い書き方だな。
599名無しさん@お腹いっぱい。:2005/09/17(土) 21:24:34
だいたい、Emacs Lispの板でLispについて訊いても……
600名無しさん@お腹いっぱい。:2005/09/17(土) 21:27:13
> 訊

おじさん、何でこんな漢字つかってるの?