emacs lisp は info のヘルプが超便利だと思うよ。
そだね
いろんな日本語のinfoを捜して、
それ読むだけでもいいんじゃない
lisp 以下のソースを見たらいいんじゃない?
使用したい function の使用例として。
文字列で与えられたシンボルを束縛したいんだけどどうやればいいでしょうか。
font-lock-mode => t
(let* ((bound-str "font-lock-mode")
(intern-soft bound-str))
font-lock-mode)
=> t
これじゃ駄目だし orz
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
>>505 おおー、できました。
eval すりゃいいのか…ってまだよく理解できてないけど。感謝。
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)
eval 無いと
(let ((bound-str "font-lock-mode")) (let-string ((bound-str nil)) ...))
みたいに使えないよね。
文字列リテラル書けるのなら最初からシンボルにすればいいんだから、
よそから持って来た文字列に値を束縛したいって話なんじゃないの?
すみません、書いてから気付きました。
hoge という関数が定義されているか調べるにはどのように書けばよいのでしょ
うか?
(fboundp 'hoge)
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で半角カタカナ入力できるか否かなんだが
普通、関数内部の処理では mark は使わない。
mark は基本的に、ユーザーが手動で region 指定したり移動したりするためのもの。
移動コマンドなんかで、あとでユーザーが使えるように push-mark しとくとか、そういうときに使う。
普段の処理で使うのは marker のほう。
でもこの場合は、その場で region 指定するだけだから、 marker も使わないで済みそうかな。
(save-excursion
(let ((end (point)))
(backward-word 1)
(japanese-hankaku-region (point) end)))
みたいな。
>>513 ありがとさんです。regionといっても
markしなきゃいけないわけじゃないんですね。
えらくすっきりしました。
またなんかあったらよろしく
質問なんですが、例えば(decode-time)の結果のようなリストを
これまた例えば(sec minute hour day month)のような変数(のリスト)に
一気に代入するようなコマンドってないもんでしょうか。
Perlでいう
($sec, $minute, $day, $mon, $year) = localtime();
みたいなイメージなんですが。
あと、Emacs-Lisp Farm ていうMLがあるようですが
過去ログって見れないんでしょうか?
間違った使い方な気がするけど、multiple-value-setqとか?
ログはMLはいってからコマンドメール投げれば取得できるよ。
>>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)
...)
>>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式が実行された」
ということですね?
間違った使い方な気が……っていうのは、
elispには多値はないのにmultiple-value-*を使ってるから。
520 :
Zeno ◆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
そういう考えだとあらゆる価値が平等に無意味になって
思考停止に陥るお。
思考する前に馬鹿を殺そう
523 :
Zeno ◆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
520と523がみえない
見えないのが気になるならフィルタ使わないほうがいいよ
526 :
521:2005/08/24(水) 04:51:42
よくわからんがニューハーフに知り合いはいないよ。
ゴキブリを見て見ぬふりする愚かさ
今は一匹なんだから叩いてつぶしちゃうよりは、
どっかに行くのを待ってもらった方がいい。
529 :
Zeno ◆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 unload-featureとか使えない?
わたし自身、一度も使った事が無いから
良く分かんないけど。
テキストファイルを 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 は大丈夫)
ちゃんと動かすにはどうすりゃいいでしょうか。
a) coding systemを設定する。
b) testout.elの中でout.txtに書く。
>>533 set-terminal-coding-system
stdout がファイルの場合は terminal-coding-system は無視されて
emacs-mule になるよ。なので 534 の b のようにするしかない。
537 :
533:2005/08/31(水) 18:13:37
>>534-536 むむ、write-file するしかないのかあ。フィルタの類ではないとはいえちょっ
と意外な気も。まあ、関数内でファイルに書いてもなんとかなるのでそうしま
す。サンクスでした。
encode-coding-string したものを princ するのはだめか?
(未確認)
>>538 おお、なるほど。
(princ (encode-coding-string (buffer-string) 'euc-jp))
でやってみたら大丈夫なようです。エンコードが決め打ちなのが格好悪いです
が、まぁしょうがないかな。ありがとうございました。
terminal-coding-systemにすれば?
>>540 emacs -Q --batch --execute='(print (terminal-coding-system))'
で japanese-iso-8bit が返ってきますね。.emacs 読んでなくても大丈夫なの
か。terminal-coding-system 使うことにします。どうもでした。
>>541 ロケール見てるっぽいね。
$ LC_ALL=C emacs -Q --batch --execute='(print (terminal-coding-system))'
だと nil だったから。nil の時だけ us-ascii にしておけば問題ないと思う。
>>539 入力ファイルと同じ coding-system にしたいのであれば,
insert-file-contents した直後の last-coding-system-used を
使うというのはどうだろう。
Elispを初めて改造してみたのですが
うまく行きませんでした
changeが設定されていれば、nonにchangeを入れたいのですが
以下のように書いたところうまくいきませんでした
間違っているでしょうか?
(if change
(setq non change))
545 :
544:2005/09/04(日) 13:49:30
ちなみに、
(setq change 'hoge)
のように設定されていると、うまくどうさします
546 :
544:2005/09/04(日) 13:51:48
解決しました
変更しない場合は
(setq change ')
として、変数は作成しておかないとダメなんですね
変数が無い場合も正しく動作するようにはできないでしょうか?
547 :
名無しさん@お腹いっぱい。:2005/09/04(日) 14:04:21
質問は上げとけ
>>543 なるほど。今回のは元ファイルと常に同じって訳でもなかったんですが、そう
限定できる場合はいいかもしれませんね。アドバイスどうもです。
>>546 よくわからんが
(and (boundp 'change) change
(setq non change))
とか?
>>546 そんな構文あるのかー!
と思って思わず確認しちゃったよ。
emacs-cvs 使おうと思ったら、its とやらが含まれてないっぽいんんだけど、
どうしたらいい?
あ、みっけた。
>>552 emcws あてますた。
Makefile.in は手でなおして、configure は autoconf で作りなおしますた。
tamago と emcws ってどっちがいいの?
tamago
555 :
名無しさん@お腹いっぱい。:2005/09/15(木) 03:44:22
Elispはじめて間もないのですが、質問です。
ある変数に入っている文字コードを判別するのって
どうやればいいのでしょうか??
例えば、
(setq hoge1 "ほげ" hoge2 "hoge")
ここで、hoge2 に入っている文字列がローマ字であるかどうかだけ
分かれば、もしくは hoge1 に2バイト文字が入っているかどうかが
分かれば分かればいいのですが・・・
get-text-property あたりを見ているのですが・・・
ご教授お願いします。
>>555 その目的なら multibyte-string-p でよさそうな気がする。
正規表現で調べるって手もあるだろうけど。
「ローマ字であるかどうかだけ」
これは、「アルファベットのみからなる」と置き換えてもいいの?
そーいえばset-buffer-multibyteの使い方よくわからん
560 :
555:2005/09/15(木) 10:03:45
皆様、レスありがとうございます。
>>557さんの言うとおり、入っている文字列が
ただ単に日本語かまた違うものかを判別したいだけ
なので”アルファベットのみからなる”と
置き換えても構わないと思います。
すみません、よろしくお願いします。
Ro-maji hyouki no nihongo wa dousuruno?
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))
とか?
563 :
555:2005/09/15(木) 10:34:56
おお、素早いレスありがとうございます!!
今試して見ます!!
564 :
555:2005/09/15(木) 10:50:33
>>562 おお、出来ました!!
正規表現での判別と文字そのものの判別ですか〜
なるほどなるほど。どうもありがとうございます。
勉強になりました。
カテゴリ使って
(string-match "\\Ca" "abc")
=> nil
(string-match "\\Ca" "あいうえお")
=> 0
再度書き込みすみません。
例えば、以下のように関数の続きとして
>>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))
.
)
よろしくお願いします。。。
(let を外したいのは何故?
関数の始めにいっきに let で変数宣言したくて、
(let ((charsets (find-charset-string (nth name_n hoge))))
も含めて宣言しようと外したのですが。。。
多段let撲滅
該当の部分を函数にする
途中に let がある事に慣れる
(let (charsets)
...
(if (progn
(setq charsets (find-charset-string ...
のどれか
>>569 参考までに教えて欲しんだけど
1. 実行速度
2.可読性
のいづれかの理由によるものでしょうか? それとも他の理由?
572 :
569:2005/09/15(木) 19:55:16
>>571 いや、俺はちょっと皮肉(?)ってみただけで。
えっと、以下のようにするということでしょうか??
(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)))
うわ、空白がすごくみずらいですね。。。
すみません。。
あ、申し訳ないです。
変数リストを()でひとまとめにしていなかったですね。
(let (charsets) hoge name_s name_n people mew-from-sex
こんな感じでしょうか??
こうでした、何度もすみません。
(let ((charsets) hoge name_s name_n people mew-from-sex)
初心者は setq 禁止
579 :
名無しさん@お腹いっぱい。:2005/09/15(木) 21:34:54
Emacs をわたし色に染めて♪ の人は自殺しそうでしたがまだ生きてますか?
581 :
名無しさん@お腹いっぱい。:2005/09/17(土) 06:30:27
LISPのクラスを取るか迷っている初心者ですが、LISPが出きると、どういうことができるようになるのか教えてください。
584 :
名無しさん@お腹いっぱい。:2005/09/17(土) 11:44:54
>>581 クラスって大学か何かか。
EmacsLispでCLOSみたいなもんを誰か作ったのかと思った。
587 :
名無しさん@お腹いっぱい。:2005/09/17(土) 14:29:15
学校の授業という意味です。
588 :
名無しさん@お腹いっぱい。:2005/09/17(土) 14:44:13
>>585 ありがとうございます。読みました。
中で「Lispはパワフルな言語だとは知っているけど」等、LISPは凄いと絶賛していますが、
具体的にどう凄いのかってのが、どんなところで使われているのかってのが分からないのですが…。
LISPが出きると、どういうときにそれを活かせますか?
この授業は卒業のため取らなければならない科目ではないのですが、
将来役に立つのなら、取って見ようかなと迷っています。
学生なのに自分からは何も調べようとしないやつには、どんなことであろうと将来役に立たない
lisp なんかできたとして、将来研究所とかに行かない限り用途ないのでは?
perl なり php なり使えたほうがバイトも出来ておとく。
perlなんか授業でやるか?
592 :
名無しさん@お腹いっぱい。:2005/09/17(土) 16:06:14
perlの授業あります。
将来はネットワークエンジニア希望です。
593 :
sage:2005/09/17(土) 17:56:43
久しぶりに2chに来たらsageるつもりがageちまった。
とりあえず、この板ってのは古い知識しか持たない老人が多いので、
こんな場所で進路相談をするのは不適切なんじゃないかなと思う。
将来役に立つかっつったら微妙だわな。
だけど大学において考え方を学ぶ、学び方を学ぶって意味ではlispはおすすめ
かもしれず。
関係ないけど、「出きる」って変換は気持ち悪いな。
LISPを使って(応用して)なにをするかによるだろう。
単純に、LISPを勉強するだけなら独学で(Emacs使ってるうちに)勉強
できるよ。なにしろ、単純な言語だからな。
インタプリタの作成とかまでやるんだったらいいんじゃないかな?
言語仕様が簡単だから結構楽しいと思うよ。
> 将来役に立つかっつったら微妙だわな。
> だけど大学において考え方を学ぶ、学び方を学ぶって意味ではlispはおすすめ
> かもしれず。
関係ないけど、気持悪い書き方だな。
599 :
名無しさん@お腹いっぱい。:2005/09/17(土) 21:24:34
だいたい、Emacs Lispの板でLispについて訊いても……
> 訊
おじさん、何でこんな漢字つかってるの?