[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 04/03 02:06 / Filesize : 277 KB / Number-of Response : 955
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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

ではひとつ、コード中心の熱いバトルをよろぴく。


868 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/15(火) 01:21:02 ]
23
という数値を16進数数値として扱い、
"35"にする方法はどんなのがあるでしょうか?

(let ((n 23))
(format "%d" (string-to-number (number-to-string n) 16)))

これは思いつきましたが、もちょっと簡単にならんかな、と。


869 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/15(火) 06:39:30 ]
じゅうぶんかんたんだとおもう

870 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/15(火) 10:48:34 ]
>>868
#x23

871 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/15(火) 11:08:26 ]
>>868
なんで元が数値なんだろ。
3a とかの入力は考えなくていいの?

872 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/15(火) 20:18:46 ]
>>870
(read (concat "#x" n))
か。なんかびみょーに感じる。この表記がいけるのってemacs21以降あたり?

873 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/16(水) 00:01:09 ]
数値を concat できたのか…


874 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/16(水) 00:22:21 ]
ごめん。emacs21からはムリなはず。

875 名前:866 mailto:sage [2007/05/20(日) 00:46:22 ]
駄目だ分からない。
run-at-time 使おうにも hoge をどう指定したら良いのか不明……lisp は難しい orz
例えば、.emacs にどう書けば、自動で M-x hoge できますか? ; emacs の引数から起動するのではなくて。
あとは、start-process と while と sleep-for 辺りを組み合わせれば可能な気はするんだけど……さっぱり orz
週末に数時間しか PC に触れられないのは、現代社会をは思えない環境 orz

876 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 00:52:00 ]
run-with-timer 使うんじゃないの?
何がわからないのかがよくわからない



877 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 00:53:00 ]
もしかして M-x から指定してるものが関数名だってことを知らないとか?

878 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 03:58:00 ]
(setq hoge-timer (run-with-timer 0 1 'hoge))
(defun hoge ()
(interactive)
(message (current-time-string)))
(defun hoge-cancel ()
(interactive)
(cancel-timer hoge-timer))

M-x hoge
=>Sun May 20 03:56:18 2007

879 名前:lispp? [2007/05/20(日) 14:40:44 ]
LISPを学習して1週間目の者ですが、

(progn
(setq wara 10)
(setq waru 0)
(/ wara waru)
)
でエラーが発生します。

(if (equal waru 0)...)でなくて、catch??? throw???のような例外処理で対応したいのですが、
可能でしょうか?



880 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 14:50:53 ]
>>879
shakosv.sk.tsukuba.ac.jp/ShakoDoc/Editors/NEmacs/elisp-jman/html/eljman_104.html

881 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 17:00:06 ]
>>879
condition-case

elisp.infoのControl Structuresを参照。
Lispではcatch/throwの例外処理とsignal/condition-caseのエラー処理は別物
である点に留意されたし。

882 名前:名無しさん@お腹いっぱい。 [2007/05/20(日) 17:12:06 ]
xyzzy使っているのですが、 condition-caseで関数がないと表示されます。


883 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/20(日) 17:17:31 ]
板違い

884 名前:名無しさん@お腹いっぱい。 [2007/05/28(月) 20:48:43 ]
EmacsでのLispのプログラムについての質問です。
リストAとして((a b c) (d e f) (g h i))というリストがあるとして、このリストの中の要素であるリストの
最後の要素を返す関数を作る場合どうしたらいいでしょうか?


885 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 21:33:40 ]
>>884
各要素の cdr を見ていって、それが nil なものを返せばいいんじゃないの。
そういう話でない?

886 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/28(月) 21:37:09 ]
>>884
(car (last (car (last '((a b c) (d e f) (g h i))))))



887 名前:名無しさん@お腹いっぱい。 [2007/05/28(月) 21:47:12 ]
884の補足ですが、
リストAを引数として(c f i)を返すような関数を定義したいのです。
また、リストAの要素がもっと多い場合にも対応できるようにしたいのです。

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 と同じことできたのね。試せよオレ。







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<277KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef