- 1 名前:おっす [03/09/18 19:29]
- なんとなくEmacs 触り始めて、なんとなくelispにも手を出して
しまったアナタ。 なんとなく書いてしまったコードをココに書き込んで叩かれましょう。 タタカレテツヨクナレ。 年季の入った玄人衆は、もしアドバイスできたらお願いします。 いや、叩きついでにでも。 とりあえず入門書は ttp://www.netfort.gr.jp/~kiyoka/emacs_setq/emacs_setq.html ttp://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp.html リファレンスマニュアルは(ちと古い) ttp://www.fan.gr.jp/~ring/doc/elisp-manual/elisp.html とか、新しいのは(でも英語) ttp://www.delorie.com/gnu/docs/elisp-manual-21/elisp.html ではひとつ、コード中心の熱いバトルをよろぴく。
- 888 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 21:52:54 ]
- >>887
(mapcar (lambda (x) (car (last x))) A)
- 889 名前:名無しさん@お腹いっぱい。 [2007/05/28(月) 22:00:23 ]
- >>888
見たことないコマンドが多いのですが・・・。 初心者なのでもう少し分かりやすくしていただけるとありがたいのですが。
- 890 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 22:16:26 ]
- 標準の関数くらい自分でしらべろよ。
- 891 名前:名無しさん@お腹いっぱい。 [2007/05/28(月) 22:17:51 ]
- そういった関数を使わないで定義したいんです。
- 892 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 23:42:03 ]
- lambda とか mapcar 使わないで lisp のプログラム書くのは
逆に難しいと思うぞ。
- 893 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 00:06:38 ]
- それは無理な話だ
- 894 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 00:08:04 ]
- ごめん
>>893は>>891へね
- 895 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 00:11:56 ]
- おk。mapcar も lambda も car も廃止してやったぞ。last は使わせてくれて…
(require 'cl) (defun fun-887 (lst) (loop for element in lst collect (first (last element)))) last も禁止ならこうだ。 (require 'cl) (defun fun-887 (lst) (loop for element in lst collect (first (reverse element))))
- 896 名前:名無しさん@お腹いっぱい。 [2007/05/29(火) 00:16:23 ]
- >>895ありがとうございました
もう一つ聞きたいのは、数nとリストを引数として取り、 リストのn番目の要素を返す関数を定義したいのですが、 この関数を再帰を使って定義するにはどうしたらいいでしょう
- 897 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 00:24:12 ]
- (defun list-ref (lis n)
(if (zerop n) (car lis) (list-ref (cdr lis) (- n 1))))
- 898 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 00:43:50 ]
- んー?
ttp://questionbox.msn.co.jp/qa3033199.html
- 899 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 00:46:01 ]
- 最近なんでもかんでも聞く人多くない?
- 900 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 01:19:24 ]
- mapcar を独自に定義しようとするとどう書ける?
- 901 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 01:29:48 ]
- >>896
再帰使うまでもない。 (defun list-ref (lis n) (nth (1- n) lis))
- 902 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 01:52:11 ]
- (defun my-mapcar (func list)
(let ((rest list) (results ())) (while (not (null rest)) (setq results (cons (funcall func (car rest)) results)) (setq rest (cdr rest))) (nreverse results))) とかかな。
- 903 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:01:06 ]
- setq とか cons を使いたくないんですとか来た場合に備えておこう。
(require 'cl) (defun my-mapcar-2 (func lst) (loop for elem in lst collect (funcall func elem)))
- 904 名前:名無しさん@お腹いっぱい。 [2007/05/29(火) 02:04:56 ]
- >>898 つうか、そゆのは大抵自分では考えないだろうし、調べないだろうし、向上心もないだろうし、礼儀も知らないだろうし、
人の忠告も聞かないだろうから。さっさと答を与えればそれ以上しつこく聞いてこない軽い荒らしだと思って対応するが吉。
- 905 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:05:17 ]
- cl は宗教上の理由でちょっと……。
- 906 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:09:23 ]
- 自分も書いてみた。リストしか考慮してない。
あんまり慣れてないからどっかまずいところあるかも・・・(自分への免罪符 (defun my-mapcar (func list) (defun my-mapcar-iter (func list rtn) (if (null list) rtn (my-mapcar-iter func (cdr list) (setq rtn (cons (funcall func (car list)) rtn))))) (my-mapcar-iter func list '()))
- 907 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:11:39 ]
- defunの中でdefunするのはじめて見た。
- 908 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:11:55 ]
- あー、 reverse すんの忘れたorz
- 909 名前:名無しさん@お腹いっぱい。 [2007/05/29(火) 02:18:25 ]
- Schemer の方ですか? Emacs Lisp じゃー再帰は実用的じゃないお。
しかも defun は internal define と違ってグローバルだし…。
- 910 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:23:05 ]
- >>898の質問者はもうダメだろうね。レポートは突破できても試験は無理そうだ……。
授業二三回でればいいだろうになぁ。まったく聞いてなかったんだろうな。授業料無駄だったね。
- 911 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 02:58:34 ]
- >>909
最近、ちょっと scheme で遊んでたもので・・・。 > Emacs Lisp じゃー再帰は実用的じゃないお。 調べてみたところ、再帰回数が max-lisp-eval-depth で制限されてる、 末尾再帰が最適化されない、のようなことがあるのですね。 > しかも defun は internal define と違ってグローバルだし…。 M-x help f で関数のリスト見たら、my-mapcar-iter があって驚きました。 よくよく考えてみたら、setq はいらなかった。 なんでつけたんだろう。 まずいところ多すぎorz
- 912 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 07:07:10 ]
- >>905
改宗すればおk
- 913 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 10:07:37 ]
- cl 使えば flet で関数内関数使えるよ。
- 914 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 12:55:46 ]
- flet を使って書き直すなら、こんなかんじでしょうか。
たしかに my-mapcar-iter が隠れた。これ便利かも。 (require 'cl) (defun my-mapcar (func list) (flet ((my-mapcar-iter (func list rtn) (if (null list) (reverse rtn) (my-mapcar-iter func (cdr list) (cons (funcall func (car list)) rtn))))) (my-mapcar-iter func list '())))
- 915 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 22:24:57 ]
- …再帰するなら labels じゃねーとダメなんじゃね? cl のバグ?
ズバリこうだろ。while 版より短い!! 俺のバイク小屋ハァハァ (defun my-mapcar (func lst) (let ((result nil)) (dolist (e lst) (push (funcall func e) result)) (nreverse result)))
- 916 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/29(火) 22:27:10 ]
- なんとなく nreverse なしのループで書いてみた
(defun my-mapcar (fun list) (let* ((result (list nil)) (x result)) (while list (setcdr x (list (funcall fun (car list)))) (setq x (cdr x) list (cdr list))) (cdr result))) >>915 flet を macroexpand してみればわかるよ まあしょうがないんだろうけどちょっと気持ち悪いよね
- 917 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/02(土) 08:50:13 ]
- ずびまぜん。
elispで 16進数文字列を整数に変換する楽な方法ってありません? (hoge "64") => 100 ってなるような。 (defun hoge (s) (string-to-number (concat "#x" s))) とかじゃ 0が返ってきてしまいました。
- 918 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/02(土) 08:59:28 ]
- (defun hage (s)
(string-to-number s 16)) ↓ (hage "64") ↓ 100 ウマー
- 919 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/02(土) 09:16:44 ]
- おお、そんなところに &optional があったとは...
infoをもっとちゃんと読むべきでした。 どうも有難うございました。
- 920 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/02(土) 16:36:52 ]
- >>868-
- 921 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/02(土) 21:22:45 ]
- 知ってる人も多いだろうけど C-h f めちゃくちゃ便利だよ。
関数定義してるソースの該当部分にも飛べる。
- 922 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/03(日) 00:27:47 ]
- emacs22でも、mode-infoも動いてくれるしね。
- 923 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/10(日) 19:00:25 ]
- あるオブジェクトに対し、car-safeが非nilとなる時
cdrでなくcdr-safeを使うべき局面ってある?
- 924 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/10(日) 23:36:38 ]
- >>923
car-safe が non-nil なら対象は list ってことだから、そんな局面はない、 と思う。
- 925 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/27(水) 22:28:03 ]
- 同じ名前の変数 (defvar hoge)と関数 (defun hoge ())が定義されているとき、
変数だけ定義を消すことってできますか? (unintern 'hoge) だと、両方消えてしまうので。
- 926 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/27(水) 22:36:59 ]
- makunbound
c.f. fmakunbound
- 927 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/27(水) 22:45:39 ]
- ぬりがとう。
ところでこれ何て読むのですか? (エフ)メイク・アン・バウンドでいいんかな? 思い出されるcreat()。
- 928 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/27(水) 23:18:45 ]
- >ところでこれ何て読むのですか?
なんでしょうね? >思い出されるcreat()。 なるw
- 929 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/29(金) 01:06:36 ]
- defconstしてるものには、時に大文字のシンボルを使ってみるのも一興かなと
ふと思った。 たぶんウザいだろうけど。
- 930 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/07(火) 22:22:42 ]
- EmacsがXで動いているときだけ、
C-zでアイコン化しない様にしたいと思っています。 Xで動いているのかterminalで動いているのか判別するには どうしたらよいのでしょうか。
- 931 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/07(火) 22:29:27 ]
- window-system
- 932 名前:930 mailto:sage [2007/08/07(火) 22:33:57 ]
- >931
ありがとうございます。 とりあえず、 (if window-system (global-set-key "\C-z" 'shell)) としてみました。
- 933 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/21(火) 05:23:38 ]
- M-x shell
を.emacsファイルの読み込み時に動作させるにはどうしたらよいのでしょうか。
- 934 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/21(火) 10:02:38 ]
- 本当に文字通りそうしたいのならば
(shell) と書く。
- 935 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/21(火) 12:13:59 ]
- >>934
できました。ありがとうございました。
- 936 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/26(日) 17:18:02 ]
- (global-set-key [?\C-;] 'なにか)
とか (global-set-key "\C;" 'なにか) とやってもエラーがでて動きません。 ;をjにしたら動いたので”なにか”が間違っていることはいないと思います。 C-;やC-, C-. へのバインドを指定するにはどうしたらよいのでしょうか どなたか教えていただけないでしょうか?
- 937 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/26(日) 19:00:19 ]
- [(control ?;)]
設定程度の質問なら、次回からelispスレじゃなくてemacsスレ行きな。
- 938 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/26(日) 21:58:08 ]
- >>937
ありがとうございます 今後は気をつけます どうもすいませんでした そのようにしても動きはしませんでしたが、 それはターミナルからの接続の仕様らしいと分かったので、 別のキーを割りあてることにします
- 939 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/26(日) 22:06:20 ]
- man ascii
で出てくるコントロールコード以外の コントロールキーの組み合わせ以外は 端末じゃ動かないよ。
- 940 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/26(日) 22:09:03 ]
- まちがえた。以外が一つ多かった。
- 941 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/28(火) 01:55:47 ]
- (func "/usr/bin/emacs" "/")
=> ("usr" "bin" "emacs") こんな感じで、文字列からトークンを抽出する好い奴を 何方か識りませぬか?
- 942 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/28(火) 02:03:17 ]
- 普通に1文字ずつチェックすれば良いじゃない。
- 943 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/28(火) 03:14:56 ]
- split-string
- 944 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/28(火) 19:47:13 ]
- >>943
幸あれ。 やっぱりあるよね。token で探してたよ >>942 普通?とりあえずこんなん書いてた (lambda (string delimiter) (let* ((iter (lambda (str dlm lst) (if (and (string-match dlm str) (substring str (1+ (string-match dlm str)) nil)) (funcall iter (and (string-match dlm str) (substring str (1+ (string-match dlm str)) nil)) dlm (cons (substring str 0 (string-match dlm str)) lst)) (cons (substring str 0 (string-match dlm str)) lst))))) (funcall iter string delimiter ())))
- 945 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/27(土) 01:27:05 ]
- 下記のような独自スクリプトのメジャーモードを作っています。
function: if hoge == 0 { hogehoge; } elseif hoge ==1 { if hoge2 == 0 { hogehoge2; }else{ hogehoge3; } } end; 階層は上記のif文のみです。 自動インデントをつけたいのですがどうすればいいでしょうか?
- 946 名前:945 [2007/10/28(日) 08:47:43 ]
- 補足です。generic-x.elを使って作っています。
- 947 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/30(火) 10:08:00 ]
- buffer-local-variableなるものがあるそうですが、
.emacs.elなどでsetq-defaultで設定した値は、 新しいバッファを作る度にバッファごとの値のコピーが作られてしまうんでしょうか。 カスタマイズ性から見るとsetq-defaultの方が使い易そうなのですが、 パフォーマンスに悪影響がでないか心配なんです。
- 948 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/30(火) 20:29:39 ]
- make-variable-buffer-local されてるような変数の話だよね。
これは setq とかで書き換えた時点で、その buffer に local な変数が作られるってシステム。 書き換えるまではどの buffer でも初期値を参照してて、 setq-default はこの初期値を書き換える。 それ自体がコピーの原因になったりはしないはず。
- 949 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/16(金) 08:26:40 ]
- call-processとかの外部コマンド呼び出し関数で
コマンドの出力(標準出力)を文字列もしくは文字列リストで 返すようなものってないでしょかね? いちいちバッファに出すのがとても無駄に感じる時がある
- 950 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/16(金) 22:17:04 ]
- set-process-filter
- 951 名前:名無しさん@お腹いっぱい。 [2007/11/29(木) 10:04:56 ]
- みなさん、乙です。
コードの中で読み易さを上げるためダブルクオート中の文字列を改行して書きたいのですが、 その改行自体はコード上では無効にしたいのですが、どうすればいいですか? 例 (message " listA, listB, listC") これが以下のようにmini-buffer に出力して貰いたいのですが、 listA,listB,listC そんな方法ありますか?
- 952 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/29(木) 11:08:37 ]
- >>951
(message (concat "listA," "listB," "listC"))
- 953 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/29(木) 12:39:04 ]
- >>951
(message "\ listA,\ listB,\ listC")
- 954 名前:名無しさん@お腹いっぱい。 [2007/11/30(金) 05:59:54 ]
- >>952, 953
サンクス。C と同じことできたのね。試せよオレ。
|

|