Emacs Lisp

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
Emacs Lisp の専用スレ。
少数派による互助を中心に、初心者の相談も気が向けば受け付けます。
単なる Emacs ユーザーは別板の Emacs 関連スレにどうぞ。

*関連スレ
LISP Scheme Part2
 http://pc.2ch.net/test/read.cgi/tech/1002584344/
LISP Scheme
 http://pc.2ch.net/test/read.cgi/tech/987169286/
21:01/11/01 02:58
;; 無用なスレになったらすいません。
3デフォルトの名無しさん:01/11/01 05:22
先生!なぜEmacsはメジャーなCとかではなくてマイナーなLispを採用したのですか?
その利点は何?
すくなくとも、Cを使わなかったのは正解だったと思われ。
>>3-4
いやCは使ってると思うが…

Emacs Lispがなくて、かわりにカスタマイズや拡張をCだけでやるしかないとし
たら、あんなに気軽に拡張はできなかったね。.emacs書き換えるたびにビルド
し直すんだろ?(w
別にCだとコンパイルしなおさなきゃいけないってわけでもない
>>3
> 先生!なぜEmacsはメジャーなCとかではなくてマイナーなLispを採用したのですか?
> その利点は何?

CがメジャーでLispがマイナーと言ってる時点でもうなんか終わってるな。
Lispは十分メジャーだよ。

それにカスタマイズ用に俺自作謎言語なマクロを実装しているエディタだって
沢山あるのに…。(エディタに限らないが)
>>3
柔軟だから。C よりはるかに柔軟だから。
>>7
実際はともかく、C メジャー、Lisp マイナーというのが普通(?)の多くの人の考える
ところのような気がするのですが。
>>9
elisp ライブラリの数の多さを見れば十分メジャーだよ。
C に比較すれば少ないという点は否定しないけどね。
>>6
どうすんのさ。Cインタプリタでも書く?
それならLispにした方が2^24倍かしこいだろ。
カスタマイズ用のマクロ言語としては、
Cなんてほとんど使われてないと思うけど…
(あるのか?)
>>13
>>3 は秀丸とかWZとかのC風マクロ言語を意識してるんじゃない?
>>14
うん、そうかも。それってどマイナーだよね。
16デフォルトの名無しさん:01/11/02 11:38
今日は振替休日なので、マターリとelispのお勉強〜
defun と message と ifが使えるようになったにょ〜。
いきなり煽り合いからのスレスタートか・・・
先が思いやられるな
18デフォルトの名無しさん:01/11/02 14:23
elisp は再帰をできるだけ使うなというのがなえるな.
elisp が「本物」の lisp や scheme だったらもう文句なしなのに.
>>18
「本物」の lisp であっても再帰には制限あると思うけど。
Schemeはともかく。
elispってschemeより古いんだっけ?
>>20
GNU Emacs自体はScheme(1975年)ほど古くはないけど、
elispの仕様はMacLispとかの古いLispに非常に近いね。
特に、dynamic scopeしかないところが。
>>12
> それならLispにした方が2^24倍かしこいだろ。

やはり残りの8bitはタグですか?
23デフォルトの名無しさん:01/11/03 01:42
結局 emacs lisp 固有の質問というのは Unix 板の emacs スレと
ずいぶん重なるんでじゃないですか?
>>22 0倍になっちゃうじゃないか!!
251:01/11/03 03:52
>>10,23
やはりそうなるんでしょうか。
この板に来るんだけれども、UNIX 板などには来ない人からのレスを期待して
しまっていました。lisp 人口が少しでも増えないかなとか思いつつ。
lisp か C かはアレとして、>>16のような人が増えると、みんなが幸せに
なれますね。
つーかマニュアルで解決しちゃうんじゃないかな。
ちょっとした小物が多いだろうし。
>>22
Elispが上位8ビットをタグに使っていたことを知っている人が
いるとは思わなかった。今は5ビットだけどね。
>>1
UNIX板はEmacsスレは結構盛んです。一ヶ月半の間に500近い書き込み。
自分もよく教えてもらってます。
最近はemacs21の話ばっかりで盛れはカヤの外。
厨房っぽい質問してもシカトされるので、こういうスレは助かります。

今、「リスト遊び」とelisp introの日本語訳を読んでます。
テキストを扱う仕事なので、非常に興味を引かれます。
最初は基地外みたいな言語だと思ったけど、なんとなく理解できてきました。

OSを問わずほぼ同じ環境を整えられるというのは、
計り知れないメリットだと思います。
一生かけて使い込んでみようかなという気になります。
30デフォルトの名無しさん:01/11/03 13:21
elisp に lexical scope が欲しいと思うのは、
どのような時なんでしょうか?
dynamic scope だけでも特に困ったこと無いんですが...
>27 反応があってなんか嬉しい。
タグ5bitってLSBに持ってるんですよね? で、セルは32bitアラインで配置かな。
俺が見たLispは68010用。よってMSB8bitがタグ。これ最強。
今はこういう貧乏臭い実装って嫌われるから鬱。
32デフォルトの名無しさん:01/11/03 17:34
lexical scope がないと、closure が作れないのでは。
33デフォルトの名無しさん:01/11/03 17:46
動的スコープってわかんないんだけど、
仮引数に対しては静的だよね?
34デフォルトの名無しさん:01/11/03 17:58
LispってMacから発祥なんすか?
35デフォルトの名無しさん:01/11/03 18:00
>>31
なんでMSBにTAGつけるのにアラインさせるの?
LSBも空きができるじゃん。
36デフォルトの名無しさん:01/11/03 18:02
>>34
違う。最初のLISPはIBMの機械。
Macの実装が多いのは、昔からメモリたくさん積んでたし、
リニアで何メガバイトもアクセスできるという、68000の石の特性も
あると思う。
37デフォルトの名無しさん:01/11/03 18:06
>>33
仮引数って (defun hoge (hage) ..)
の hage の部分ですか? それも動的スコープだと思う.

>>34
初期の MacLisp という名が混乱の元では.
38デフォルトの名無しさん:01/11/03 21:01
>>36,37
なるほどー。ありがとです。
3933:01/11/03 21:05
>>37
hageの方です。
40デフォルトの名無しさん:01/11/03 22:25
MacLispと InterLispが 2大 Lispだったんだっけ。CommonLispができる前は。
たしかどっちも動的 scopeだと聞いた記憶がある。
そこに静的 scopeの schemeが気炎を吐いていたと。

静的 scopeの方が compileするためには楽だけど、interpreterだと
そんなに問題にならないのかもな。
macroとか書くときにイヤーソなことにならないかしらん。
41暗黙の名無しさん:01/11/04 02:01
>35 MC68000はアドレス上位8bitはバスに出力されないから最初から空いてるの。
キーボードマクロ使うときに数字をインクリメントしていきたいときってあるじゃない?
そのときのために
set-g-value : (setq gGlobalValue num)
inc-g-value ; (setq gGlobalValue (+ gGlovalValue 1))
put-g-value ; (insert int-to-string gGlobalValue)
って3つのコマンド作ったんだけど、もしかして標準で同じようなのってある?
43デフォルトの名無しさん:01/11/04 03:37
>>42
1+ のような関数ならあるけど, 破壊的なのはないと思った.
破壊的な汎用 1+ は macro で書ける. elisp manual の macro の所に
サンプルがあったと思う.

僕はキーボードマクロでも eval-expression を使うことが結構あるな.
44デフォルトの名無しさん:01/11/04 05:06
使われている言語が Lisp なのは 開発者の Stallman が Lisp の本家である
MIT AI Lab. の出身で、彼自身が Lisp プログラマだから。

ということは偶然が単に定着しているだけかな。
45デフォルトの名無しさん:01/11/04 05:40
gclな何で普及しないんですか?
46デフォルトの名無しさん:01/11/04 09:59
45です。
gclを早速動かしてみようとおもいcygwinに入れました。
インストールの途中でraw_gcl.exeがスタックダンプを
吐き出して止まります。。。どうしよう。
ソース付きのCommonLisp処理系で一番有名なのってgcl?
ソースのコメントに日本人の名前が入ってるから
これ使いたいけど自分じゃちょっと厳しいかも。
48匿名λ式:01/11/04 12:18
>>33
自由変数のscopeがlexicalなのが静的。そうでないのが動的。
静的の利点は、効率とprogramの可読性。

(defun foo (x)
(bar))
;; 互いに独立なので、fooとbarは同一lexical scapeではない。
(defun bar ()
x)

で、barからfooのxが参照できるのが動的。
;; Schemeはこれが出来ない。MacLisp, InterLisp, elispは可能。
;; Common Lispはスペシャル変数だけ可能。
;; MacLispにはcompile時のみ出来ないという時代もあった。Shallow binding以前。

(defun baz (x)
(let ((y))
(seq y (+ x x))
y))

xの参照はbinding levelを一つ越えているけど、lexical scape内だから可能。
これが「静的」の意味。binding levelはlexicalなものに限って越えられる。

;; scapeにおいて、lexical = staticって用法は他の言語で一般的。
;; S式は動的に変化するのが特徴の一つだから何か変な話だけど。
4945:01/11/04 12:49
自己レス
http://www.google.co.jp/search?q=cache:jGHzkwQfeA0:village.infoweb.ne.jp/~fwhw5892/cygwin/+cygwin+GCL&hl=ja
ここにも(2000.08.05)書いてあるとおりCygwinでgclは厳しいみたいです。

どうしよう。gソースの中へ入ってがんばるか、あきらめて他の
マシンで使うか。んー、、
50デフォルトの名無しさん:01/11/04 16:57
ちと役不足かもしれんが、CL packageに incfがあったような >>42
51デフォルトの名無しさん:01/11/06 15:32
age よう
52デフォルトの名無しさん:01/11/06 21:10
あのー、
Meadowつかい始めたんですが、デフォルトだとc/c++モードの
オートインデントが半角スペースなんです。
4タブにしたいんですが、どうしたらいんですか?
53デフォルトの名無しさん:01/11/07 00:32
>>48
動的スコープは、Schemeなら簡単なマクロで書けるでしょ。

でも、名前がうっかりぶつかるとプログラムが壊れるから不便だよね。
>動的スコープ。

やっぱりλならα変換ルール(束縛変数の名前を変えても意味が変わら
ない)が成り立ってくれないと…
54デフォルトの名無しさん:01/11/07 00:37
fooとbarのケースでは無理>53
55デフォルトの名無しさん:01/11/07 02:20
>>54
簡単に書けるよ?

(define x #f)
(define foo
 (lambda (new-x)
  (let ((old-x x))
   (dynamic-wind
    (lambda () (set! x new-x))
    (lambda () (bar))
    (lambda () (set! x old-x))))))
(define bar (lambda () x))

もちろん、実際には(fluid-letとかの名の)マクロを使うけど。
56デフォルトの名無しさん:01/11/07 09:02
>>55
そりゃ、xをグローバルにすりゃ書けるだろ
57デフォルトの名無しさん:01/11/07 13:40
>>56
shallow bindingっていう手法だけど、知らないのかな?
Emacs Lispがやってるのは、本質的にこれと全く同じ。
5856:01/11/07 14:47
>>57
知ってるよ
でも意味が異なるだろ
59デフォルトの名無しさん:01/11/07 16:37
漏れがEmacs Lisp スレ立てたときは
「Unix板逝け **終了**」
で終わったのに、この違いはなんだ(藁
>>59
多分、>>3のおかげ。あの質問のおかげで最初の十数レスがまともな物になって、
そのおかげでそれに続く話題も(終了などにならずに)まともな物になりました。
(そういう雰囲気が作られたわけです)
2ちゃんでは、スレの初めの方のレスはかなり大きな意味を持っています。
61デフォルトの名無しさん:01/11/07 19:00
でも大部分が lisp 談義になっているような.
62デフォルトの名無しさん :01/11/07 19:05
>>59
こめんな、それ言ったのはおれだよ
63デフォルトの名無しさん:01/11/07 20:53
>>58
どう違うの? 全く同じだと思うが。
6458:01/11/07 21:30
>>63
ごめんよ。勘違い。
fluid-letの存在忘れてた。
>>61 まー、マターリしてていいでしょう。
H○PやR○byの煽り合いスレよりゃぁだいぶんマシ。
>>65
ひとつ気づいたんだけど、ある程度難しい話をしてると、奴等は寄ってこないんだよね。
67匿名λ式:01/11/08 09:55
>>53
> でも、名前がうっかりぶつかるとプログラムが壊れるから不便だよね。
> >動的スコープ。

*standard-output*みたいなのを、multi thread環境で使う、
って局面ではあった方が便利だよね。
竹内さんもbitのTAOの連載で言っていたけど。
ただ、thread内でsingletonとして利用しないと、>>53の言うようにまずいわな。

>>55の実装のためには、「thread-localな環境」が欲しくなるな。< multi threaded
こういう研究や実装って最近どうなんですか? > 現役の方々
68デフォルトの名無しさん:01/11/08 10:07
外に出て x を書き換えてから継続で中に戻ると、書き換えた内容が忘れられてしまうという簡単な問題をなぜ誰も気がつかないのだろう?

そーか、ここのひとはみんな優しくてそのようなあたりまえのことは指摘しないのかな。
69デフォルトの名無しさん:01/11/08 11:50
Emacs Lispに再入可能な継続があるのかよ。
もしくは>>68はdynamic-windをよく知らないのだろう。
71デフォルトの名無しさん :01/11/08 18:21
仕事してる振りしてELispで遊ぶ、これ最強。
72デフォルトの名無しさん:01/11/08 23:56
xyzzyは?
73デフォルトの名無しさん:01/11/09 00:21
なんで xyzzy は scheme ではなく CommonLisp なのだろうか.
どうせ elisp と互換がないのだったら scheme にした方が
よかったような気がするんだけど.
Schemeは実用性の無いRubyみたいな言語だから。
汚くてもC++の方が実用性あるのといっしょ
75デフォルトの名無しさん:01/11/09 06:50
>>74
Whats?
76デフォルトの名無しさん:01/11/09 07:43
dynamic-wind を知らないというのはどちらのことやら。
試してからいえっつーの。

もし、dynamic-wind をよく知っているのに問題に気づかないというなら
lexical scope か代入のことをよく知らんのだ。
>>76
まさか、>>55にでてくるトップレベルのxが
実際にxという変数名だと理解してるのだろうか?
78デフォルトの名無しさん:01/11/09 13:15
>>76 何が気にくわないのか良くわからんが、>>55 は確かに
Schemeのfluid-letと同等ではない。
しかし、Emacs Lispのdynamic scope変数とは同等だろ?
(ここはElispスレだということを理解してる?)
>>74
Rubyに実用性が無いという点にのみ同意。
80デフォルトの名無しさん:01/11/09 15:36
>>79
厨房を呼ぶ呪文か。やめい。禁ッ
81デフォルトの名無しさん:01/11/10 02:30
dynamic scope の特徴は使わない方で
明示的に仮引数でやるようにした方が見通しいいと思うんだけど,
結構いろいろな package で使ってるようですね. skk とか wl とか.
82デフォルトの名無しさん:01/11/10 07:03
Lambda -- The utimate thread
83デフォルトの名無しさん:01/11/10 23:10
dynamic-windよーわからん
84デフォルトの名無しさん:01/11/14 02:18
(setq gnu '(gnu is not unix))
(setq gnu `(,@gnu is not unix))
86匿名λ式:01/11/14 23:18
(letrec
((gnu (gnu is not unix)))
gnu)
87デフォルトの名無しさん:01/11/15 01:11
誰か無限ストリームとして gnu を扱って下さい
88デフォルトの名無しさん:01/11/15 02:04
(define gnu (cons 'gnu (delay gnu)))

(car gnu) => gnu
(car (force (cdr gnu))) => gnu
(car (force (cdr (force (cdr gnu))))) => gnu

しかし全然Emacs Lispと無関係。
89デフォルトの名無しさん:01/11/15 02:09
is not unix
を忘れてる。
90名無しさん@お腹いっぱい。:01/11/15 09:47
ここの人たちはVisualStudioを使うべきところでもEmacsですか?
ウィザードまでは使ってもあくまでソース編集からコンパイルまでは
Emacsですか?
VisualStudioってEmacs Lispがつかえるの?
>>91
それは無理だと思うけどウィザードで生成したコードを、
編集するところにEmacs使ってるのかなっておもってさ。
93デフォルトの名無しさん:01/11/15 15:31
windowsでfull実装のemacsってあったっけ?
>>93
Meadow は違うの?
meadow とか NTemacs とかの windows 用 emacs って
非同期プロセスは使えるの?
dos の時はもちろん使えなかったけど.
96匿名λ式:01/11/16 03:32
>>93
XEmacs動いてるんちゃう?
97デフォルトの名無しさん:01/11/17 23:29
EmacsをWindowsキーバインドにするマクロ無い?
98デフォルトの名無しさん:01/11/18 02:02
マクロはないが, pc-binding-mode という関数のが望む
ものかも.
>>97
変態配置覚えちゃいなよ。
一週間もあれば慣れるよ。
10097:01/11/18 03:51
>>98
ありがとう。
>>99
仕事柄、NOTEPADやVB/VCを主に使うので・・
多分、これだけあれば違和感ないと思うんだけど。
Home/End 行頭/行末
Ctrl+Home/Ctrl+End 文頭/文末
Shift+カーソル 選択移動
Ctrl+カーソル 単語移動
Ctrl+X カット
Ctrl+C コピー
Ctrl+V ペースト
Ctrl+A 全選択
Ctrl+S 上書き保存
Ctrl+F 検索
Ctrl+Z/Ctrl+Shift+Z Undo/Redo
F3/Shift+F3 次検索/前検索
101デフォルトの名無しさん:01/11/20 09:11
100get!
間違えた、、、鬱だ
プ板にある意味が無いな。もうちょっと言語よりな話題がしたい。
;; しかし scheme とかに逸れていってしまうんだな...
104名無しさん@XEmacs:01/11/23 14:23
User-agent: な環境で、絶対パスを表す文字列から、そのファイルのタイムスタ
ンプを得るにはどのように書けばいいのでしょうか?

diredは `ls -l` を使ってるらしいと聞いたのですがelisp単体では無理?
>>104
User-agent: がどう関係するのかわからんが、file-attributes じゃダメなの?
106デフォルトの名無しさん:01/11/24 01:36
>>100
xyzzyならGates.lてファイルが用意されているんだけどね。
Emacsでは選択テキスト(リージョン)の反転表示は
無理じゃないかな?
>>106
無理じゃない.
transient-mark-mode
>>106
しかし Gates.l とは (ワラ
けどスレと全然関係無いね。
109名無しさん@XEmacs:01/11/24 17:54
>>105
できました!
(format-time-string "%Y/%m/%d %T" (nth 5 (file-attributes "/home/hoge/.emacs")))
110名無しさん@Emacs:01/11/26 12:48
("a" "b" "c" "d" "e" "f"...)
みたいなリストの中身を全てconcatするときって普通どうやります?

とりあえず
(eval (cons 'concat '("a" "b" "c"...)))
ってしたけどこのやり方が普通なのかどうかさっぱり。
111名無しさん@Emacs:01/11/26 13:00

リージョンが指定されてる時とされてない時に動作が変る関数はどうやって作っ
たらいいんでしょう。

(defun hoge (&optional start end)
(interactive "r")
(message "hoge"))

だと、リージョン指定してないときにエラーがでます。
>>110
(apply 'concat '("a" "b" "c"...))
普通かどうか知らんけど。
>>112
サンクス! apply の存在を知りませんでした。逝ってきます。
114名無しさん@Emacs:01/11/26 14:03
>>111 自己レス

transient-mark-mode にしてたのが原因でした。

transient-mark-mode の場合、transient-region-active-p で
region が指定されてるかどうかチェック出来るみたいなので、
それを使うことによって解決しました。
115デフォルトの名無しさん:01/12/05 10:00
お前ら、最近どうなのよ?
まぁ、ぼちぼちって感じ?
117デフォルトの名無しさん:01/12/05 17:06
なにが?
118デフォルトの名無しさん:01/12/05 17:07
文字列をn回繰り返すために、
(let ((f
(lambda (n)
(if (> n 0)
(concat "もじれつ"
(apply f (list (- n 1))))))))
(apply f (list 3)))
というコードを書いてみたが、apply() 使うと引数をいちいち
list() でくくらんといかんのが気に食わんのだけど。
他にクロージャを実行する関数ってどんなのがあったっけ?
funcall は?
120118:01/12/05 17:34
>>119
ありがとう。括弧がひとつ減ったよ。
121デフォルトの名無しさん:01/12/05 17:48
>>118
のようなやつって scheme みたいな lexical scope の
ものでは動かないんだけど、Emacs lisp では
普通の手法ですか?
122デフォルトの名無しさん:01/12/05 19:22
letをletrecにすればschemeでも動くよ。>121
123デフォルトの名無しさん:01/12/05 19:35
>>118
schemeならもっと簡潔に書けるよ。

つーか末尾再帰(非再帰ループ)でかけるんじゃ?
schemeならこんなかんじかな?
(letrec ((f (lambda (n)
(if (= n 0)
""
(string-append "もじれつ" (f (- n 1)))))))
(f 3))
named-letだと
(let f ((n 3))
 (if (= n 0)
  ""
  (string-append "もじれつ" (f (- n 1)))))
127デフォルトの名無しさん:01/12/05 21:21
んじゃ非再帰版(末尾再帰)
(let f ((n 3)(r '()))
 (if (= n 0)
  (apply string-append (reverse r))
  (f (- n 1) "もじれつ")))
128デフォルトの名無しさん:01/12/05 21:22
まちがえた
(let f ((n 3)(r '()))
 (if (= n 0)
  (apply string-append (reverse r))
  (f (- n 1) (cons "もじれつ" r))))
129121:01/12/05 21:37
いや letrec は知っているんですけど,
dynamic scope であることに依存して書くのは
コーディングスタイルとしてどうなのかなと思って.
まあ emacs lisp だからいいんだろうけど.
僕もそうやって書いてるし(藁
>>129
dynamicかlexicalかの問題じゃなくないか?
Emacs Lispのletがschemeのletrecと同じなんでしょ?
131デフォルトの名無しさん:01/12/05 23:11
ちょっとだけさわってみたんですが、
これってインデントはemacs-lisp-modeあたりに任せるとして、
改行はどこでやるのが普通なんでしょうか?
さっぱり見当がつきません。
132名無しさん@Emacs:01/12/16 11:49
age てみよう
133ageたら食い付く冬の厨:01/12/16 12:42
MacOSXはコード書くのは全てemacsですが何か?
ProjectBuilderのエディタなんか使ってられっか!(`Д´)
134 :01/12/16 13:01
MacOSX のemacs って,GUIつかないの?
135デフォルトの名無しさん:01/12/27 14:54
教えてください
なぜ (cons (cons 10 20) (cons 30 40))
が ((10.20) (30.40))
でなく ((10.20) 30.40)
の形になるのでしょうか?
考えると夜もねむれません

なんか違うのか?その二つ
137135:01/12/27 15:36
要素は
((10 20) 30 40)場合
第1 (10 20)
第2 30
第3 40

(10 20) (30 40)の場合
第1 (10 20)
第2 (30 40) です
138デフォルトの名無しさん:01/12/27 16:08
>>135
consは「対」を作るオペレータ。
「対」はドット表記であらわす。
(cons 1 2) => (1 . 2)
ただし、「対」の最後のcdrにnilを入れた形式をlispでは「リスト」という。
(cons 1 nil) => (1) ドット対では(1 . nil)
(cons 1 (cons 2 nil)) => (1 2) ドット対では(1 . (2 . nil))
通常lispではリスト形式で出力され、
ドット対表現はconsが1つしかない構成でのみ出力される。
リストを作る場合、普通はconsよりもlistを使う。
(list 1 2) => (1 2)
自分でプリティプリンタ書いてみるとわかりやすいかも。
140デフォルトの名無しさん:01/12/27 16:13
(list 1 2)は
(cons 1 (cons 2 nil))と同じ。
誤解があるのかもしれないので言っておくと、
ドット対表現のピリオド'.'は小数点のそれとは何の関係もない。
で、
((10.20) (30.40)) を作る場合、
(list (cons 10 20) (cons 30 40))
または、
(cons (cons 10 20) (cons (cons 30 40) nil))
141デフォルトの名無しさん:01/12/27 16:23
>ドット対表現はconsが1つしかない構成でのみ出力される。
付けたし。
cdrがpairやnilでない「行儀の悪いリスト」でも
ドット対表現で出力される。
(cons 1 (cons 2 (cons 3 4))) => (1 2 3 . 4)
(list* 1 2 3 4) => (1 2 3 . 4)
(1 2 3 . 4)はドット対であらわすと (1 . (2 . (3 . 4)))
142135:01/12/27 16:25
ていねいな答えを頂いてありがとうございます。
形式的にそのように出るということでしょうか?

ただ、不思議なのは 上記  1 2 (3 4)でもよさそうなものなのに
なぜ cdr 側が (1 2) 3 4 でしょうか?
143デフォルトの名無しさん:01/12/27 16:31
>>142
>ただ、不思議なのは 上記  1 2 (3 4)でもよさそうなものなのに
>なぜ cdr 側が (1 2) 3 4 でしょうか?
意味わからん
144135:01/12/27 16:37
すみません リロードしてなかったもので
参考にさせていただいてちょっと考えてみます
listは純リストを作成する関数ですよね?
ですので list 1 2 はセル的に
[1][→] [2][nil]ですよね
(1 2) 3 4はどのようなセルになるのでしょうか?

勉強し始めの初心者ですみません
145デフォルトの名無しさん:01/12/27 16:49
dynamic scope を上手く使って message passing って出来ます?
146デフォルトの名無しさん:01/12/27 16:52
>>144
((1 2) 3 4)
のこと?
ドット対であらわすと((1 . 2) . (3 . (4 . nil)))
作る場合は(list (list 1 2) 3 4)
または(cons (cons 1 (cons 2 nil)) (cons 3 (cons 4 nil)))

それとも括弧で括ってないって事は、多値のことかな
147146:01/12/27 16:53
>ドット対であらわすと((1 . 2) . (3 . (4 . nil)))
まちがい。
ドット対であらわすと((1 . (2 . nil)) . (3 . (4 . nil)))
>>144
((1 2) 3 4) は ((1 . (2 . nil)) . (3 . (4 . nil)))
149135:01/12/27 16:59
>148
その場合セルは
[*1参照][*2参照]
*1[1][*3参照]
*3[2][nil]
*2[3][*4参照]
*4[4][nil]
ですよね? 1.2のペアと3.4のペアがある
その時なぜ 1.2のペアだけ ( )が付くのでしょうか?
>>149
これでどう?等幅フォントでみてね。
┌─┬─┐ ┌─┬─┐ ┌─┬─┐
│││─┼→│││─┼→│││/│
└┼┴─┘ └┼┴─┘ └┼┴─┘
│ ↓ ↓
│ 3 4

┌─┬─┐ ┌─┬─┐
│││─┼→│││/│
└┼┴─┘ └┼┴─┘
↓ ↓
1 2
>>149
ルートのconsのcarにlistつくってるからだよ
([]←この表記ほとんど意味無いからやめたほうが良いよ)
>>149
うーんと、

(car '((1 2) 3 4))
(1 2)

(cdr '((1 2) 3 4))
(3 4)

(car '((1 2) (3 4)))
(1 2)

(cdr '((1 2) (3 4)))
((3 4))

だよ?
>>149
> その時なぜ 1.2のペアだけ ( )が付くのでしょうか?
リストはよく使うデータ構造なので、いつも (a . (b . (c . nil))) と書く
のは大変だから (a b c) と書けるようにしようと決めただけ。

自分でオブジェクトを文字列に変換するプログラムを作ってみろ。
やっぱ最初はドット対の辺でつまずくよね。
「なんでcdrだけ特別扱い?」みたいな(w
>>154
cdr のどこらへんが特別扱いっぽいのでしょう?
うにゃ?
156デフォルトの名無しさん:01/12/27 17:23
>>155
carはほとんどがatomで、cdrはpairかnil
引数や内部イテレータもcdrの方向だし。
特別扱い、というかcar/cdrの使い道が異なる。
157デフォルトの名無しさん:01/12/27 17:25
(a b c d e f)をcar方向に伸ばしたlist
((((((nil . f) . e) . d) . c) . b) . a)
>>156
使い道が異なるってことで納得。

>>157
前から順番に使っていくってことも先入観というか、固定観念ってこと
ですね。うっかり、当然とか思ってしまいそうですけど。
159135:01/12/27 17:38
すみません 私の質問がまとを得ていないようで
まず、前提として (1.2) 3.4は要素数は3ですよね?

148,150さんの構造の場合は2分木的に綺麗に分かれますから
(1.2) (3.4) のように要素数2個のように綺麗に分かれないのでしょうか?

(cons (cons (1 2) cons (3 4))のようの cdr部 cons (3 4)が
car 部cons (1 2)と同じように書いても
>>153さんのゆうとおり cdr 部は自動的に展開して
(1.2) (3 (4.nil))のようになるのでしょうか?
160135:01/12/27 17:42
多分私は 中途半端なCプログラマがC++をやって
”なんで 呼んでもいない関数が実行されるんだ!!”
と言ってるのと同じ気はしますが、Liaperにとっては
空気のように当然のことだと
161135:01/12/27 17:47
みなさん ありがとうございます。 今わかりました。
cdr部はnilに突き当たるまで展開されるんですね。

ありがとうございました。
>>159
> すみません 私の質問がまとを得ていないようで
> まず、前提として (1.2) 3.4は要素数は3ですよね?

えーと、要素数ってのがなにのことをいているのかと。
全部の cons セルの数のことなのか、なんなのか。

あと、1.2 って書くと小数みたいであれなんで、"." の前後には
空白を書いておかないとだめだと思うんです。

> (cons (cons (1 2) cons (3 4))のようの cdr部 cons (3 4)が
は、(cons (cons 1 2) (cons 3 4)) ですよね。

cons は cons セルの car 部と cdr 部に他のセルへのポインタをセットする
感じだと思います。
これでどう

(equal (cons (cons 1 2) (cons 3 4))
'((1 . 2) . (3 . 4)))
=> t
164135:01/12/27 18:02
>>162
すみません気をつけます。

もともとは car部と cdr部に同じように
セルのポインタをセットするのになぜ
cdr部だけ展開されるのかなっと

やっとわかりました cdr部は全ての要素まで
伸びるんですね
165匿名λ式:01/12/27 21:10
>>164
> もともとは car部と cdr部に同じように
> セルのポインタをセットするのになぜ
> cdr部だけ展開されるのかなっと

そういう習慣だからです。
要素をcar, 残りのリストをcdrに、というコンスセルを使ったリストの仕様は、
コンスセルそのものの仕様とは無関係です。
ただし、そうでないLispは存在しません。

コンスセル: cons, car, cdr, null, consp, nil
リスト: memq, list, append
で、リストはコンスセルを使って構築されています。

(1 . (2 . (3 . nil)))→(1 2 3)は、この状況におけるsyntax sugarに過ぎません。
nilはコンスセルじゃなくてアトムなのでは。
コンスセルかリストかで分けるならリストになるはずだし。
167匿名λ式:01/12/28 01:12
>>166
確かに。チョト勢い余った。
(listp nil) =>t になるよ.
(atom nil) も
=> t
だよ
170デフォルトの名無しさん:01/12/28 04:53
nil は atom でも list でもある唯一の要素です.
171デフォルトの名無しさん:02/01/10 07:09
defsubst でインライン関数を定義したとき、
これを再帰呼出しした時にはどのように
扱われるのでしょうか?
ふつうに関数呼び出しが行われるみたい。
M-x disassemble 使え。
173デフォルトの名無しさん:02/01/11 17:07
Emacs最高です。結婚してもいいですかー?!
174名無しさん@Emacs:02/01/11 17:31
test property の field についての説明はどこかにありますか?
M-x shell のプロンプトに使われていて、C-a の挙動に影響しているのですが
詳しく知りたいのです。
175Lisp 1.5:02/01/12 01:04
>>173
許す。ただし、持参金はたっぷりな。生命保健にも入ってもらう。
176名無しさん@Emacs:02/01/15 12:12
C-x C-f ~/elisp/hoge.el してその中に

(defun hoge (dir)
(interactive "fDirectory: ")
(message "Directory=%s" dir))

と書いてあるとしますよね。これを評価して
M-x hoge で ~/elisp/ RET すると ~/elisp/ ディレクトリではなく
~/elisp/hoge.el というファイル名が渡ってしまって困るのですが、これはそ
ういうものなんですか?
>>176
> (interactive "fDirectory: ")
でなくて
(interactive "DDirectory: ")
では?
178リスプ?:02/01/15 13:26
ソートのプログラムをEmacs Lispでの書き方を教えてください!!
おねがいします。
>>177
あ・・・そうですね。本にそう載ってたんですが。
単純なこと聞いてすみません。

>>178
何をどう sort したいのか書かなきゃ答えようがないのでは?
# どっちにしても私も分からないけど。
180リスプ?:02/01/15 16:00
>179 そうですね。ありがとうございます。
引数にランダムな数字のリストをおいたとき、値として大きい(小さい)順に
並べ替えられたリストが出力されてくるようなプログラムを教えてもらいたいのです。
よろしくおねがいします。
>>180
sort とか stable-sort とか?

(sort '(10 9 8) '<)
=> (8 9 10)

(sort '(8 9 10) '>)
=> (10 9 8)
182教えてください!:02/01/15 16:34
関数としてsortを定義するとどうなるのでしょうか?
(dufun sort ・・・)見たいな感じで教えてもらえないでしょうか?
おねがいします。
>>182
や、もとからあるでしょ。
184教えてください!:02/01/15 16:55
実は大学のレポートでsortを定義しろっていう問題が・・・
けど、ぜんぜんわからなかったので。
やさしい Emacs-Lisp 講座を読んで Dired もどき作成中です。
ほーこんなこともできるのかぁって感じですごく(・∀・)イイ!!
それだけ。
教えて君ウザすぎ。
つーか sort なんて簡単でしょ?
;; しかし elisp でやれとは、物好きな奴がいたもんだな。
sexp は男性ですか?女性ですか?という意味でしょうか。
それとも セクース しようぜ!でしょうか。
188デフォルトの名無しさん:02/01/16 19:54
上の教えて君じゃないがクイックソートを書いてみようとした。
edebug 中に g で Go! したら Meadow さんはお亡くなりになった。(-_-)ウツダ
しまった。ageてしまいました。
逝ってきます。
p は predicate です.
object が sex であるかどうかを調べます.
192「リスト遊び」:02/01/16 23:52
coffeep 「コーヒーはいかがですか?」
t
194名無しさん@Emacs:02/01/17 11:10
>>188
> 上の教えて君じゃないがクイックソートを書いてみようとした。

リストで qsort って書けますか?
やはり一度、配列に変換していますか?

195名無しさん@Emacs:02/01/18 12:56
邦訳 Emacs lisp リファレンスマニュアルの改定版 でないかなー。
だれか翻訳してる?

俺がやるとしたら、前のやつを利用してもいいの?
あのマニュアルって GPL なの?
やり始めた後で出版されると、徒労だなー。
>>195
元のドキュメントが GPL なんで、翻訳も GPL だよん。
ソースは ftp.ascii.co.jp/pub/GNU や openlab.ring.gr.jp/gnujdoc あたりに。
197名無しさん@Emacs:02/01/19 16:02
asciiのほとんどtexiを印刷しただけっぽいリファレンス本を買った
漏れはイッテヨシだった…


あとで存在を知った邦訳のオンラインマニュアルのが数倍つかいやすいでやんの
198Emacs-Lisp厨:02/01/19 17:13
Emacs Lisp を勉強しています。
d:/hoge/info にある emacs-[0-9]+ というファイルを emacs-ja-[0-9]+ とい
う名前でコピーするプログラムを書いてみました。

わざわざ elisp で書く必要もないのですが。
簡単に書けるかと思ったら、書いてみると意外に難しかった・・
こうやったらもっと簡単に書けるぞ (゚Д゚)ゴルァ
というツッコミをお待ちしています。


(let ((files (directory-files "d:/hoge/info"))
old-file new-file
rename-list)
(save-excursion
(set-buffer (get-buffer-create "*tmp*"))
(erase-buffer)
(while files
(setq old-file (car files))
(if (string-match "emacs-\\([0-9]+\\)" old-file)
(progn
(setq rename-list (cons old-file rename-list))
(insert old-file "\n")))
(setq files (cdr files)))
(goto-char (point-min))
(setq rename-list (nreverse rename-list))
(cd "d:/hoge/info")
(while (re-search-forward "emacs-\\([0-9]+\\)" nil t)
(setq new-file (concat "emacs-ja-"
(buffer-substring (match-beginning 1)
(match-end 1))))
(copy-file (car rename-list) new-file t)
(setq rename-list (cdr rename-list)))))
199Emacs-Lisp厨:02/01/19 17:17
あ…最後に kill-buffer 足したはずなのに古い方コピーしてしまった。

# あとsave-excursion の使いかたとかいまいちよくわかっていないのですが…
>>198
(mapc
(function (lambda (file)
(let ((new-file (replace-in-string file "emacs-" "emacs-ja-" t)))
(copy-file file new-file t))))
(directory-files "d:/hoge/info" t "\\`emacs-\\([0-9]+\\)\\'" t))

いちいちバッファに書く必要なんぞない。
201Emacs-Lisp厨:02/01/19 18:20
なるほどー。mapc というのは mapcar のことですか?
やっぱりこれくらい単純になるんですね。replace-in-string というのも初め
て見ました。勉強しに逝ってきます。
describe-functionしる。

`mapc' is a compiled Lisp function
(mapc CL-FUNC CL-SEQ &rest CL-REST)

Documentation:
Like `mapcar', but does not accumulate values returned by the function.

結果をリストにする必要がないから若干効率がいい。
つーかdescribe-functionくらい知ってれば、directory-filesでフルパスにさ
せたりパターンを指定したりできることくらいすぐ分かるはずだ。
標準だったらC-h fでできるからこれくらい覚えとけ。あとC-h vモナー。
204Emacs-Lisp厨:02/01/19 20:15
>>202
describe-function はしたんですが、mapcar と mapconcat しかなかったので。
何でだろ…
>>202
> 結果をリストにする必要がないから若干効率がいい。
嘘書いちゃだめだよ。lisp/emacs-lisp/cl-extra.el 見てみれ。
emacs 21のbuilt-inのmapcならその通りだけど。

>>204
(require 'cl)
あまりお勧めしない。
206Emacs-Lisp厨:02/01/19 21:00
Emacs21 にはありました。Meadow にはないのかな…
っと思ったら >>205 の (require 'cl) でできました。
cl ってことは Common Lisp の関数なんですかね。
>>206
(require 'cl) してまで使う必要ないだろ。mapcar 使っとけ。
208Emacs-Lisp厨:02/01/19 23:15
>>207
はい、これから使うときは mapcar 使うつもりです。

ところで replace-in-string って XEmacs にしかないんですかね?
replace-regexp-in-string がある。
でも cl の flet とか case とか便利だよね.
211デフォルトの名無しさん:02/01/24 10:03
今日の日付から先週の月曜日が何月何日か知りたいんですが、簡単な方法って
あります? calender とか使ってできる方法があれば教えてください。
calendar ですね。間違えました。
213デフォルトの名無しさん:02/01/24 14:52
interactive にやるんなら calendar で日付を mark して
region 間で M-=

lisp でのやり方は知らん
214211:02/01/24 19:52
>>213
interactive にではなくて elisp プログラムとして使いたいのですが。

自分で書くとしたら…
1. (current-time-string) で今日の曜日と日付をとってくる。
2. その週の月曜日が何日かを出す。
3. 先週の月曜日が何日かを調べる。

って感じになりますかね。月の始めの場合の処理が難しそうなんでちょっと辛
いかなぁ。

;; メイルのテンプレート用に勉強のために作るつもりです。
;; 勉強なんだから苦労してでも作れって言われそうですが、なるべく簡単な
;; 方法でやりたいので。(それも自分で考えろ (゚Д゚)ゴルァ だけど)
なんでメールに先週の月曜の日付をいれんの?
216デフォルトの名無しさん:02/01/25 00:04
>>214

私なら…
1. (nth 6 (decode-time)) で今日の曜日を取得
2. 先週の月曜日が何日前になるかを算出
3. (decode-time) の DAY を n 日前にして encode-time
;; DAY が 0以下でもちゃんと処理してくれる:-)
必要に応じてまた `decode-time' するなり、`format-time-string' なり。

calendar 使うなら…
(calendar-gregorian-from-absolute
(calendar-dayname-on-or-before
1
(- (calendar-absolute-from-gregorian (calendar-current-date)) 7)))
217213:02/01/25 01:22
>>214
こういうのは
describe-key で M-= して
help から calendar.el の該当関数の所にとんで
参考にするといいよ.
218211:02/01/25 02:33
>>215
週間作業報告を書くのに先週一週間分の日付を入れなきゃいけないので(w
今は手作業で入力してるんで面倒なんですよね。

>>216
ありがとうございます。参考になりました。encode-time と decode-time 使っ
てやってみます。

>>217
わかりました。これから lisp のソースもいろいろ読んで研究します。
;; TAGS ファイルも作れたし。
219デフォルトの名無しさん:02/02/01 12:58
あげ
220名無しさん@Meadow:02/02/07 23:26
>>211
倉庫行き回避に、先週の月曜はいつだ、を作ってみた。
いきなり、土日の先週の月曜っていつだ?って考え込んだ。
元のお題が「週間作業報告を書くのに先週一週間分の日付を入れなきゃいけないので」
なので、土日なら同じ週の月曜としてみた。

月曜 〜 金曜 → 先週の月曜
土曜 〜 日曜 → 今週の月曜

効率より、修正のしやすさをちょっと考慮。

(let* ((today (decode-time
;;(encode-time 0 0 0 Day Month Year)
))
(day (nth 3 today))
(month (nth 4 today))
(year (nth 5 today))
(dow (nth 6 today)) ;0(Sun)-6(Sat)
(dst (nth 7 today))
(zone (nth 8 today))
days-before)
(cond
((= dow 6) ;Sat
(setq days-before 5))
((zerop dow) ;Sun
(setq days-before 6))
(t ;Mon - Fri
(setq days-before (+ 7 (1- dow))))
)
(format-time-string
"%Y/%m/%d"
(encode-time 0 0 0 (- day days-before) month year dst zone)))
参考になりそうなのが hnf-mode.el にあるよ。
>>220
質問者です。
最終的に先週の日付を求める部分はこうなりました。

(defun my-last-week-day (n)
(let* ((d-time (decode-time))
(youbi (nth 6 d-time)))
(setcar (nthcdr 3 d-time)
(- (nth 3 d-time) 7 (- youbi n)))
(decode-time (apply 'encode-time d-time))))

(format-time-string
"%Y/%m/%d"
(apply 'encode-time (my-last-week-day 1)))
=>"2002/01/28"

考えてみたら月曜だけじゃなくて先週一週間分の日付が必要だったので、
n が 1 の時は月曜、2 なら火曜、、、の日付を返すようにしました。
;; 普通は 0 から?

変数名、関数名は適当です(w
修正しやすいかどうか分かりませんが、今見たら自分でもちょっと…(w

;; ズルをして某板でも質問をしたかもしれません(-_-)ウツダ
あ、あと土日のことは全く考えてませんでした。
土日に使うことはないかなぁと思って。
>>221
hnf-float-time で浮動小数点型にして、適当な演算後に hnf-time-float で
リストに戻しているが、そこの処理のおかげで Nemacs で動かないという(藁

そういえば Emacs21 には float-time という built-in が追加されたけど、
time-float はないのよね。
>>244
フォローありがと。
226225:02/02/08 23:45
う。>>224 ね。
227名無しさん@Meadow:02/02/28 18:59
メンテ上げ。
#もう落としてしまった方がいいんだろうか?

おまけで、遅い quick sort。
ほとんどパクリだが stable にしてみた。

(defun qsort2 (cmp l)
(let ((q2 (lambda (l1 m l2 l)
(if l
(if (funcall cmp (car l) m)
(funcall q2 (append l1 (list (car l))) m l2 (cdr l))
(funcall q2 l1 m (append l2 (list (car l))) (cdr l)))
(append (funcall q1 l1) (cons m (funcall q1 l2))))
))
(q1 (lambda (l)
(if l
(funcall q2 nil (car l) nil (cdr l))
)
)))
(funcall q1 l)
))

;;使い方
(qsort2 'car-less-than-car '((4 . "4") (2 . "2") (1 . "1")
(2 . "3") (3 . "3") (5 . "5") (1 . "2")))
228デフォルトの名無しさん:02/03/07 18:26
age
(let ((x 0))
 (defun foo ()
  (setq x (+ x 1))))

(foo) ==> Error: Symbol's value as variable is void: x

ってなるけど elisp てこういう仕様なの?Common-Lisp だと下のように
なるんだけど。

(foo) ==> 1
(foo) ==> 2
:
closure が無いんじゃないの?
XMLSchemaに対応したメジャーモードなんていつごろ完成するかな?
そんなの作ってるなんて聞いたことないし。自分で作れてってことだね。
これは。

それにしてもUNIXな人たちはXMLになんであんなに無関心なんだ?
(require 'cl)

(lexical-let ((x 0))
(defun foo ()
(setq x (+ x 1))))
233デフォルトの名無しさん:02/03/09 11:07
`:foo' みたいなシンボルはどういう時に利用してますか?
>>232
なるほど、ありがとう。
235デフォルトの名無しさん:02/03/10 00:55
emacs lisp wizard の方、教えて下さい。

lexical scope で function を bind したいんですが、
何か方法ないでしょうか。
つまり一時的に、既存の関数の動作をかえるような
ことがしたいんです。

cl には lexical-let があるんですが、
value cell の方は lexical になるものの、
function cell の方は面倒見てくれないようです。

なぜそんなことをしたいかというと、
普通の advice では変更が無理な状況があって、
関数ごと書きかえないといけないんですが、
長々と余計なコードを .emacs に書きたくなくて。
advice でできれば数行ですむのに、
関数を丸ごと書くと百行単位になってしまうんです。

ちなみに cl には flet という便利なものも
あるんですが、残念ながらこれは lexical では
ない様子。lexical-flet みたいなのがあればいいのに。
236235:02/03/10 16:48
一応報告。
その後 labels という lexical な flet があることがわかりましたが、
結局 advice では使えませんでした。

(defadvice my-test (around test)
(labels ((car ()
(my-car)))
ad-do-it))

こんな風にすると ad-do-it 内では car の bind が無効に
なるし(当り前ですが)、また ad-do-it を展開するような
macro を使っても、advice が ad-do-it を有効にするのは
関数の実行時のようなので、結局無理ということがわかりました。

もともと advice は lexical な変数や関数を考えて作ってないので、
仕方ないのですが。
>>234,235
>長々と余計なコードを .emacs に書きたくなくて。
>advice でできれば数行ですむのに、
本当にこっちの優先度が高いのなら、元の関数をバイト・コンパイルしなけれ
ばなんとかできそうな気もするが。
238235:02/03/11 02:45
>>237
自分で advice もどきの macro を作って、
一応できるにはできたのですが、(byte-compile してても OK)
しかしそうすると advice に対応できなくなって
汎用性がなくなるので、結局使うのはやめました。

参考までに書くと、こんな感じのやつ。
hoge を advice すると、結局使えなくなります。

(defmacro new-hoge ()
`(labels ((new-func () old-func))
,(symbol-function 'hoge)))
239237:02/03/11 12:39
>>238
236 では書き換え対象が car だったのに、old-func に変わっちゃったわけね。
(´-`).。oO(adviceって何だろう?)

そういえば起動時 loading adviceってあるな。
hook みたいなもんかな。
241デフォルトの名無しさん:02/03/15 04:58
>>240
advice は既存の関数を書きかえる時に便利だよ。
とりあえず elisp の info でも読みな。
242デフォルトの名無しさん:02/03/15 18:16
(eval-and-compile
(require 'hoge))

(require 'hoge)
はどのように効果が違うのか誰か教えてくだされ。
243読まずにカキコ:02/03/15 18:43
>242
上だと(require ..)の結果を実行してしまわないか?
244242:02/03/16 04:27
;; 読まずにカキコ って……、そんなにレベル低いかなぁ。
> 上だと(require ..)の結果を実行してしまわないか?
どちらでも実行(というか評価)されるんじゃないのですか?
>>244
場合による。
246名無しさん@Meadow:02/03/22 07:32
emacs lisp でマルチスレッドな処理ってできるんですか?
絶対無理?
247デフォルトの名無しさん:02/03/22 09:06
>>246
つーかemacsのマニュアルみてよ
多分無理だと思うけど
248Lisp 1.5:02/03/22 10:23
>>246
無理。process filter使って複数のprocess/network stream扱うのは可能。
249デフォルトの名無しさん:02/04/03 14:50
ELF が面白い。
buffer local function ってできないかな?
あるバッファでだけ関数をおきかえたいっての。
できたら少し便利かも??
>>250
あるモードでだけおきかえる、ってのじゃだめなの?
OOっぽくていいかもな。
253デフォルトの名無しさん:02/04/12 16:03
(age)
254名無しさん@Emacs:02/04/15 22:33
Emacs Lisp かじり始めの厨房です。
Perl でいうところの、
$data{'name'}='Mona';
$data{'age'}=14;
$data{'prop'}='AA';
push(@list,\%data);
みたいなデータ構造をEmacs Lispでやるには
どうしたらいいですか?
alist(連想リスト)かな。
(setq data '((name . "Mona") (age . 14) (prop . "AA")))

追加するときは
(setq data (cons '(hoge "foo") data))
=>((hoge "foo") (name . "Mona") (age . 14) (prop . "AA"))

;; あんま自信なし(汗
256デフォルトの名無しさん:02/04/16 01:06
?\x20を評価させると 32になるので、
16進数を10進数で表示させる関数を作ろうと思いました。
が、引数で '20'が渡ってきたとして、
?\x20を生成&評価させることってできるのでしょうか?
>>256
お望みのままに処理すると
(eval (car (read-from-string (concat "?\\x" (number-to-string 20)))))

こうかな? マクロにすると

(defmacro my-dec-to-hex (num)
(car (read-from-string (concat "?\\x" (number-to-string num)))))

こんな感じ。でも ?\x20 を評価して 32 になるのは FSF の場合であって
XEmacs だとダメです。 それに read-from-string とか使っててダサいな。
誰かまともなの示して。
(car (read-from-string [string]))

(read [string])
でいいのでは?
どうせエラー処理しないなら
259257:02/04/16 13:44
むぅ、read で直接文字列食わせれるのか。
ところで read-from-string だとどのようにエラー処理ができるのか
Info 読んでもよく分らん。よろしければ教えて。
質問して答えてもらったのにできたともできないとも言わない奴なんとか言え。
;; とか思うのは俺だけ?
>>257,258
できました。ありがとうございます。
\?\xってやってできなかったので、
Cみたいな関数つくってでガマンしてました。(w
262256,261:02/04/17 00:00
>>261
こんな感じにしてみました。
ツッコミあったらよろしくお願いします。

(defun dec-to-hex-or-hex-to-dec (num)
"10進数->16進数, 16進数->10進数"
(interactive "sNum?: ")
(if (string-match "0x" num)
;; 16進数->10進数
(message "%s is %d." num (read (concat "?\\x" (car (split-string num "0x")))))
;; 10進数->16進数
(let ((int (string-to-int num)))
(message "%d is 0x%x." int int))))

263258:02/04/17 02:12
>>256,257
ふたりともとってもいい人というか、関係ない文字を渡されたときのこととか考えてないのね。
エラー処理とは、そういうことを指してました。
ちなみに、elispレベルのエラー処理をするなら、condition-caseで引っかけるのが普通でしょう。

>>262
せっかくなので、ちょっとだけ。
機能的には、大文字にも対応できるようになったはず。

(defun dec-to-hex-or-hex-to-dec (num)
"10進数->16進数, 16進数->10進数"
(interactive "sNum?: ")
(let ((case-fold-search t))
(if (string-match "^0x\\(.+\\)" num)
;; 16進数->10進数
(message "%s is %d." num (read (concat "?\\x" (match-string 1 num))))
;; 10進数->16進数
(let ((int (string-to-int num)))
(message "%d is 0x%x." int int)))))
264257:02/04/17 02:59
>>263
> >>256,257
> ふたりともとってもいい人というか、関係ない文字を渡されたときのこととか考えてないのね。
> エラー処理とは、そういうことを指してました。
> ちなみに、elispレベルのエラー処理をするなら、condition-caseで引っかけるのが普通でしょう。

うん、だから condition-case は使うとして、エラー処理における read-from-string の
read に対する優位性について知りたいのです。よろしければ。

あと、XEmacs は (char-to-int (read "?\\x10")) とすれば 16 が返ります。
;; int-to-string は number-to-string のエイリアスなのに、char-to-number がない
265258:02/04/17 11:43
>>264
signalが発生するような場合ではどっちを使っても大差ない。
read-from-stringに渡せる2つの追加パラメータと、返り値のcdrの情報が利用できるだけです。
readだとall or nothingなので。
>256
>?\x20を評価させると 32になるので、
とあるけど、これはあくまでchar型を16進表示したものだから、
16進数を10進数に変換させるには不適当。

(char-to-int (read "?\x200")) ;; XEmacs なもんで(^^;
-> 32

(read "#x200") ;; こっちが正解
-> 512
267257:02/04/17 18:52
>>265
さんくす。

>>266
> (read "#x200") ;; こっちが正解
> -> 512

これ、FSF でも 21 から使えるようになってるみたいですね。
268256,261,262:02/04/17 21:03
>>263
match-string()なんてのもあったのか。サンクス。

>>266
XEmacsは使ってないのですが、とりあえずメモっておきます。
サンクス
>>250
(current-buffer) を見て分岐する様な関数に置き換える、とか…
…何か問題が出そうで恐いけど。
自作のライブラリなら funcall すればいいけど、built-in の普通の
関数だとやっかいそうな気がするね。
まぁ、ふつう advice で切り分けるんだと思うけど。
ところで2重、3重に advice が重なると、それらの適用順とか
どうなるんだろう。前から気にはなってるが調べる気力がない。
;; それ以前に知力もない
271デフォルトの名無しさん:02/04/25 20:35
defun と defsubst の使い分けの基準はどんなとこなんでしょうか。
たぶん高速化のために inline 展開したいような関数とか、
(nth 3 list) だけなようなものに使うんだろうと思うけど、
そこそこの size のある関数で、それほど速度も要求されてなさげな
ものでも defsubst されてるのを見ると分らなくなってきました。
272デフォルトの名無しさん:02/05/07 14:01
age
273デフォルトの名無しさん:02/05/07 14:29
あのぉ、質問なんですけど、ウィンドウをスプリットするにはどうすればよろしいでしょうか?
275273:02/05/07 16:14
>>274
そのまぬあるすごいです。わぁい。
いーまっくす・りすぷでやるには、どういう関数を使ったら
よろしいですか?
276Lisp 1.5:02/05/07 17:08
>>275
split-window-vertically

M-x help-for-help k C-x 2
277273:02/05/07 17:15
>>276
できました。おぉー・・。
ありがとうございます!
へるぷクエストへいざ。では。
278デフォルトの名無しさん:02/05/26 01:49
下がってんな、下手したら落ちるんちゃうか。
>>278
UNIX板の方が盛況だね。
あっちはemacsが普段の環境って人もいるし。話も出やすいんでしょう。
280KOKUYO:02/05/30 13:53
質問!!member関数を、第2引数のリストの深いレベルまで
第1引数を探索して取り除くように拡張した関数はどうやって
作ればいいんですか?
>>280
kazu さんの「リスト遊び」を読んでみると楽しいよ
>>280
マルティは市ね
283PLUS:02/05/30 21:22
>>280
ループ判定までやろうと思うと、結構面倒そう
284名無しさん@Emacs:02/06/11 18:01
(eval-after-load "hoge"
'(progn
(fset 'old-homo
(symbol-function 'homo))
(defun homo ()
・・・・・・・・・・・)))

何てしたときに、
homoのデバッグが出来ません。

なんか方法があるの?
いってる事がよく分からん。
デバッグできないとは homo() を後から edebug しようにもできないのか?
にしても、homo() だなんて、レス付けるのも嫌な関数名にしやがって。
286Lisp 1.5:02/06/11 21:55
>>284
「homoをbreakpointに指定したのに止まらない。」
とお前は言いたいのだろう。
debugger何使ってるの? edebugでも駄目か?

287284:02/06/11 22:48
>> 285
>> 286
.emacs.el内で、homoをoverwriteして
その中でbreakpoint設定してます。
edebugです。

homo内で止まってくれないんです。


288Lisp 1.5:02/06/11 23:05
>>287
ちゃんと調べずに聞き返すけど、
edebug.elじゃなくて、debug.elってことはない?
debug.elはsymbol-functionを書き換えるから。
289名無しさん:02/06/26 11:49
誘導ポイント…ごめん、何のことかわかんないこのスレの人たち↓
LISP Scheme Part5
http://pc.2ch.net/test/read.cgi/tech/1023091882/260-
290名無しさん:02/06/26 11:50
しまた、誘導ポイント間違えた…逝ってきます。
もしEmacs Lispでlinuxが書けたら、emacs上でlinux がうごくんですよね?
>>291 ええと、実はすでにEmacsとLinuxが使ったときの感じとして
同じというか。現状で(学問的に)OSがどう定義されているのか
不勉強で知らないのですが、使った感じはOSそのものです。
Emacs上で動くアプリケーションは、ネットニュースリーダー、
WWWブラウザ、2chブラウザ、エディタ、統合開発環境など。
その他、だれかが
「これはEmacs Lispでは書けないな」とどっかでelisperに言ってしまうと、
それがどこからともなく、 comp.emacs.sources (かな)
にでて来るかもしれないというのは面白いよね。

ここらへんで、「おまえOSになりたいとコソーリ思っているのだろう!」
とEmacsを嫌いになる人もいるけど、これは考え方の違いだから
しかたないよね。

293名無しさん:02/06/26 13:18
>292 OSってーか、シェルのような気もする。
>>293 そうだよね。でも俺が言おうとしたのは、
窓口はシェルだけど、じっさいに欲しいものがあるのは
その奥にあるOSという感じで言ってみたんだけど。

OSやシェルというよりはミドルウェアのように感じる。
296名無しさん:02/06/26 16:39
elisp で、「漏れがどれくらい激しくメモリを使っているか」を調べられないのかな?
>>296 Elisp マニュアルのガベージコレクションというノード(ページ見たいなもの)
にたぶんそんな感じのものがあるとおもいます。

よしっ、今日はもう酒が入っちゃったけど、ラブアンドピースで
elispをやるか。寝言みたいなこといってすまん。
がんばってくれ。ラブアンドピースで。
300298:02/06/26 20:44
>>299 そうなんだよ、ムシャクシャしたときは、
elispハックすると不思議とおだやかな気分になるんだよな。
ってこんな雑談はしていいのだろうか。
301298:02/06/26 20:56
>>300 そうそう、そんでEmacsをどんどん進化させてみるか、みたいな。
elisp meditationか。カリスマのなせる技、か?
>> 302 いやカリスマとかなんとかより、そういう感じで
ストレス解消してる人って結構多いぞ。俺はソフトウェア
関連の職についているけど、みんななんていうか、
自分の思いどうりに開発できる俺プロジェクトみたいなの
持っている人ってけっこういるぞ。


ま、そりゃ分かる。
それで万に一つ金にでもなりゃ、ラッキーみたいな。
まぁシェアウェアにするのも一つの手かもしれないけど、
ストレス解消で書いたものでサポートまでするのめんどうだ
っていうんで、無料で配っちゃっている友だちもいるけどな。

俺はいまはベロベロに酔っ払ってすでに意識がどうなっているのかあやしいのだけど
まともじゃないかもしれないが、日本のソフトウェア界って、自慢システムみたいな
のはないのかな? いや、なんていったかなrubyの松本さんが認定されたみたいな
企画があった気がしたんだけど、傲慢ないいかただけど「そりゃそうだろうけど、
釣れるとかいう言葉を(俺は今なら別に全然平気なんだけど)使ったら
侮辱ととるすごく若い優秀な人がいるんじゃないの?」と思っちゃうんだよね。
いやちょっとアメリカにかぶれていんだけど、アメリカはなんつーか自慢したもの勝ち
みたいな感じなんだよね。別にそれが全然すごいことじゃなくても、なんていうか
あ、今回の宝くじははずれでしたみたいな感じで、どんどんどんどんやってみると
いうか、それで、その宝くじがハズレでも、みんな「ああ残念だけどハズレちゃった
ね」みたいなかんじで、「じゃもしかしたら次は当たりかもね、ガンバレヨ!」って
感じかな。そんで、俺は意識したことがないんだけど、よくよく考えてみるとRMS
つまりFSF(フリーソフトウェアファウンデーション)を創設した
リチャードストールマンが日本の偉い人に「日本に来てやってみない?」と
誘われたんだけど「僕のいるばしょは日本にはないような気がする」といったって
何か雑誌で読んだのだけど、もしかしてこれってそういう感じなのかなと、
おこがましくも感じてしまいました。

307306:02/06/26 22:13
いや、もちろんアメリカだって「そんな外れ宝クジたくさん勝ってバカじゃねーと」
という人はたくさんいるだろうけど、雰囲気として勝ったもんがちみたいな感じね。
そんでRMSみたいに「そりゃ金もたくさんありゃ面白いかもしれねーけど、
プログラミングを究めたほうがもっとおもしろいぜ!!」みたいな人もいると。
でもRMSは最近プログラミングしてんのかな?

>>307 あーごめんごめん。RMSの目標はフリーソフトウェアだったな。
しかし、そこまで視野を広げるって凄いな。
>> 308 それとそういうことをした結果として起こることを引き受ける覚悟みたいな
感じかな。
>>306
rubyのって、IPAの未踏ソフトウェア創造事業とかいうやつかな。
>> 310 そうじゃない。でもあれはあれで
金銭的に厳しいけど志があるハッカー(すごいプログラミングをする人という意味)
を最低限救済するシステムとしては、機能してるとおもうけど。
312311:02/06/27 01:14
「そうじゃない」というのは「そうだとおもうよ」という意味ね。
313名無しさん:02/06/27 14:50
ようやく customize まわりの使い方がわかった…
Emacs から C で書いた関数を呼び出したいんですが、
どのような方法があるのでしょうか?

dynamic loading というやつ(←まだ内容が良く分かってない)
以外にもやり方があるのでしょうか?
w3 と lookup が必要ですが、英辞郎 on the Web を引いてみますた。
http://www.alc.co.jp/

(defun eijiro (pattern &optional mode)
"Look up PATTERN in the online Eijiro dictionary.
MODE should be \"ej\" for English-Japaneseor
or \"je\" for Japanese-English."
(interactive (lookup-pattern-input))
(let ((cgi "http://home.alc.co.jp/db/owa/eijiro_red2")
(word-prefix "word_in=")
(mode-prefix "type_in=")
;(url)
;(hexified-pattern)
(top-margin 15))
(or mode (setq mode "ej"))
(setq hexified-pattern (url-hexify-string pattern))
(setq url (concat cgi "?" word-prefix
hexified-pattern "&" mode-prefix mode))
(w3-fetch url)
(message (concat "Looking up : " pattern ))
(set-window-point (selected-window) (point-min))
(scroll-up top-margin)))

英日/日英 自動切換えはまだです…
(やりたいという意思表示は &optional mode あたりに…)
xemacs 21.4 (patch 6) でしか確認してません。
>315 すんません、なんか let の中で変数がコメントアウトされてます。まちがい。
>>315
「自慢の.emacsを貼り付けよう」スレって知ってる?
自動切換え可能になったら是非自慢して下さい。
>>317 了解しますた。でも「マルチポスト」っておこられないかな…(怖
319英辞郎 on the Web:02/07/01 20:40
あとまわしになっちゃいましたが、↓のひとたち、ありがd
http://pc.2ch.net/test/read.cgi/tech/1004551074/317
http://pc.2ch.net/test/read.cgi/linux/1021865124/227
320名無しさん@Emacs:02/07/05 10:44
なんかネタ無いー?
7行で書けるようなネタ無いー?
関数名って半角カナとかでもいいんですね。*scratch* で遊んじゃった。
まともに役に立ちそうな使い方が思いつかないけど。

(defun ゚Д゚ () (message "ゴルァ!")) ;; ここで C-j
゚Д゚

(゚Д゚) ;; ここでもういちど C-j
"ゴルァ!"
>>321 知らんかった。

(defun ・∀・ ()
(goto-char (1- (point)))
(princ "イイ!!")
(newline))
navi2ch で使われてるシンボルを AA にしよう。
なんか役に立つ使い方無いかなー。うーーん。(←本末転倒)

ところでC言語で

#define _
for(;_;){
}

で無限ループってのがあったね。等幅フォントだと泣いている顔に見える。
>>323
入力がめんどくさい。
>>323
逆か?
327デフォルトの名無しさん:02/07/16 16:55
あげ
328デフォルトの名無しさん:02/07/17 00:03
なんだなんだ?
329デフォルトの名無しさん:02/07/18 00:00
listの中の要素数を調べる関数ってありますか?
↓現状、こういうことしているんですが。。。

(defvar alist '(("111") ("222") ("333") ("444") ("555")))
(("111") ("222") ("333") ("444") ("555"))

(let ((num 0))
(mapcar
(lambda (mem) (setq num (1+ num))) alist)
num)
5
330 :02/07/18 00:24
>>329
length
Emacs Lisp よくわからんがこんなの
(defun length (x)
(cond ((eq x ()) 0)
(t (+ 1 (length (cdr x))))))
332329:02/07/18 00:51
>>330
サンクス

Emacs21.2だと lengthは built-inになっていますけど、
実際のところどういうふうに実装されているのでしょうか?
Cで書いてるの?
Cでしょう。こんな感じで

int length(obj x)
{
int i = 0;

while (pair(x)) {
i++;
x = cdr(x);
}

return i;
}
>>332
built-in関数はCで書いてある。
引数がリストの時の処理はだいたい↓みたいな感じ。
(defun my-length (list)
(let ((num 0))
(while list
(setq num (1+ num)
list (cdr list)))
num))

>>331
それだと長いリストを渡すとstack overflowしちゃう。
elispは末尾再帰もしてくれないので、リスト処理はループに展開するのが
定石っぽい。
doってあったかな。

(do ((a alist (cdr a))
(i 0 (+ i 1))
((null a) i))
336329:02/07/18 01:28
>>333
サンクス。勉強になりますた。

関係ないけど、最近Cでも (if ... とか
variable = if(...).. とか書きたくなってしまう。(-_-)ウツダ
>>335
(require 'cl) すれば使える。
Olin Shivers: History of T
http://www.paulgraham.com/thist.html

>I asked RMS when he was implementing emacs lisp why
>it was dynamically scoped and his exact reply was that
>lexical scope was too inefficient.

やくせ
340Lisp 1.5:02/07/21 12:24
RMSがemacs lispを実装しとった時に「なんで動的scopeやねん?」と聞ーたら、
「静的scopeは非効率すぎー」とはっきり言うたよ。ほんまやよ。
341_:02/07/21 13:08
emacsでHOMEを一回押したらback-to-indent。そこでもう一回押したら行頭にいく
ってできますか?昔VisualStudioかDelphiのエディタで重宝した動きなんですけど・・・
>>341
(defun my-back-to-indentation-or-beginning-of-line ()
(interactive)
(let ((p (point)))
(back-to-indentation)
(if (= p (point))
(beginning-of-line))))
こんな感じでどう?
343Lisp 1.5:02/07/21 14:05
>>340
う〜ん「静的scopeじゃあうまくいかんのよ」くらいかな?
"window/buffer/frame local variable"なんかは動的scopeの方が親和性高いし。
>>343
うーん、そうかなあ。
(let ((var 'hoge)) (with-current-buffer buf (func var)))
とかvarがbuffer localなのを忘れてやっちまった場合、なんで挙動不審なの
か悩むことになる。

ところで、CVSをのぞいてみると、lexbindってブランチがあって、
lexical scopeもbuilt-inでできるように作業してるみたい。
345_:02/07/21 14:46
>>342
thx! またemacsがパワーアップ。どこまで逝くんだろう。。。
もっと、名前空間を功く使えれば…って思う。
buffer とかだけじゃなくて、他の物にも local な変数が欲しくなったりするし…

global の変数の方が、動的の恩恵を受けてそうな気がするな…
let で気軽に束縛して、引数みたいに使えるから。
…本当は、引数にした方が良いんだろうけど。
347真性厨:02/08/11 19:17
さあ、おまいら、存分に叩いてください。

(defun get-token ()
(defun hogehooloop (s)
(let ((ended nil))
(while (not (eobp))
(let ((c (char-befor)))
(if
(or (= ?\r c) (= ?\n c) (= ? c) (= ?\t c))
(setq ended s)
(setq s (cons c s))))
(forward-char 1))
ended)
(let ((chars (hogehooloop '()))
(and chars (getStringFromList (reverse chars)))))))
>>347
えーと…これって、 elisp なんだよね?

・内側の defun って、多分 local にならないと思う。
こう云う使い方なら、 cl の flet とかを使う方が良いんじゃないかな…

・hogehooloop では、引数の s を書き換えてるのに、返してるのは ended だね…
buffer の最後迄走査して、空白とかを除いて、 list にしてるけど…
それは普通、 token って呼ばなそう…
もしかして、 ended も while の条件だったり、返す値が違ったりしない?

・細かい事だけど、 char-befor -> char-before だと思う。

・最後の and は、 when を使う方が分かり易いんじゃないかな。

・あと、 getStringFromList って、標準の関数?
見付からなかったけど…
349真性厨:02/08/13 01:34
>>348 おまえ、まことにありがとうございますです。

はい、
×(while (not (eobp)) → ○? (while (not (or eobp ended))
ですた…。

あと、getStringFromListは、そういう関数がここにほしかったけど、
みつかりませんでした。ユーザコードでは書けなそう山車。
こういうときどう探すんですか?
C-h f ^i で出る候補のバッファで、それっぽい
キーワードでサーチしてるんですが…。
#↑キーバインド変えてますけど、デフォルトのバインドってことで.

>引数の s を書き換えてるのに、返してるのは ended だね…
これだとsをwhileの条件に使えないので、こうなりますた。
あ、sは引数だから、呼んだ側でそれをそのまま使ってやればいいのか。でも
それってあんましよろしくないような気がするのは、漏れが厨だからでしょうか。

>えーと…これって、 elisp なんだよね?
いひひひひ…。厨の糞コードの見本ですかね。。。
350 :02/08/13 01:48
>>347
普通、こういう処理をするときは、
・skip-chars-forward + buffer-substring
・looking-at + buffer-substring
などを使うのが常套手段だ。

どうでもいいけど、括弧が全然合っていないのだが。
>>349
getStringFromListに相当するのはconcatかな。
352真性厨:02/08/13 02:37
>>350,351 おまいら、はげしく感謝いたします。

>concat
そ、それだぁ! 激しくキホソの予感。鬱氏。

>・skip-chars-forward + buffer-substring
>・looking-at + buffer-substring
なるほど。こいつぁいいです。
というより、こうしない漏れがアフォなんですな。

ううむ、無理してスクラッチからこんな糞コード書いてるより、
先人のコードいじりからはじめて
こういういろんな関数と言うか、常套手段を会得した方が速いのでしょうか。

しかし、まともなのってみんなでかくてむずいんだよなぁ。
>>352
まずemacs-lisp-introを全部嫁。
解決したみたいだけど…一応返信。

>>349
> ○? (while (not (or eobp ended))
また細かいけど、 eobp は関数だから括弧が要るよ。
私も前やって失敗した…

探し物は… info 読んでからは、 M-x apropos とかだと思う。

> あ、sは引数だから、呼んだ側でそれをそのまま使ってやればいいのか。でも
> それってあんましよろしくないような気がするのは、漏れが厨だからでしょうか。
うーん… setcar とかで書き換えれば、呼んだ側からも参照出来るけど…
私も余り良くないと思う。
ended は単に t に設定して、戻り値には s をそのまま使う、とかを考えてた。
文字の判定も while の条件に含めちゃうとか。

> いひひひひ…。厨の糞コードの見本ですかね。。。
ごめん、そうじゃなくて…見慣れない関数が有ったりして、不安になっただけ。
355真性厨:02/08/15 01:26
>>353 >>354 貴様ら、私はなんといって感謝すればよいのか判りません。

なるほど、Info、これですね。
http://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp.html
(実はLinuxでもmanする人だったりする。逝ってよしか)
とにかく修行してまいります。

>> いひひひひ…。厨の糞コードの見本ですかね。。。
>ごめん、そうじゃなくて…見慣れない関数が有ったりして、
いや、事実極上の糞コードですから。


356デフォルトの名無しさん:02/08/18 03:43
red.elどうすか?
http://nicosia.is.s.u-tokyo.ac.jp/boomborg/boomborg-red-j.html
何に使うのかわからんのですが。
>>356
何に使うの?
自慢の.emacsを貼り付けよう
http://pc.2ch.net/test/read.cgi/unix/1001393679/621
http://homepage1.nifty.com/blankspace/emacs/dired.html
の一番上で書かれてる関数dired-find-alternate-fileを
dired-modeになった時に呼び出す方法が分かりません。

教えてクレヨン。。
>>359
C-h b して探せ。
いや、まだキーに割り当ててないんだけど
>>361
なら割り当てろ。
いや、これってdired-mode時にディレクトリ上で
enter押しても新しいバッファを作らないようにす
るやつみたいなんだけど、それってキーに割り当
てるんじゃなくて。。
うまく説明できないスマソ
>>363
dired-find-alternate-file って、その場でそこにある file を開くみたいだよ。
mode の切り替えとかじゃなさそうだけど。
>>364
そういうことでしたか。
dired-mode-mapをどうにかこうにかすれば
いいんですね。ありがとうございました。
>>365
でけた
emacsのファイルをxyzzy形式にコンバートするツールないかな
>>367
elispライブラリを誰か作ってたような
>>368
うん。標準のはあるんだけど、それ以外をコンバートしたい。
>>369
いや、elispにあってxyzzyにない関数を追加するとか、動作の違いを吸収する
とか、そういうやつ。
yatexの移植か何かで作ってたんじゃなかったかな。
emacslisp.org が乗っ取られた

http://emacslisp.org/
>>370
ども。xyzzy関係のリンクにEmacs lisp 移植キットというのがありました。
ttp://members.tripod.co.jp/osuneko/xyzzy/xyzzy.html
これはelisp独自関数をxyzzyで書き直したもので、これを読み込んでも
elispのファイルが素で動くものではないみたいです。
これを元にちょっとじたばたしてみたいと思います。
373デフォルトの名無しさん:02/09/16 12:29
age
374デフォルトの名無しさん:02/09/18 11:24
お<age>さん
>>359-366
emacs21 なら a に bind されてるようですが?
emacs-lisp限定となると、unix板とかの方が食いつき良いかもね。
MobileGearのPocketBSDでメモリに制限があるため軽いnemacs使ってます。
これは、emacs18.55.1でelispの関数が今のとちょっと(だいぶ?)
違います。そこで、elファイルを書くのに、help functionで検索
しなければならず、大変です。どっかに、elisp18、19、20あたりの
対照表などありませんでしょうか。

時間の掛かる事を background でさせたくて、色々考えてたんだけど…
emacs --batch --no-site-file でもう一つ起動してみたら、意外に重くなかった。
w3m-antenna 風の関数で使ってみたけど、結構便利かも。
>>378
お手軽マルチスレッドだね。
もうちょっと、詳しく解説してくれると嬉しいです。
>>379
させたい処理を prin1-to-string して、 emacs --eval の引数にしてみただけ…
結果は、適当な symbol で始まる list を print して、呼んだ方が read してる。
load-path は呼ぶ時の値で設定して、 coding は binary で逃げた。
通信が print しか思い付かなかったし、あんまり凄い事はできなそう…
381デフォルトの名無しさん:02/10/10 02:36
ここもこれ実行してみる!
http://pc.2ch.net/test/read.cgi/unix/1032611750/170-
(defun display-state ()
(interactive)
(let ((buf (get-buffer-create "*display state*"))
(list (buffer-list)))
(display-buffer buf)
(save-excursion
(set-buffer buf)
(erase-buffer)
(insert (format "バッファの合計数: %d\n" (length list)))
(insert (format "バッファの合計サイズ: %d\n"
(apply '+
(mapcar (lambda (x) (set-buffer x) (buffer-size))
list))))
(insert (format "読み込んでる elisp 数: %d\n" (length features))))))
C-xh
C-uM-|
perl -pe 's/^/\t/g'
とかやってるんですけど、
これを一つ動作でやる関数はどうコーディングすればいいでしょうか?
Mx lines-to-perl<ENTER>
s/^/\t/g<ENTER>
みたいにしたいっす。
>>382
そのまま、 shell-command-on-region で perl を呼べばいいんじゃないかな。
start と end は (point-min) と (point-max) だろうし。
command は… (interactive "s") あたりで渡したいのを取って、
"perl -pe '%s'" に format するとか。
output-buffer と replace は t でいいかな。

詳しくは、 simple.el にある定義とか elisp の info とかを参照。
あるelispをデバッグしたいのですが、どのようにすればいいでしょう。
例えば、現在カーソル付近にある文字列を読み取り外部スクリプトに
渡しているようなコマンドなのですが、
Symbol's value as variable is void:
というエラーがでますので、デバッグしたいのです。
>>384 M-x toggle-debug-on-error
>>384
あやしい関数の defun のとこで
edebug-defun する、とか。
387デフォルトの名無しさん:02/10/15 14:39
[質問]

(run-at-time 3 nil 'info)

これを *scratch* で eval すると3秒後に info が
起動しますが、そこで d を押すと一度目はエラーに
なってその後 d を押してもエラーにならないのですが。
一度目のエラーは回避できますか?

エラーの原因は *scratch* では d は self-insert-char で、
info に切り替わっているのに、 self-insert-char を実行しようとして
このinfoバッファはread-only ですよと起こられるようです。

前の人の質問がまだ解決してないようですけど、簡単な質問させて下さい。
elispとLispとどの程度共通性がありますか。何か、大学でLispの授業が
あるんだけど、一応自分でかなりelispは作ってきたから、かなり共通な
らとってみようかと。
その授業schemeじゃなくて?
Common Lispで自然言語処理とかです。
かなり書いてきている人間のする質問じゃないぞ。
elispのマニュアルの最初の方読めよ。
社会人だけど大学の授業で Lisp とか Scheme とかやるなら忍びこんで受けて
みたいな…
1年生の夏休みの集中講義で今は亡き中西先生のLispの講義受けますた。
かたぎの人生を踏み外した気もしますが、後悔はしていません。
394デフォルトの名無しさん:02/10/18 19:25
講義って何やるの?
395デフォルトの名無しさん:02/11/03 15:25
age
ウチの大学では scheme のインタプリタを scheme で作成とか
scheme のコンパイラを作成とかやりました。
でもこれは講義というより実習かな。
397デフォルトの名無しさん:02/11/03 20:54
(setq hoge (append '(x y) hoge))を
(macro hoge x y)ってできる
マクロとかってありますか?
(defmacro foo (var &rest list)
`(setq ,var (append ',list ,var)))
399デフォルトの名無しさん:02/11/16 04:47
age
hoshe
401デフォルトの名無しさん:02/11/22 15:37
hoshp?
t
>>393 >>396 いいなー。漏れにもなにか講義してくれ。
404デフォルトの名無しさん:02/11/22 18:10
質問させて下さい。

(defun navi2ch-article-link-ml-change-period (mlname)
(let ((point 0))
(if (setq point (string-match "\\." mlname))
(navi2ch-article-link-ml-change-period
(concat (substring mlname 0 point)
"-"
(substring mlname (1+ point)))))))

として、(navi2ch-article-link-ml-change-period "mona.giko-foo.bar")
などと呼び出した場合、mona-giko-foo-bar という形で返ってきてほしい
のですが、実際には nil が戻ってきてうまくいきません。
最後に評価されている (setq point (string-match "\\." mlname)) が
nil になっているからだ、という事はわかるのですが、どうすればスマート
に書けるでしょうか?
まだ Lisp の形式になれないのか、混乱してばかりでして…
>>404
falseの時にmlname自身を返せばいいんじゃない?
あと、let使ってるからsetqは不用、navi2ch〜は、
↓みたいに残りの部分だけに適用するだけでいいと思う。
間違ってたらスマソ
(defun navi2ch-article-link-ml-change-period (mlname)
 (let ((point (string-match "\\." mlname)))
  (if point
    (concat (substring mlname 0 point) "-"
     (navi2ch-article-link-ml-change-period
      (substring mlname (1+ point))))
    mlname)))
(defun navi2ch-article-link-ml-change-period (mlname)
(let ((point 0))
(if (setq point (string-match "\\." mlname))
(navi2ch-article-link-ml-change-period
(concat (substring mlname 0 point)
"-"
(substring mlname (1+ point))))
mlname)))
でいーんじゃないのか? if の condition 部分が nil のとき
(= 再帰の終わり)で値を返しましょう.
407406:02/11/22 18:24
>>405 うぉ,ケコーン!!しかも漏れのがヘタレな解答をしてしまった….
そこで,ちょっと知恵を絞ってみた↓.
(defun foo (mlname)
(mapconcat (lambda (e) e) (split-string mlname "\\.") "-"))
navi2ch をロードしてる時に使えりゃいいなら
(navi2ch-replace-string "\\." "-" mlname t)
でいいんじゃないの?
409デフォルトの名無しさん:02/11/22 19:14
"\\."ってなに?
何が聞きたいんだ?バッックスラッシュが二つある理由か?
それとも正規表現としての意味か?
>409
ただの文字列だけど。
\を2回書いているのは、本来のエスケープシーケンス文字の意味で
使われる\を、文字'\'そのものとして表すため。
(これはC言語の文字列と同じ)
文字列の内部表現は\.

さらに、この文字列はstring-matchへ正規表現文字列として
渡されるので、\はメタ文字に対するエスケープ文字と解釈される。
よって、string-matchにはただの文字ピリオド'.'を渡した事になる。
先生!! M-x search-forward-regexp したときは \.で良いのは何故でつか!!
エスケープすればいいだけだから
414デフォルトの名無しさん:02/11/22 20:04
おお!すばらしいです!
>>405-408 さん、どうもありがとうございます。特に >>407 には感動しました。
mapconcat なんてのがありましたか。

実はですね、UNIX 板のキチガイスレにこんなのがありまして、
http://pc.2ch.net/test/read.cgi/unix/1037490849/89
[linux-users:90000] なんてのを、リンクにしてくれるものなんです。
ですが、[Momonga-users.ja:00002] などというのは、途中にピリオドがある
ため、元のコードじゃ使えないので、ちょっと改造しようと思いまして。
これで一応、使えるようになったかなと思いきや。別の問題が。
415404:02/11/22 20:04
>>414 のつづき

(defun navi2ch-article-link-ml-put-link-property ()
"ML のタグにリンク属性を付加するって関数です"
(save-excursion
(point-min)
(while (re-search-forward
"\\[\\([A-Za-z0-9_-]+\\)[ :]+\\([0-9]+\\)\\]" nil t)
(let ((url (navi2ch-article-link-ml-get-url (match-string 1)
(string-to-number (match-string 2)))))
(and url (navi2ch-article-set-link-property-subr
(match-beginning 0) (match-end 0) 'url url))))))

という部分があるのですが、該当する正規表現の部分を [A-Za-z0-9_.-] と
いう形にしてピリオドにもひっかけようと思ったのですが、

Signaling: (args-out-of-range #<buffer "*navi2ch article http://pc.2ch.net/linux/dat/1036429182.dat"> 13 14)
signal(args-out-of-range (#<buffer "*navi2ch article http://pc.2ch.net/linux/dat/1036429182.dat"> 13 14))
byte-code("..." [window-configuration err set-window-configuration signal] 3)
navi2ch-bm-select-article(nil)
call-interactively(navi2ch-bm-select-article)

と、停止してしまいます。正規表現にピリオドを含めた事がおかしいのだと
思うのですが、[] 内にある場合は問題ないですよね?
それとも、ピリオドを含めた事で、予想外の範囲までひろってるという事でしょうか?
>>413 それはちっと簡潔すぎやしないか.
Emacs に評価させる elisp コードは,Lisp パーサで解釈されてから
正規表現エンジンに渡されるので, Lisp パーサが文字列作る時に
\\ が二つ必要になる.それに対して,M-x で呼んだ時は Lisp パーサ
通らねぇで直に正規表現エンジンに渡るから \. で良いんだ.
emacsの正規表現読みにくいね。
なんだっけ、here-documentって使えなかったっけ。
418デフォルトの名無しさん:02/11/22 20:18
文字列と一緒なのがよくない。
つまようじ (・∀・)イイ!!
>>417 re-builder ツカエ。これでも嫌ならしょーがねぇ python でもツカエ。
>>415
> (defun navi2ch-article-link-ml-put-link-property ()
> "ML のタグにリンク属性を付加するって関数です"
> (save-excursion
> (point-min)
ここはたぶん (goto-char (point-min)) だろうね。

> という部分があるのですが、該当する正規表現の部分を [A-Za-z0-9_.-] と
> いう形にしてピリオドにもひっかけようと思ったのですが、
それと、navi2ch-article-link-ml-momonga-users.ja()
つーのを定義すればいいはず。 エラーは別の原因じゃない?
>422 そこのハッシュの解説読んで Emacs21 にはハッシュがあるというの
を知りますた…
正規表現を入力したらそれの文字列表現を返すようなのってないんですかね

まぁすぐ書けそうな気もしますが
425デフォルトの名無しさん:02/11/23 02:00
16進数を2進数やunsignedの10進数に変換するにはどうしたらよいでしょうか?

(let ((str-num "0xffffffff"))
(if (string-match "^0x\\(.+\\)" str-num)
(message "%s is %d." str-num
(read (concat "#x" (match-string 1 str-num))))))
"0xffffffff is -1."
[a-z]+とかはどうするの? 無限にありますよ。
( ´∀`)え?
>>424
(prin1 (read-string "re: "))
みたいな感じてこと?
>>421
うわー、まったくその通りでした。
関数名にはピリオドだめだと、勝手に決めつけてました。コロンが OK なの
は知ってましたが、ピリオドも通るんですね。

うまく動きました。ありがとうございます。
>>424
regexp-quote か?
431424:02/11/23 23:38
(prin1 (read-string "re: ")) でだいたいやりたいことができました。
こんなのあったんですね。
>>425
(string-to-int "1010" 2)
(string-to-int "ffff" 16) -> 65535
こんな事がやりたいのか?まぁ,#x とか #b とかの prefix 付きで
read しても良いわけだが….
>>432
そうです。どうもありがとうございました。
宿題を教えてほしいんですが…

(defun diff (e a)
(cond ((atom e) (cond ((eq e a) 1) (t 0)))
((eq (op e) '+)
(make-sum (diff (arg1 e) a) (diff (arg2 e) a)))
((eq (op e) '*)
(make-sum (make-prod (diff (arg1 e) a) (arg2 e))
(make-prod (arg1 e) (diff (arg2 e) a))))))

(defun op (e) (car e))
(defun arg1 (e) (cadr e))
(defun arg2 (e) (caddr e))
(defun make-sum (x y)
(cond ((eq x 0) y) ((eq y 0) x) (t (list '+ x y))))
(defun make-prod (x y)
(cond ((eq x 0) 0) ((eq y 0) 0)
((eq x 1) y) ((eq y 1) x) (t (list '* x y))))

で、-,/,sin,cos,tan,exp,logなどを含む式も微分できるようにdiffを変更して
(* (exp (- x)) (sin (* 2 (* pi x))))を微分せよって問題です。

なんかうまく答えが出てくれなくて・・
435デフォルトの名無しさん:02/11/25 18:42
((eq (op e) 'sin) (make-prod (list 'cos e) (diff e))
(if A B)
(when A B)
(and A B)
どれが好き?
ifでお願いします。
短いのなら if で、長いのなら when で…かな。
and でやるのはちょっと変則的な気がして、あんまり好きじゃない。
(if A (progn B C)) は (when A B C)
(if A (if B C)) は (if (and A B) C)
で書くかな。
書いてる時の気分によるところが最も大きいような気もするけど。
(and A B C)
>>435 お主もワルよのぅ。漏れも人のためにならないこと大好き。ケケケ。
((eq (op exp) 'sin)
(make-product (diff (arg1 exp) var) (list 'cos (arg1 exp))))
((eq (op exp) 'cos)
(list '- (make-product (diff (arg1 exp) var) (list 'sin (arg1 exp)))))
else 部が無いやつは when で書きたい。(if cond then) ってなんか嫌。
(if cond (prog A B C)) はすげー嫌。完全に個人的な趣味だが。
443434:02/11/26 02:20
。・゚・(ノД`)・゚・。
444デフォルトの名無しさん:02/11/26 11:25
((eq (op e) 'exp)
(make-product e (diff (arg1 e) a)))
で,最近ネタ不足なわけだが,>>434 よ,調子はどーよ?
446デフォルトの名無しさん:02/11/27 19:30
return も break もないのが不便で仕方ありません。
何とかごまかす方法は無いでしょうか。
returnとかreturn-fromとか。
まずは catch throw で、cl はもっと後でもいいんじゃないかな。
449デフォルトの名無しさん:02/11/28 11:00
再帰で書け
とあたり前の結論が出た所で、
(defmacro def (name args &rest body)
`(defun ,name ,args (catch 'RETURN ,@body)))
(defmacro return (exp) `(throw 'RETURN ,exp))
(def f (a) (return (+ a 15))
おら。すでに Lisp じゃねー気もするが。
returnやbreakがないなんて言ってる椰子は
まずmacroを覚えれ
ねた切れ sage
453デフォルトの名無しさん:02/12/04 17:21
ネタ振り.S 式で書いて HTML に変換しよーとしたんだが,なんかイマイチ.
----BEGIN BASE64----(sexp2html.el.gz)
H4sICMq57T0CA3NleHAyaHRtbC5lbACdVcFu00AQPTdfMd1Ldw+OVbigpM0Fcaio
EIfcKIeNPY0tvLZrr0n9P77xASBx4FrR7+AzkJhZJ47tNqWQSLF3Zt7b93bGznwO
H77fNc3P3x8n8znIEu0NhNpqOJGzyJqEo0fAH1qjDvdrCtjYJgjivV4jLPleqEHe
IBERjc09vKnizyBeZ6nF1HrLOkcBs6BdgrB4a33ebw5BpAuScV7Za+/Vo4SpNshU
eV3E68j2eRJtVqEWSvV1r7KwHtBEpyCWF8vLNwP6WVQMqnIQJd7m3oJ1QalNnuDx
8UhR1TshXicx/WgQbHrm+5vNZlrrKMumQWZ8AeLy4t1boUhoXNrTAVcLdokXhxIv
B85ajVFlzHQ6fcKKakHNXfOl+dr8+Parud82u3PHLVeTiQzxukrB6rW3KG0Rp2uQ
tFBUW612gbI2qyzxXBdc8pT490hLrXUoSEpLSINmhQXsAl1pzm32XEclJybkJ05L
LKiNZxwWLmR0HuiCSlxnQaKaOFuSeh6ClJ+w3mRFmAOqDs+5QBMPfWXfDNWIc8Hn
cUQkUrbhx7FXQgCguyrlIABjneAvrlLuydCUToMoK/a2EiReuYuynfYkjlgASJ3n
SQ0n241lEG7zisHwUNmZhqjA63NWuCUllQsxqifuYUCc+Xrh3O/k9iZA2gLRqeWD
ZZyUrDatkgRcjoTazLT37Vb7A3Sm2sxI8yje35GNDth4xPO/YP6Fr5uNB7CdR67q
ZrYr4pcfT6Aiz/0xHW1wGNxDdl1/LnZV8OO7q3qk+6OZ7nnrDeQW/MTxUNb+1x6L
Hv8mwhQOGHG7uj8NcK9goJclzLJE7R828QyxBzX6T4p0zO2DO/kDTW9JqeYGAAA=

----END BASE64----
どうせなら AllegroServe 互換に汁 !!
html→S式もできないと使い道無いよ
457453:02/12/09 18:44
>>454 そんなのがあったのか…知りませんでした。こーゆうのに合わせるべきか?
>>455 なにそれ?
>>456 すまぬ。漏れは「S 式だとインデントが楽」とか「ページ内の
H[1-5] タグを検索してインデックス作成」くらいしか考えてなかった。

つまらんネタを振って申し訳ない。逝ってきます。
458デフォルトの名無しさん:02/12/09 23:34
保守 age
459デフォルトの名無しさん:02/12/21 00:15
(setq animals '(("giraffe" . (a1 a2))
("gazelle" . (b1 b2))
("lion" . (c1 c2))
("tiger" . (d1 d2))))

上のlistから
("giraffe" "gazelle" "lion" "tiger")
なlistを作りたいので

(defun print-elements-of-list (list)
(let (q)
(while list
(setq q (append (caar list) q))
(setq list (cdr list)))
(print q)))

としましたが、
(116 105 103 101 114 108 105 111 110 103 97 122
101 108 108 101 103 105 114 97 102 102 101)
となってしまいます。

どうすれば良いですか?
>>459
(mapcar #'car animals)
>>460
function で quote してるのはなんで?
462459:02/12/21 01:00
>>460

ぐっ、勉強不足でした。
ありがとう。
>>461
便乗質問、しつれいします。

(mapcar (lambda () (hogehoge)) foobar))
(mapcar '(lambda () (hogehoge)) foobar))
(mapcar #'(lambda () (hogehoge)) foobar))
(mapcar (function (lambda () (hogehoge))) foobar))

これらはどう違うんでしょうか? (3番目と4番目は同じ?)
ふつーはどうすべきなんだろう?
>>463
2番目以外は全部同じ。バイトコンパイルしないなら2番目も同じ。
普段は1番目でいいんじゃない?
わーぉ、
lambda → (function (lambda ...

マクロだった・・・

((lambda (x) (* x x)) 10)
('(lambda (x) (* x x)) 10)
(#'(lambda (x) (* x x)) 10)
((function (lambda (x) (* x x))) 10)
467デフォルトの名無しさん:02/12/22 02:15
call-process で起動するprocessの引数にダブルクォーテーションも
含めて文字列を渡したい時どうすればよいですか?

(call-process "c:/usr/local/bin/foo.exe"
nil nil nil "hoge hage")

これだと
$> c:/usr/local/bin/foo.exe hoge hage
になってしまいますよね
$> c:/usr/local/bin/foo.exe "hoge hage"
にしたいんです。

"\"hoge hage\"" "\\"hoge hage\\"" とかやってみましたが
上手くいきませんでした。
>>467
> "\"hoge hage\"" "\\"hoge hage\\"" とかやってみましたが
前者で渡るはず。
上手くいかないのはfoo.exeのせいじゃないのかな?

> これだと
> $> c:/usr/local/bin/foo.exe hoge hage
> になってしまいますよね
> $> c:/usr/local/bin/foo.exe "hoge hage"
> にしたいんです。
この辺からして違ってそうなので、本当に期待している動作からして怪しいが。
#本当にそういうシェルだったら御免ね。
469デフォルトの名無しさん:02/12/22 13:50
>>468
>前者で渡るはず。
>上手くいかないのはfoo.exeのせいじゃないのかな?
やっぱ、ダメでした。

c:/usr/local/bin/foo.exe "hoge hage"
だとチャント動くので、も少し粘ってみます。


ファイルのパスの空白とか渡す時にそーゆうことするわな。
本当に期待どーりに動いてるか edebug で調べてみれ。
471デフォルトの名無しさん:02/12/22 16:52
>>468
>>470
すまんです。
思い出しました。

$> c:/usr/local/bin/foo.exe "hoge hage"
この例からもわかるとおり、cygwin環境です。
emacsは、IMEとmouse cursorパッチを当てたNTemacsで
argument editting 拡張されているのを忘れてました.

でも、
c:/usr/local/foo.exe /t hoge.txt "bar boo"
と指定は出来無そうだ。

お騒がせしました。
472468:02/12/22 18:21
>>467,471
とりあえずこれが間違ってるな。
> call-process で起動するprocessの引数にダブルクォーテーションも
> 含めて文字列を渡したい時どうすればよいですか?
含めたいのは引用符じゃなくて空白なわけね。
473デフォルトの名無しさん:02/12/22 19:11
>>472
いいえ、
スペースを含んだ文字列を引用符で囲ったものを
引数に指定したいんです。
>>473
スペースを含んでる文字列は引用符で囲って渡されるんじゃないの。
>>471
> c:/usr/local/foo.exe /t hoge.txt "bar boo"
> と指定は出来無そうだ。
え?何でできないの?
(call-process "c:/usr/local/bin/foo.exe"
nil nil nil "hoge hage")

でいいんじゃないの?
確かスペースがどうのとか考えなくてもよかった気がする
477デフォルトの名無しさん:02/12/23 00:34
>>474
>>475
>>476
IMEパッチでは、argument editting拡張されていて
引数の渡し方が、色々操作できるんです。
(mw32misc.el参照)

バニラNTEmacsでは、それでOKなんですが、
IMEパッチ適用でdefaultの挙動が変わってしまってます。

それで、
define-process-argument-editing
を色々いじってるんですが、上手くいきません。

質問を変えると、
バニラNTEmacsと同じ挙動をさせるには,
define-process-argument-editing
をどのように指定したらよいか教えてください。

#板違いかな
ifでお願いします。


ひ  ろ  ゆ  き  必  死  に  な  っ  て  る  な  w

 マ ス ゴ ミ の 報 道 に な ん て 反 応 し な い で 

無 視 し と け
無理
もともとかなりのヘタレだから
481IP記録実験:03/01/09 01:38
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。

27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?

38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。

73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
記念真紀子たん(゚∀゚)
言 い た い こ と も 
      言 え な い こ ん な イ ン タ ー ネ ッ ト じ ゃ
暴力団に殺人依頼した。管理人を入廷時に射殺する
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 138720人 発行日:2003/1/9

年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。

そんなわけで、年末に予告したIP記録ですが実験を開始しています。

「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
>>158
同意だね。
リスクなんか気にするような奴は負け犬だね。
>>551
「コテハン戦隊ラウンジャー」に鑑定依頼してきますた
釣りのセンスないからやめたほうがいいすよ>>182

つまらないので寝ます。


<血液型A型の一般的な特徴>(見せかけの優しさ・もっともらしさ(偽善)に騙されるな!)
●とにかく気が小さい(神経質、臆病、二言目には「世間」、了見が狭い)
●他人に異常に干渉する(しかも好戦的・ファイト満々でキモイ)
●自尊心が異常に強く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようとする
(ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際にはたいてい、内面的・実質的に負けている)
●「常識、常識」と口うるさいが、実はA型の常識はピントがズレまくっている(日本の常識は世界の非常識)
●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者に弱く、弱い者には強い)
●あら探しだけは名人級(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす)
●基本的に悲観主義でマイナス思考に支配されているため、性格がうっとうしい(根暗)
●一人では何もできない(群れでしか行動できないヘタレ)
●少数派の異質、異文化を排斥する(差別主義者、狭量)
●集団によるいじめのパイオニア&天才(陰湿&陰険)
●悪口、陰口が大好き(A型が3人寄れば他人の悪口、裏表が激しい)
●他人からどう見られているか、体裁をいつも気にしている(「世間体命」、「〜みたい」とよく言う)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度も言う、知障)
●表面上意気投合しているようでも、腹は各自バラバラで融通が利かず、頑固(本当は個性・アク強い)
●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う)
●自ら好んでストイックな生活をし、ストレスを溜めておきながら、他人に猛烈に嫉妬する(不合理な馬鹿)
●執念深く、粘着でしつこい(「一生恨みます」タイプ)
●自分に甘く他人に厳しい(自分のことは棚に上げてまず他人を責める。しかも冷酷)
●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(他人をけなして相対的に自分の立場を引き上げようとする等)


それと、O♀はエコヒイキきつくて、冷酷だからな。

A♂の異質排除×O♀の冷酷=差別・いじめ とあいなる。
>>463
電2とは何かな?
たしかに2ちゃんでは知るかボケとか逝ってよしとかハァ?とか一言レス
で書いたりするが、それはIPが取られてないからじゃない
Z武スレももう終わりか
保守
《一覧表》

ヾ(=・ω・)ゞゲリーな文系女 ◆/OQtXsetN.
あうあう ◆/OQtXsetN.
Dumm.com ◆/OQtXsetN.
オバハンコテ ◆/OQtXsetN.
馬鹿も風邪を引く ◆/OQtXsetN.
下痢女@ゲリ〜@携帯

通称ゲリーさんです。
私が腐れ30男さんのスレから拉致しました。
批判要望・電2板によくいらっさいます。

住人じゃない人も知っている事を書き込んで、楽しいでふか?粘着くん。
串揚げ
ただ内部告発的なカキコも減ってしまう気もするんだが・・・
>>722
今のうちに親戚回りしておきな。
今回の件で言論の自由さえも脅かされることになるかも
誰も何も言えない時代が来そうな伊予柑
匿名掲示板の意味を履き違えてる人が多くて萎える。
では、お言葉に甘えまして。

削除系の板は今までも(恐らくリモホ表示以前から)
SETTING.TXTの設定でIPを記録していましたが、何か?
これはイヤですね
すいません、emacs-18.55.1使ってるんですけど、
encode-timeやらdecode-timeやらがありません。
この環境で、現在日付を求める関数とかって作れますか?
いや、標準で入ってるcalendarとかは、ちゃんと表示できてるわけで、
スキルさえあればできるんでしょうけど、
ソース見ても全然分かりませんでした。。
504503:03/01/11 10:11
ああ、ちょっと18にも(current-time-string)っていう関数があるんですね。
これの部分文字列使えば日付とか使えそうです。…
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
やべえ。俺は消されちまう。
怖いのは警察ではないぞ。
何でここに貼るのか分からん
とりあえず、最速1,000祭りデモするか・・・・
lispでファイルテストってどうやってやるんでしょう?
perlとかだと「-e ファイル名」とかって調べられるんですけど。
そのファイルが既に存在しているかどうか、を調べたいんです。

>1 :ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ :03/01/08 17:13 ID:???
>そんなわけで、qbサーバでIPの記録実験をはじめましたー。

IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/l20

IP記録実験PART2
http://qb.2ch.net/test/read.cgi/accuse/1042020193/l20

これまでのあらすじは あたりに誰かお願い。
まさか、ポリタンが立てるとは…


                   ちょっと面白いので好。
>>509
file-exists-p ってえのがあるけど。
513509:03/01/11 12:56
>>512
それだ。それでした。やってみたら大当たりッス。
サンクスコ。ありがとう。
sports3鯖死んでる??
国内サッカー板が見れない…
ていうか、ここでどーこー言ってる連中は、他を見たり書き込んだりせんのかw

さ〜よな〜ら、大好きな2ちゃん〜♪

 
いや、俺のIP記録してもいいけど字汚いから読めないかもよ。
今日なんにも知らない友達に
2ちゃんねるって知ってる?
とか聞かれた。絶対テレビの影響で人増えるな・・・
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。

二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm

ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。
520ふわふわ名無しさん:03/01/12 12:45
>>509
Emacs Lisp なら file-exists-p 。
Common Lisp だったら probe-file だったかな。
岡田克彦ファンクラブからのご案内です。岡田克彦氏の卒業した早稲田大学
政治経済学部に比べて著しい低学歴、特に、ひろゆきの卒業した中央大学文学部
のようなヘボい大学に共通しているのは、文化水準が低いという事です。18歳から22歳を
ヘボい大学で過ごすということは、致命傷と言えます。2ちゃんねらーの大半は
岡田克彦氏に比べて、著しい低学歴ですから、取り返しはつかないのです。
せめて、http://www.geocities.co.jp/MusicHall-Horn/1091/で、氏の作品に触れましょう。
Internet Service Providerが契約者に対し
顧客情報の開示を行うことを明らかにするだけだ。
責任は書き込んだ奴が取るだけ。
最近カール★さん見ない・・・
524山崎渉:03/01/13 18:43
(^^)
法律>>>>>>>>>>>>>超えられない壁>>>>>>>>>>>ローカルルール

日本にいるなら日本の法律を守りませう


なぁ、ちょっと確認したいんだが、ここはemacs-lispのスレだよな?
>>526
詳細は自治スレへ
>>526
はい。
「LISPの計算量評価はCONSの回数を問題とする」
って聞いたんだけど、何で?わからんのだけど。

これを読め!
っての知ってたら示してくれると嬉しいです。
教えてくんでスマソ
>>529
あのさ、「何で?」どころじゃなくて、
意味がつかめないんだけど。
質問の仕方ってのがあるだろ。
531山崎渉:03/01/15 17:46
(^^)
532山崎渉:03/01/23 22:24
(^^)
533デフォルトの名無しさん:03/01/29 07:56
age
>>529 ものすごく今更だが、cons すると cons セルを消費するので cons 回数を
気にするんだYO!! だから cons セルを節約するために破壊的操作 nconc, nreverse
なんてのがあるんだYO!! しかし、優秀な gc (ACL とか)を持ってる処理系なら
破壊的操作なんてしないでバリバリ cons しまくるのが真の漢。
32ビット整数を扱うためのEmacs Lispパッケージってないですか?
(let ((now (current-time)))
(+ (ash (car now) 16) (car (cdr now))))
なんてのを書いてて、整数が28ビットなのに気がつきました。
とりあえず四則演算、大小比較と、文字列との相互変換ができれば
幸せなんですが。
>535
ちょっと調べて、bignum.elとか気の利いたパッケージがあると
思ったけど整数(28bit)と浮動小数点数しかないみたいね。
http://list-archive.xemacs.org/xemacs-beta/200105/msg00205.html
こういうモジュール組みこむしかないのかな。
537デフォルトの名無しさん:03/02/02 02:17
今さらながら cl のマクロ使ってみた。
flet とか dolist とか、すごいね。便利。
他に dotimes、lexical-let、case、push、pop
ぐらいしかみてないんだけど、おすすめマクロ
とかあったら、おせーて下さい。
538535:03/02/02 07:25
>>536
サンクスコ。
ttp://list-archive.xemacs.org/xemacs-beta/200105/msg00205.html
漏れはちゃんと理解できないけど、何やら難しそうですね。
とりあえずこんななんちゃってコードでごまかしました。
つまり整数でなく常に浮動小数点数を使うということで。

(defun my-number-to-string (n)
(let ((str (number-to-string n)))
(cond
((string-match "\\.[0-9]+" str)
(substring str 0 (match-beginning 0)))
(t
str))))
(defun my-string-to-number (str)
(string-to-number (concat str ".0")))
...
(let (now (current-time))
(+ (* 1.0 (expt 2 16) (car now)) (car (cdr now))))
>>537
multiple-value-bind や destructuring-bind はどうでしょうか?

(multiple-value-bind (a b) (values 1 2)
 (list a b))
==> (1 2)

(destructuring-bind (a b) '(1 2)
 (list a b))
==> (1 2)
540デフォルトの名無しさん:03/02/19 17:10
((1 2 3) (4 5 6))

このような整数のリストのリストに 1+ を map して

((2 3 4) (5 6 7))

を得るにはどう書きます?

>>540
こう?

(setq list '((1 2 3) (4 5 6)))
(mapcar (lambda (x)
(mapcar '1+ x))
list)
542デフォルトの名無しさん:03/02/19 18:46
(defun hoge (f x)
(if (listp x) (mapcar (lambda (x) (hoge f x)) x)
(funcall f x)))
こんな関数なかったかな?

(hoge '1+ '((1 2 3) (4 5 6)))
((2 3 4) (5 6 7))
(defun hoge (l)
(let (x)
(cond
((null l)
nil)
(t
(setq x (car l))
(cond
((integerp x)
(setq x (1+ x))
(cons x (hoge (cdr l))))
((listp x)
(cons (hoge x) (hoge (cdr l)))))))))
544デフォルトの名無しさん:03/02/19 22:09
emacs-lisp-mode, lisp-mode, scheme-mode などで、
括弧の色を変えるにはどうしたらいいでしょう?
ちょいと薄めの色にしたい。
customize
546デフォルトの名無しさん:03/02/19 22:44
(defun hoge (l)
(cond ((null l) nil)
((integerp l) (1+ l))
((listp l) (cons (hoge (car l)) (hoge (cdr l))))))
547 ソレイイ アリガトウ
549名無しさん@XEmacs:03/02/25 23:01
XEmacs 21.4 (patch 12) "Portable Code" [Lucid] (i386-debian-linux, Mule) of Mon Jan 27 2003 on eeyore
なんだけど、edebugがうごかん。

っていうか、M-x edebug-defun で、関数をinstrumenting
したのに、その関数が呼ばれたときになにもおこらん。

550デフォルトの名無しさん:03/02/26 20:19
【何処も】情報科学総合スッドレ【板違い】
http://science.2ch.net/test/read.cgi/rikei/1046173479/l50



*:□
551デフォルトの名無しさん:03/03/01 03:36
↓これと同じことをする関数って何でしたっけ?
(buffer-substring-no-properties
(save-excursion (beginning-of-line) (point)) (point))
(´-`).。oO( >>551 は point-at-bol のことを言っているのだろうか?)
553551:03/03/02 18:30
>>552
どうもありがとうございます。
本当はカレント行の文字列をゲットするつもりで書いたのですが、
書き間違ってました...。
(buffer-substring-no-properties (point-at-bol) (point-at-eol))
で実現できますけど、他にありませんでしたっけ?
>>553
それでいいんでないの?
Emacs20 だと point-at-bol, -eol がないから
>>551 みたいにしなくちゃいかんが。
555551:03/03/02 23:15
>>554
そうだったんですか。勉強になります。
>>554
line-{beginning,end}-position
一般的に mapcar()と while()はどちらが高速ですか?
while
mapcar
which
mapc
who
why?
whoops!
(w
おまえら、イイ加減にしる。
うん、イイ加減だな。
568デフォルトの名無しさん:03/03/23 22:08
mapcarはリスト作るから遅いんじゃないの
schemeでいうfor-eachが欲しいな。
mapc は emacs21 では built-in になったけど、
emacs20 や xemacs では cl だから、今のところ特にメリット無いな。

>>503
18.55 だなんて、かなりレアそうだな。
比較的メジャー(?)な nemacs でも 18.59 だから。
とりあえず末尾再帰をなんとかしてくれ
ほんと、末尾再帰最適化してくれると、いろいろ書きやすくなりそうなんだけど…
byte-opt.el あたりには、 dynamic binding だと苦しい、って書いてあるね…
(lexical-scope) とかの form を導入する idea も書いてあるけど、実現されてないみたいだし…
573デフォルトの名無しさん:03/03/27 16:44
dynamic bindingだと、末尾再帰の展開って難しいの?
bytecode.cのソース読んでみたけど、よくわからなかった
正確には「末尾呼び出し」だから dynamic bind だろうが関係無いと思うんだが
tail-call の時に dynamic binding stack が成長し続けちゃうのね。
なるほど、そういうことか
elisp イラネ
tail-call のときって、 symbol の中身はもう参照されないってことは保証できそうな気がする。
そういう symbol に印つけて、印があったら stack に積まずに破壊的に代入する…とかってできるのかな。
…そういう処理してたら、普通の関数は今より遅くなるだろうけど。

やっぱり、 lexical scoping の宣言とか使って最適化できるほうがいいんだろうな…
> tail-call のときって、 symbol の中身はもう参照されないってことは保証できそうな気がする。

自分自身への tail-call のように、単純な形の場合にしか保証できないような気がします。
メリットをデメリットがうわまわりそうです。

やっぱり lexical scoping で multi thread な emacs 希望。
(let ((foo 'outer)) outer-process ...
(let ((foo 'inner)) inner-process ...))
みたいに、最後に束縛するときって、 foo を 'outer に戻せなくてもいいよね。
一般化すると…束縛作る form の末尾の部分で、更に束縛作るとき、って感じだと思う。
outer の末尾で inner が束縛作るとき、 outer が作った束縛を、 inner が作ったように引き継いで…
重複する部分は inner のほうで上書きするようにすると、相互再帰くらいならできそうな気がする。
…やっぱり demerit 大きいかな…

あ、私も multi-thread ほしい…
でも、 dynamic binding と multi-thread って相性悪そうだから、 lexical ができてからかな…
それとも、 obarray 差し換えとかで対応できるかな。
末尾呼び出しだと、戻る必要が無いんだから dynamic binding を
その時点での stack に上乗せするのではなく、
その時点での stack を全部一つの環境に押し込んで一つにして、
その後は、その上に積んでけばよいのでわ?
581デフォルトの名無しさん:03/03/29 18:53
いまいち問題が理解できないや。

(define (ack m n)
 (cond ((zero? m) (+ n 1))
  ((zero? n) (ack (- m 1) 1)) ;※a
  (else (ack (- m 1) (ack m (- n 1)))))) ;※b

schemeでは、aとbの最後のackは末尾再帰になるんだけど、
これがdynamic-bindだと、どういう問題が出るの?
>581
その場合は関係無い
(let ((a b)) (f))でfのなかでaを評価する時が問題になるんだよね?
584デフォルトの名無しさん:03/03/29 20:21
最近 Emacs Lisp を使い始めた者ですが、

(defun foo (func)
 (funcall func))

(defun bar (func)
 (foo #'(lambda () (print "bar") (funcall func))))

(defun test ()
 (bar #'(lambda () (print "test"))))

> (test)
"bar"
"bar"
"bar"
:

上記のような関数が foo 内で無限ループして、
"Lisp nesting exceeds max-lisp-eval-depth"
というエラーになってしまいます。
foo の仮引数 func と bar の仮引数 func を別の名前に
変更すれば期待通りに動作します。
しかし、foo がライブラリ関数で、bar がユーザの関数で
あるような場合、ユーザがたまたま func という変数を使っ
てしまうと無限ループしてしまいます。
ライブラリ関数として高階関数を使う場面は多いと思うの
ですが、このような状況をどのように回避したらよいので
しょうか?
ちなみに Common Lisp では上記のような現象は起こりません。
>584
それこそ dynamic binding の長所であり短所
586584:03/03/29 21:07
Common Lisp も Emacs Lisp も dynamic binding ですよね?
でも、 >>584 のコードを Common Lisp (ACL) で実行すると期待通り
に動作します。Emacs Lisp と Common Lisp の無名関数(lambda)内の
binding の仕方が違うということでしょうか。

となると Emacs Lisp では高階関数をまともに使えないような気が
しますが、そういうもんなのでしょうか?
>>586
Common Lisp は lexical scoping だったと思うけどな。
elisp には Common Lisp っぽいことのための cl っていう package があって…
その中に lexical-let っていう、そんなときのための macro があるし。

無名関数に限らず、関数内での symbol の bind のされかたが違うの。
だから、外部から参照する symbol は、名前が被らないように気をつけなきゃいけない。
my-bar-func みたいに、 package 名で prefix したり、少し説明的な名前にしたり。
それが >>585 も云ってる、 dynamic binding の短所。
>>581-583
問題になってるのは、 let とかで bind してる場合、でいいんだよね。

(defun foo (x)
(let ((bar (cons x bar)))
(if (> x 0) (foo (- x 1))
bar)))))

(defvar bar nil)

みたいなとき、 foo が呼ばれるたびに bar が stack に積まれてっちゃう、っていう。
>>588
え、マジで?
barはletで書き換わるけど、それはlet有効範囲内での話で、
fooから戻ったらdefvarのbarはnilのままじゃないの?

(foo 3) ;としたら、
=>(3 2 1 0) が返るけど、
bar
=>nil
でしょ?

>>584
をelispの規則でtestを基点にインライン展開したら、
どうなるんだろう。
#'(lambda〜の中のfuncはシンボル参照として
そのまま残ったりするのかな。

scheme流に展開すると、破壊操作でもない限り全部展開できる。
(define (test)
 ((lambda() (print "bar") ((lambda()(print "test")]
つまり
(define (test) (print "bar")(print "test"))
>>589
それがdynamic(ry
ここで色々書くより
http://www.gnu.org/manual/elisp-manual-21-2.8/html_node/elisp_147.html
理解できるまでこのセクションを何度でも読み直すのがはやいと思われ。
>>590
どもです。
ちょっと勉強してきます。
>>589
あ…ごめん、もちろん let 有効範囲内。再帰してる間の話。
>>588 の関数で再帰してくと、 call stack の他に binding stack もあふれる、っていう例。

# …でも (foo 3) は (3 2 1 0) じゃなくて (0 1 2 3) 、と重箱の隅をつついてみる。
593584:03/03/31 18:09
>>590
ありがとうございました。
「Emacs Lisp does not have closures.」
ということで理解できました。

dynamic binding だとしても、foo の束縛(func)が bar の束縛(func)を shadow
してくれるのでは? と考えていたのですが、無名関数(lambda)はただの cons で
(つまり変数束縛をもたない)、funcall で実行されるときの束縛が利用されるということですね。

> (consp #'(lambda () (print "bar") (funcall func)))
t
>>569
(defun for-each-rec (func &rest lists)
 (cond ((null (car lists)) nil)
    (t (apply #'funcall func (mapcar #'car lists))
      (apply #'for-each-rec func (mapcar #'cdr lists)))))

(defun for-each-do (func &rest lists)
 (do ((lists lists (mapcar #'cdr lists)))
   ((null (car lists)) nil)
  (apply #'funcall func (mapcar #'car lists))))

> (for-each-do #'(lambda (x y) (print (cons x y))) '(1 2 3) '(4 5 6))
(1 . 4)
(2 . 5)
(3 . 6)
nil
(defun for-each-while (func &rest lists)
(while (car lists)
(apply func (mapcar 'car lists))
(setq lists (mapcar 'cdr lists))))

(for-each-while (lambda (x y) (print (cons x y))) '(1 2 3) '(4 5 6))
-| (1 . 4)
-| (2 . 5)
-| (3 . 6)
=> nil
もう一回 stack ネタに戻ってみていいかな…うざかったらごめん。

>>588 の foo を例にすると、 let の中で tail-call してて、呼ばれた foo も let で終わってる。
内側の let の中では、この二つの let が作る binding は、一つにまとめちゃっていいよね。 (>>579)
それで、一つにまとめると同じ symbol は隠れちゃうから、上書きしちゃっていい。
そういう最適化ができれば、たぶん少し複雑な再帰でも、 binding stack 成長させずにできそうな気がするけど…どうだろ。

関数末尾の let とかを特別視して、 tail-call のときにそういう binding をまとめられる binding として記憶しとくことと、
末尾の binding 作るときにまとめられる binding があるかどうか確認して、あればまとめることが必要になるけど。
>>596
関数も動的スコープなので
(defun bar ()
(defun foo () 'x))

(defun foo ()
(bar)
(foo))

(foo)
x
となるです。つまり、呼び出す関数セルに何が入ってるかは実行時まで
わからないので、束縛をまとめるのは難しいんじゃないかと。
>>597
それは top level environment であって、関数の動的スコープとは関係ないのでは。
>597
・ Top Level からの呼び出しは常に末尾ではない
・ 束縛をまとめるのが可能なのは末尾呼び出しの場合のみ
>>597
確かに compiler だけで実行前に最適化するのは難しいと思う。
interpreter に直接 stack 書き換えてもらう、って感じで考えてた。

compile の時点だと、末尾で呼び出しや束縛があることまではわかるよね。
compile した関数だけ最適化されればいいなら、これに専用の byte-opcode とか割り当てればいいのかも。
普通の束縛や呼び出しの代わりにそっちを使ったときだけ、 interpreter が stack 書き換えてくれるの。
これだと、それ以外の関数の実行への悪影響は、そんなに大きくならないかも。
replにコンパイラ仕込むとか
602デフォルトの名無しさん:03/04/04 23:53
↓こういう関数ってデフォルトでありますか?
(??? "\"aaa\\\\bbb\\\\ccc\"")
=> "aaa\\bbb\\ccc"
(read "\"aaa\\\\bbb\\\\ccc\"")
=> "aaa\\bbb\\ccc"
604602:03/04/05 00:41
>>603
サンクス!
emacs-lispにhere documentて無いですか?
#<<EOH

emacs-lispにhere documentて無いですか?

EOH
=>"\nemacs-lispにhere documentて無いですか?\n\n"
606山崎渉:03/04/17 15:42
(^^)
607山崎渉:03/04/20 04:22
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
608デフォルトの名無しさん:03/04/25 17:31
ホシュ
609デフォルトの名無しさん:03/05/23 02:53
バッファ編集後にアクティブマークを再設定するにはどうしたらいいんでしょう?
(transient-mark-mode t)の状態で、バッファを編集(リージョン各行頭に文字挿入など)し、繰り返し編集できるようにアクティブマークを再設定したいんですが、どうやっても色付き部分が消えてしまいます。
pc-select.elを参考にしてみたんですが、あれは編集が発生しないのでマークが消えないようなのです。
>>609 C-x C-x
ほうらわかりづらい日本語を使うとはずした答えが出てくるだろ
たぶんここよりUNIX板のemacsスレで聞いた方が的確な答えが貰えると思う。
じゃあこのスレはなんなのかというと・・・
ミニバッファで find-file してる時に C-w で直前のディレクトリを削除する
次のような関数を作りました。

(defun backward-delete-path ()
(interactive)
(backward-delete-char 1)
(while (not (eq (preceding-char) ?/))
(backward-delete-char 1)))

(define-key minibuffer-local-completion-map "\C-w" 'backward-delete-path)
(define-key minibuffer-local-map "\C-w" 'backward-delete-path)
(define-key minibuffer-local-must-match-map "\C-w" 'backward-delete-path)

で、C-w を連打すると Text is read-only と怒られてしまいます。
C-a した時に止まる場所になったらそれ以上は文字削除しないようにしたいのですが
どの部分でどのようにチェックをかけたら良いでしょうか?
(゚Д゚)bolp
615613:03/05/23 19:42
614さん、どうもです。

Find file: ~/elisp
とした場合、C-a は ~ の位置で止まるのですが
ここでは (bolp) は nil とされてしまい、
F の位置でのみ t と判断されるようです…。
614はまちがい。
1字ずつ消すんでなくて、スラッシュを検索して一気に消す方がよさそうな気も。
617613:03/05/23 20:03
うーん。どのように書けばいいか…。
へたれですいません。
>>609
別解だが、narrow-to-region して編集するのが Emacs のお作法
>>617
backward-kill-word でも使っとけ
>>618
うーん、せっかくヒントを貰っているようなんですが解りません。
narrow-to-regionで隠せばバッファを編集しても
deactivate-markを免れるのかと思いきやうまくいかず。
コマンドを実行した後にmark-activeがnilになるのは、emacs本体に
コーディングされているからね。まあ、無理矢理やってやれないことはないけど。

(setq keep-mark-active nil)
(setq deactivate-mark-hook nil)
(add-hook 'deactivate-mark-hook
(lambda () (when keep-mark-active
(setq mark-active t
keep-mark-active nil))))
(local-set-key "\C-c\C-a"
(lambda(beg end)
(interactive "r")
(save-excursion
(goto-char beg)
(while (< (point) end)
(beginning-of-line)
(insert "> ")
(next-line 1)))
(setq keep-mark-active (and transient-mark-mode mark-active))))

C-uみたいな、続いて指定されたコマンドの後にmark-activeを復活するような
コマンドを作ると少しはおもしろいかも。

ちなみにリージョン行頭に文字挿入ならC-x r tな。

>>618がいってるのは、範囲指定の編集はnarrowするのがemacsの伝統で、
これはwidenするまでそのままだからなんのコマンドでも好きなだけ同じ
範囲に適用できるってことだと思う。

ところでnarrow-regionしている間mode lineに何か表示するelispってどこかに
ないですか。
>>617
こんな感じ、ってことじゃないかな。

(defun backward-delete-path ()
(interactive)
(save-match-data
(let ((pos (point)))
(if (search-backward-regexp "/." (line-beginning-position) t)
(delete-region (match-beginning 0) pos)
(delete-region (line-beginning-position) pos)))))
622613:03/05/24 09:05
621さん、ありがとうございます!
最後の行を以下のようにして期待通りの動きになりました。

(delete-region (line-beginning-position) pos))
(insert "/"))))
623Lisp 1.5:03/05/24 11:26
>>600
言語仕様をレキシカルスコープにすればそんなことはやらなくてすむ。ただし、
buffer localな変数がないのはきついので、"環境"について拡張が必要になる。

current stack frame内slot(lexical scoped)→buffer local環境→top level環境

guile-emacsはどうなっているのだろう…

>>620
> ところでnarrow-regionしている間mode lineに何か表示するelispってどこかに
> ないですか。
%n じゃ不満?
625620:03/05/25 03:30
>>624
%n が何のことかよくわからないです。
……とmode-line-formatを見ると、ああ、なるほど。了解しました。
ありがとうございます。好みに合うよういじってみます。
>>623
全部 lexical にすると、かなり非互換な package が出そう…
global variable を default argument みたいに使って、適宣 let するっていう使いかた、手軽でいいし…
そういうののために fluid-let とか用意すると、そっちで同じ問題が出るだろうし。

環境のほうは、もうちょっと好きにいじれたら…って思う。
buffer 以外にも、いろんな状態に応じた local の環境作れたりすると楽しそう…
>>620
うおお、感謝です。
ばっちりいけました。
628山崎渉:03/05/28 12:50
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
とりあえず末尾再帰をなんとかしてくれ
保守sage
まぁ、ぼちぼちって感じ?
Cygwin&XEmacs
633デフォルトの名無しさん:03/07/06 00:39
shell-command() の後に、何か処理をしてから終了する関数があるとします。
(defun hogehoge ()
(let ((command))
(setq command (read-from-minibuffer "% "))
(shell-command command)
;; 後処理
))
ミニバッファにいる時に C-g した時は shell-command() を実行しないで
後処理だけやらせたいのですが、どのようにすればよいのでしょうか?
>>633
condition-case
635633:03/07/06 13:32
>>634
どうもありがとうございます。
いまいちスマートじゃありませんが、とりあえず出来ました。
(defun hogehoge ()
(let ((after-proc (lambda (arg) arg)))
(condition-case nil
(progn
(shell-command (read-string "% "))
(funcall after-proc t))
(quit
(funcall after-proc nil)))))
636633:03/07/07 01:54
たびたびすみません。
8進数 600 か 文字列 "600" を 10進数 384 にすることは可能でしょうか?
GNU-Emacs21.3 だと (read (concat "?\\" "600")) で一応出来ましたが、
XEmacs21.4.9 だと ↑これやると落ちてしまいます。
愚直な例
(defun oct2dec (oct)
(when (numberp oct)
(setq oct (int-to-string oct)))
(let ((cl (mapcar 'char-to-string (string-to-char-list oct)))
(dec 0))
(while cl
(setq dec (+ dec (string-to-int (car cl)))
cl (cdr cl))
(when cl
(setq dec (* 8 dec))))
dec))
>>636
string-to-number() で第2引き数を指定。
>>637,638
どうもありがとうございました。

たまに見かける、

'(info-xref ((t (:foreground "DarkGreen"))))

とかの
(:hogehoge value :hagehage val)

っていったいなんですか?

おしえてけろ。
キーワード引数
>>100
でも、「変態配置」を覚えとかないと、結局どこかで不便になる予感。
半日コーディングしてたら慣れたよ。慣れると便利だしね。
カーソルキーにkeyboard-translateを掛けるにはどうしたら良いんでしょう?
というか、キーコード番号ってどうやったら調べられるんですか?
Sigmarion3でEmacsCEを使ってるんですが、「/」の位置に[up]があるので
SKKユーザのおれには激しく辛いのです。
644デフォルトの名無しさん:03/07/14 10:22
例えば、正規表現 "^[0-2]$" に当てはまる文字列は
"0" "1" "2" ですが、この展開をしてくれる関数ってありますか?
645Lisp 1.5:03/07/14 10:48
EmacsCEでは、
(keyboard-translate 'up ?/)
が効きますかね?

>>644
"a*" とかは何を返せばよろしいの?
"" "a" "aa" ...
こんなの?
>>646
はい。無限個の文字列の集合を得たいのです。
>>647
無限個の文字列を得るためには無限のリソースが必要
無限個の文字列を表現するには無限のリソースは必要ない
>>647は別人の釣りに決まってるでしょ

ちなみに遅延ストリームを使えば無限の文字列を有限のリソースで扱える。
ダイナミックスコープでは制約もありそうだけど。
650644:03/07/14 22:19
>>647
なんか違う人が答えてる...。
そう思って "^" と "$" で括ったのですが、無理がありましたかね。
基本的に、展開したい正規表現は "^\\(hoge\\|huga\\)hoehoe$"
といった書式だと決まっているので、自分で作ればいいのかな...。
無限の文字列になる場合は、エラーを返すようにするとか。
651643:03/07/15 01:15
>>645
EmacsCEでも動きませんし、Emacs 20や21でも動きませんでした。
「'up」が整数と評価できないようですね。
>>649
遅延ストリームは無限個の表現であって無限個そのものではない
653Lisp 1.5:03/07/15 03:16
>>651
ああ、Emacsって未だに文字は整数だったね。
keyboard-translateでも整数しか扱えないや。

じゃあ無理だよ。ちまちまdefine-keyしていくしかない。
XEmacsCEつーのも、xmodmapもないだろうし:-)
654山崎 渉:03/07/15 09:46

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
655643:03/07/18 01:47
>>653
できました。
(vector 'up)ができるじゃないですか。
どっかに無変換キーの割り当て方法があったはず…とか思ったらSKKのInfoでした。
656山崎 渉:03/08/02 02:58
(^^)
657デフォルトの名無しさん:03/08/06 15:41
sql-modeで500行しか表示されない(前の方が
消えていく)のですが、これはどこで設定できる
でしょうか?
658657:03/08/06 15:41
すれ違いスマソ。
659デフォルトの名無しさん:03/08/06 20:08
文字列の置換に関してなんですけど。

perform-replace て置換の対象がバッファなんですが、変数に対して置換する
ようなのはあります?

テンポラリなバッファ作って置換後に変数にコピー・・・てやらんとダメなん
でしょうか?
>>659
replace-regexp-in-string (emacs21)
replace-in-string (xemacs)
って事?
>>660
ををを!ありがとうございます。

meadow2なのに GNU Emacs 20.3版のElisp リファレンスを見てました。
やっぱし apropos すべきでした。すんません。
662デフォルトの名無しさん:03/08/14 00:42
すみません。質問させてください。
emacsを一生使い続けるつもりで、elispを覚えたいのですが、
良質サイト、良書、などありましたらお願いします。
又、Lisp, CommonLisp, Emacs Lisp の違いというのは何でしょうか?
emacs lisp と Common Lisp を比較すると漏れが気になる部分はくらいかな.
リーダーマクロがないとかそーゆうのはおいといて.

* Common Lisp に劣るところ
- ダイナミックスコープである(クロージャが…)
- 多倍長整数がない,有理数もサポート外
- CLOS のような標準の Object 指向システムがない
- 末尾再帰の最適化ができないため,再帰より反復を使うことになる場合がある.

* いいところ
- emacs が唯一の処理系(Common Lisp は GCL,ECL,CLISP,CMUCL,Allegro,LispWorks と乱立気味)
↑ xemacs とか meadow といった亜種もあるけど
- エディタと一体なので編集系関数が充実
- 文字列処理(正規表現とか)は Common Lisp に比べてめっちゃ強力
- 便利なデバッガがついてくる(M-x edebug-defun とか)
ダイナミックスコープなのは、エディタ環境として見ればメリットも多いのでは?
>>664
動的スコープの利便性を活かす場面は、そう頻繁には現れない。
なにより最適化が難しい。
バイトコードコンパイラが末尾再帰の展開をしない原因でもある。
独自LISPは変わらずとも、バインディング規則の変換ツールを作って、
本体はさっさと静的スコープに移行しちゃった方がいいと思う。
EmacsLispのメンテナ自身が、もう動的スコープは嫌だとゲロってます。

それと、まともな整数型は欲しいね。関連してFFIが無いのも痛い。
いまだにWindowsのDLLやUNIX系のsoの様な外部モジュール関数が使えない。
タグに8bitも使ってるんだから、新しい型を定義するのは困難でも無い気がする。
RMSは何を考えているのか。どういうわけかFFIを嫌ってるらしいけど。
>>665
静的だと、最適化しやすいぶん、いじりにくくなると思う。

関数は hook と advice があればなんとかできるかもしれないけど…
静的な hook や advice ってどんな感じなんだろ…

変数は、 fill-column みたいな defvar されてるのを一時的に差し換える手段がなくなっちゃうと思う。
参照する関数全部が optional の引数を取って、そっちを優先するようにすればいいけど…
参照したい変数が増えると、定義がすごいことになるだろうし…


いっそ、 FFI 導入して、 guile も標準でつけちゃうとか…
FFIを実装するパッチを公開→うまい使い方を提示→世間に広め既成事実化→RMS折れる
とはならんか?
↑ muleみたいに
>>666
Common Lisp みたいにスペシャル変数にして (let ((*fill-colum* 80)) ...) でいいじゃないか.
個人的には CommonLisp キボンヌなんだが,rms は CommonLisp が好きじゃないらしいからなぁ…
670山崎 渉:03/08/15 15:29
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
動的スコープはfluid-letで代用できるんじゃないの?
672デフォルトの名無しさん:03/08/15 18:43
ageておこう
673デフォルトの名無しさん:03/08/16 00:46
うむ。ageておこう。
Common Lisp はよく知らないけど…
動的な束縛が共存できるなら、そんなに困らないかも。
基本的に静的で、 defvar したのは動的とか。
>>671

fluid-let はグローバル変数だけで↓とかできないよね?

(defun foo ()
(let ((x 1) (y 2))
(bar)))

(defun bar ()
(+ x y))

(foo)
3

あとグローバルと fluid-let の間のスコープに同名の変数があるとそっち見ない?
これは組んだ奴が悪いのか…
676CL 派:03/08/18 13:42
Common Lisp はできるぞぅ.

(defun f ()
(let ((msg "fubar you lose again!!"))
(declare (special msg)) ;; これないとエラー
(g)))

(defun g () (print msg))
hook を利用してゴニョゴニョってな事が
しづらくなるケースもあるかも?
678デフォルトの名無しさん:03/08/27 17:58
サブディレクトリのリストを返す関数を教えてください。
(all-subdirectories "/usr/share/emacs/") ← こんなの。
emacsのソースはどこで手に入りますか?
他にも言語がたくさんあるのに
emacsがLispを採用した理由は何ですか?
682デフォルトの名無しさん:03/08/27 18:50
>>681
OnLispにいいこと書いてあるよ
ttp://user.ecc.u-tokyo.ac.jp/~g340299/onlisp_j.pdf
>>678
directory-files
>>682

ありがとう。読んでみる。
>>683
それって、再帰では探さないんじゃないの?
normal-top-level-add-subdirs-to-load-path()で directory-files() を使って
ディレクトリを再帰的に検索していくから、参考になるかもしれない。
>>678は再帰させたいのか?
よく分からんかった。
>>686 再帰したいです。
>>685 解決しそうです、どうもありがとうございました。
688デフォルトの名無しさん:03/09/02 10:50
aproposで特定のキーワードだけエラーになることってあるんだろうか。

M-x apropos moccur として、
Wrong type argument: stringp, (("dir" default-directory (".*") dir) ("lisp"
"~/mylisp/" ("\\.el" "\\.*texi") nil))

となってしまふ。moccur以外では見たことがない。
apropos.elにもエラーメッセージに出てくるようなsexpはないし。

鬱だし脳・・・。
.emacs.elがあやしいんじゃないか。

elisp newbieなんですけど、1つお聞きしたいことがあります。

(defun dummy ()
(if (= var1 var2)
(抜けたい)
(message "different!")))

というような関数で (抜けたい)の部分に書く、C での exitのような
命令or関数はないんでしょうか?
リファレンス見ても、catch - throw 以外にジャンプの類はなさそうなのですが・・・
>>690
普通は
(defun dummy ()
(if (not (= var1 var2))
(message "different!")))
692690:03/09/04 12:25
>>691
やはり exitのようなのはないということみたいですね。
制御構造を工夫してなんとかするというのがelisp流ということですか。

cl にその手のあったような気もするけど。
(defalias 'exit 'kill-emacs)
こういうのがほしいのかとおもうた

(require 'cl)

(defun dummy (x y)
(block nil
(when (eq x y)
(return))
(message "hello")))
696690:03/09/04 16:18
>>694
これは直にemacsを落としてしまうような・・・。

>>695
ズバリそれです。
勉強になりますた。
>>695
return-from はないん
自分でマクロ書
>>697
C-h f return

Return from the block named nil.
This is equivalent to `(return-from nil RESULT)'.

dolist などでも return がつかえる。macroexpand してみよ。

(defun tiny-find-if (pred list)
(dolist (item list)
(when (funcall pred item)
(return item))))
700697:03/09/05 22:32
>>699
> This is equivalent to `(return-from nil RESULT)'.
あ、あるんだ。
return-fromじゃなくてreturnって答えてたからないのかと思った。

> dolist などでも return がつかえる。macroexpand してみよ。
親切にどうも。知ってるけどね。
だってCommonLisp (xyzzy)ユーザだし。
701699:03/09/06 06:11
>>700
なるほど、失礼した。

ところで、なんか有名どころのパッケージ(例えば wl)をみても、下のような
コードでループしているのをよく見かけるのだが、dolist をそもそも知らな
いのか、それとも、dolist を使わない思想的な理由があるのかな?非常に読
みづらくて困る。あと、find-if の類いを使えばループが不要になる部分も多い。

(let (item)
(while list
(setq item (car list))
;; 何か
(setq list (cdr list))))
>>701
clを使わない主義かもね。infoによるとclはconfilictの原因になる
ことがあるらしい。公開するパッケージで使うときには
(eval-when-compile (require 'cl)) しろと書いてある。デバッグ
がめんどくさそう。
>>701
cl を無闇に load しないって思想じゃないの?
↑と書いたけど、今見たらwlはcl使ってた
705702=704:03/09/06 07:56
704は702のことについて書いた。703スマソ
>>701
漏れはてっきり高速化のためにがんがってるんだな〜っと思って一人納得してたんだが.
dolist つかうと catch ... の分が勿体ないとか….あと cl の find とか find-if
ってこんなんじゃん.パフォーマンスが重要なパッケージでは使い難いということなん
だと思ってたけど実は勘違いだったりする?

;; cl (emacs) の find
(defun find (cl-item cl-seq &rest cl-keys)
(let ((cl-pos (apply 'position cl-item cl-seq cl-keys)))
(and cl-pos (elt cl-seq cl-pos))))

;; CMUCL の find
(defun find (item sequence &key from-end (test #'eql) test-not (start 0)
end key)
(declare (fixnum start))
(seq-dispatch sequence
(list-find* item sequence from-end test test-not start end key)
(vector-find* item sequence from-end test test-not start end key)))
末尾再帰さえあれば・・・
708700:03/09/06 15:35
>>701
俺の場合関数型言語とやらがCommonLisp on xyzzy が初めてだったので
最初のほうは dolist とか使いまくりだった。
でも最近は繰り返しは再帰で書くのがLispらしいのかなと思って dolist を
使わずに(末尾再帰でもない)変な再帰で書いてる。
厨丸出しだな俺(w。

>>706
xyzzyのfindはどうってんだろうと思ってみたら組み込みでした。。。


xyzzyって末尾再帰の最適化してんのかなぁ。。。
>>708
xyzzy は末尾再帰の最適化はしてなかったと思う.
まぁ,それとは別に, Common Lisp の場合は dolist とかを使うのが
いいと思うけどね.意図が伝わりやすいし,コンパイラにも優しい(人間は
末尾再帰のつもりでも実は違ったりするからな…).Schemer には異論が
ありそうだけど再帰オンリーよりは,繰り返し的操作には繰り返し,
再帰的な操作には再帰,といったように使い分けるのがいいと思う.
710701:03/09/07 00:50
>>706
こんなテストしてみたが、while と dolist の違いは 10% 以下。これなら
dolist を使えと主張したい。find は position と elt で、きっちり 2 倍に
なっている。再帰は...

(test-run 100 10000) のプロファイル結果。GNU Emacs 21.3.50.1

Function Name Call Count Elapsed Time Average Time
================== ========== ============ ============
test-while 10000 0.3854069999 3.854...e-05
test-dolist 10000 0.4133820000 4.133...e-05
test-find 10000 0.7938209999 7.938...e-05
test-rec 510000 696.79132100 0.0013662574
711701:03/09/07 00:53
>>710 の続き
(defun test-while (item list)
(let (target result)
(while list
(setq target (car list))
(if (eql item target)
(setq list nil
result target)
(setq list (cdr list))))
result))
(defun test-dolist (item list)
(dolist (target list)
(when (eql item target) (return target))))
(defun test-find (item list)
(find item list))
(defun test-rec (item list)
(cond ((null list) list)
((eql item (car list)) (car list))
(t (test-rec item (cdr list)))))
(defun test-generate-list (n)
(let (result)
(dotimes (i n) (push i result))
(nreverse result)))
(defun test-run (n m)
(let ((item (/ n 2)) (list (test-generate-list n)))
(dotimes (i m)
(test-while item list)
(test-dolist item list)
(test-find item list)
(test-rec item list))))
712701:03/09/07 00:55
あ、インデントずれた。
だってdolistってlispらしくないし
while と setq 使うほうがもっと Lisp らしくないじゃん。C みたい。
つまり mapc 使えと?
dolist 便利でいいじゃん。
とても lisp らしいと思うけどなぁ。Schemer の人かな?
>>711
(defun test-while (item list)
 (let (target result)
  (while
   list
   (setq target (car list))
   (if (eql item target)
    (setq list nil result target)
    (setq list (cdr list))))
  result))
(defun test-dolist (item list)
 (dolist (target list) (when (eql item target) (return target))))
(defun test-find (item list) (find item list))
(defun test-rec (item list)
 (cond
  ((null list) list)
  ((eql item (car list)) (car list))
  (t (test-rec item (cdr list)))))
(defun test-generate-list (n)
 (let (result)
  (dotimes (i n) (push i result))
  (nreverse result)))
(defun test-run (n m)
 (let ((item (/ n 2)) (list (test-generate-list n)))
  (dotimes
   (i m)
   (test-while item list)
   (test-dolist item list)
   (test-find item list)
   (test-rec item list))))
たかがくり返しの書き方ここまでこだわってしまうのが
lisper の強みでもあり弱みでもあるな。
だれが何こだわってるの?解説キボンヌ.
俺も分からん。>>718の降臨に期待
改行位置のことか?
全角空白のインデントのこと?
722718:03/09/10 23:31
lisp らしい書き方とか、らしくない書き方とか、そういう話のこと。
美しく書けることに気付くと時間をかけてでも書き直したくなるとか、
そういう誘惑が lisp にはある。
別に >>717 について言った訳じゃないよ。
723701:03/09/11 03:53
>>722
確かに。そういう罠(?)はあるね。でも、リスト処理という Lisp にとってか
なり基本的な操作で、明白にレベルの低い(汚い?)コードは萎える。例えば、
C で繰り返しが全部 goto で書かれていたらダルいよね?
繰り返しは再帰で書けということでつか?
名有り関数の定義なしでシンプルに再帰を書く方法があれば...
lambda ... を λ... にすればよりシンプルになると思う。
726701:03/09/11 19:31
>>724
> 繰り返しは再帰で書けということでつか?

違う。繰り返しを書くときは、まず mapcar, find-if などの高階関数で書け
るかどうかを検討する。書けなければ dolist, dotimes などを使う。それで
も書けなければ、while, loop, 再帰を使う。

高階関数についてはこのへんを参照。
http://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup/rakup13.html

> 名有り関数の定義なしでシンプルに再帰を書く方法があれば...

Scheme の named let が便利。
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#tips

(require 'cl)

(defmacro nlet (tag var-vals &rest body)
`(labels ((,tag ,(mapcar #'car var-vals) ,@body))
(,tag ,@(mapcar #'cadr var-vals))))

(defun fact (n)
(nlet loop ((n n) (r 1))
(if (<= n 1) r
(loop (1- n) (* n r)))))
でも nlet は末尾再帰の最適化をしない elisp にはイマイチでない?

(defun sum (n)
(nlet loop ((n n) (r 1))
(if (<= n 1) r
(loop (1- n) (+ n r)))))

(defun sum2 (n)
(do ((n n (1- n))
(a n (+ a (1- n))))
((<= n 1) a)))

(sum2 100)
=> 5050
(sum 100)
=> (error "Lisp nesting exceeds max-lisp-eval-depth")
>>727
だから elisp では再帰で繰り返しを書くのはよせと言っておろうが。

(defun sum-list (list)
(apply #'+ list))

(defun sum3 (n)
(sum-list (test-generate-list (1+ n))))
>>728 … 727 も elisp では再帰マズーと言っているように見えるのは漏れだけ?
apply とか mapcar とか
読みにくいからきらいー
まあ、世の中には読みやすい人もいるわけで。
(mapcar SEQUENCE FUNCTION)
だったら少しは読みやすかったんじゃないかと思う。
FUNCTIONが (lambda ...) のときなんかはとくに。
それじゃ mapcar* 等との整合性がなくなっちゃうし。
(defmacro 732mapcar (seq fun)
`(mapcar ,fun ,seq))

(732mapcar '(1 2 3) (lambda (x) (+ x x)))
=> (2 4 6)

読みやすいか?全然かわらん気がするけど.
マクロってのはスペシャル関数を作るためにあるって
いっていいの?
>>735
俺はそれより ``special form'' を「スペシャル関数」と訳したものをどこで見たのか気になる。
737735:03/09/15 01:00
スペシャル関数…間違えました。特別な関数というイメージがあったからつい。
ところで、elisp の info 見てみたら

"マクロ"
"マクロ"(macro)は, プログラマがLispで定義した構文である. マクロ
と関数との違いは, マクロは, 読者が書いたLisp式をもとの式のかわりに
評価される等価な式に変換する. マクロは, スペシャルフォームでできる
種類のことをLispプログラマに提供する. マクロの定義方法と使い方につ
いては, *Note Macros::.

こんな書き方してあるので、>>735 の考え方は間違いじゃなさそうですね。
構文定義
>>737
マクロが知りたいならこれを読むといいと思う。
ただ、日本語訳はいいけど、訳者の頭が変な気がする。

Paul Graham "On Lisp" Chap. 11 (out of 25) まで翻訳完了
ttp://user.ecc.u-tokyo.ac.jp/~g340299/onlisp_j.{tex,pdf}
訳はいいけど訳者の頭が変って、
その onlisp_j は ok だけど、そのサイトの文章は信用ならんって事?
これからその pdf 読んでみようかと思ってるのだが。
まぁ、ぶっちゃけそういう事だ
訳者が2chで意見を募ったときのことを指してるんだろ。
変ではないが、空気が読めないってだけ。
なるほど。該当スレ読んできた。
Lisp初心者です。
(setq a ())
(dotimes (n 5)
(setq a (cons '(lambda (x) (+ x n)) a)))
というプログラムを書きました。
a の第1要素には (lambda (x) (+ x 4)) が入っていることを期待した
のですが、そうなりません。
そうする方法はありますでしょうか?
>>744
backquote 使え。`(lambda (x) (+ x ,n)) だと、
n のとこだけ評価される。
746744:03/10/06 16:27
>>745
おお! 有難うございます。
マニュアルの該当部(逆引用符)も見付けました。
Lispは 評価するか、文字のまんまか という所が難しいですねえ。
「マクロとは何か」「何がマクロか」が分かると、やさしくなるよ。
748744:03/10/07 08:23
>>747
この場面でマクロを使うほうが良い、とまだ思い至らないんですね。
マニュアルの「逆引用符」の部分を読んで、マクロを使わないで書き直すと
(dotimes (n 5)
(setq a (cons (list 'lambda '(x) (list '+ 'x n)) a)))
ですね。この方がめんどくさいが自分では理解はしやすいです。
,@foo ってマクロ無しでは無理だよね?
>>749
いいえ
なんつーか,バッククォートとマクロがごっちゃになっていると思われ…
マクロはバッククォートを使って書かれることが多いが,

(defmacro aif (test then else)
`(let ((it ,test))
(if it ,then ,else)))

無しでも書ける.バッククォート無しでもマクロはマクロ.

(defmacro aif2 (test then else)
(list 'let (list (list 'it test))
(list 'if 'it then else)))

というわけで,用語の混乱を直しておきましょう.
753744:03/10/08 22:48
先日のアドバイスを元に
(setq a ())
(dotimes (n 5)
(setq a (cons `(lambda (x) (+ x ,n)) a)))
(funcall (car a) 10)
とやると、emacsではうまく動作するのですが、同じコードをcmucl上で行う
とエラーが出ます。
(car a) の所に#とか#'とか付けてみたのですがうまく行きません。
なぜでしょうか? 下らない質問な予感がしますが教えていただければ助かります。
CMUCL ならクロージャが使えるので↓でよい.

(setf a ())
(dotimes (n 5) (push (lambda (x) (+ x n)) a))
(funcall (car a) 10)

# もちろん,Emacs ではこれは無理.
755744:03/10/09 19:20
>>754
有難うございます、??
でも このコードをcmuclで実行すると、なんか結果が違ってるみたいです。
a の全ての要素に (lambda (x) (+ x 5)) が入ってしまうようです。
a の第1要素には (lambda (x) (+ x 4))、 第2要素には (lambda (x) (+ x 3))、...
と入るように、最初に書いたemacsで動くコードの方はなってるんですが、
cmuclでそうなるように書くにはどうすればよいのでしょうか。
>>753
ACL だとできるよ。
CL-USER(4): (funcall (car a) 10)
14
>>755
いいかげんスレ違いだが、
クロージャの場合 n を評価しないからだよ。
(mapcar #'function-lambda-expression a)
=> ((LAMBDA (X) (+ X N)) (LAMBDA (X) (+ X N)) (LAMBDA (X) (+ X N))
(LAMBDA (X) (+ X N)) (LAMBDA (X) (+ X N)))
ありゃ本当だ.
(setf a ())
(dotimes (n 5) (let ((n n)) (push (lambda (x) (+ x n)) a)))
(funcall (car a) 10)
CMUCL だとこーだな.
>>757
CMUCL の dotimes だと全てのクロージャが同じ n を参照しちゃってるから,
のほうがわかりやすくない?
>>759
そうかも。ACL でも一緒だけどね。ところで、CMUCL では
(funcall '(lambda (x) x) 1)
がエラーになるの?
CLISP では、それはエラーみたい。'(lambda ...) は関数じゃないからなー。
#'(lambda ...) とか (coerce '(lambda ...) 'function) じゃないと
だめとゆーてきますが、ACL だと大丈夫なの?
ACL だと大丈夫。Common Lisp 的にはエラーが正解なのかもしれない。
どんどん Emacs と離れていくけど、Lisp つながりだからいいか。
CMUCL でも型エラーみたいだけど、
http://www.lispworks.com/reference/HyperSpec/Body/f_funcal.htm
みてもヘタレな漏れにはよくわからん。識者の解説キボンヌ。
764744:03/10/10 14:09
みなさま有難うございます.
いろいろなヒントをいただいて大変参考になりました.コモンリスプでも
微妙に違うのも知りました.
良く分からない点もありますがもうちっと自分で勉強します.
>>764
結局 >>753 のようなことを Common Lisp でするには

(dotimes (n 5)
(push (coerce `(lambda (x) (+ x ,n)) 'function) a))

または

(dotimes (n 5)
(let ((n n))
(push (lambda (x) (+ x n)) a)))

なんだけど、下のやつは lambda が環境(変数束縛)を含むのでクロージャと呼
ばれる。elisp にはクロージャがないので下のようには書けない(上のように
は書ける)。

この辺ややこしいのでこのあたりを読んでおくとよい。
http://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup/rakup21.html

ちなみに ACL では、同じ lambda でも区別しているみたい。
上の (car a) => #<Interpreted Function (unnamed) @ #x304e3b5a>
下の (car a) => #<Interpreted Closure (unnamed) @ #x304e57c2>
Common Lisp なら

(defun adder (n) (lambda (x) (+ x n)))
(dotimes (n 5)
(push (adder n) a))

とかのほうが好み.labels でも良いけど.なぜならば,

1. 関数のほうが情報がいっぱい.関数名で足りなければ document とかも書けるし.
2. 他のところで使いまわせるかも.

という点が嬉しいから.
実はEmacs使いはみんなCommon Lispユーザなのか?!
このスレの人と LISP Scheme スレの人はかなり被っていると思われるので、
「スレ違いだろ」などと誰も言わないんじゃないだろうか?
まぁ、別に他にネタもないわけで、いいんでないか?活気があったほうがイイ。
いちおついてけてないけど、参考になるような気がしてるので
スレ違いを指摘してない。
Emacs と Common Lisp と Perl を使ってるプログラマなんだけどさー Perl スレで
順列もどきを作るプログラムが〜って話があったんだけど,実は Lisp で書いたほう
が楽な気がしてならない….タイプ数は確実に Perl のが少ないんだが…

(let ((data '((1 2 3)
(4 5 6)
(A B C))))
(labels ((iter (acc data)
(if (null data)
(print (reverse acc))
(mapcar (lambda (x)
(iter (cons x acc) (cdr data)))
(car data)))))
(iter nil data)
nil))

こういうのは二つの集合の直積として考えるのが正しいんでしょうか?
たまたま lisp 向きだっただけだろう。その前の hash への要素の追加なんて
$word = "ho==ge,fu==ga,fo==oo\n"
$data->{$_->[0]} = $_->[1] for map { [ split "=="] } split "," => $word;

(let* ((word "ho==ge,fu==ga,fo==oo\n")
(lst (split-string word "[,\n]"))
(alist (mapcar (lambda (e) (split-string e "==")) lst))
(hash (make-hash-table :test 'equal)))
(dolist (elem alist hash)
(puthash (first elem) (second elem) hash)))
じゃないか。まぁ、elisp 版は lst とか変数が冗長なんでもーちょい
短くなるだろうけど、読みにくいと思うし。
たまたま lisp 向きなネタだったからでしょ。その前に出てた hash へ
の追加なんてこんな感じで、Perl に比べてかなり冗長だ。
(let* ((word "ho==ge,fu==ga,fo==oo\n")
(hash (make-hash-table :test 'equal))
(lst (split-string word "[,\n]"))
(alist (mapcar (lambda (e) (split-string e "==")) lst)))
(dolist (elem alist hash)
(puthash (first elem) (second elem) hash)))
perl読めん……。rubyか pythonがいい。
(let* ((word "ho==ge,fu==ga,fo==oo\n")
    (lst (ppcre:split "[,\n]" word))
    (alist (mapcar (lambda (e) (ppcre:split "==" e)) lst))
    (hash (make-hash-table :test #'equal)))
  (dolist (elem alist hash)
   (setf (gethash (first elem) hash) (second elem)))))
CommonLisp だとこうだな。cl-ppcre が必要だけど。elisp から
CommonLisp に移るのは簡単だな〜。
777773=774:03/10/12 20:54
ぐわぁ。2重カキコになってる…スマソ。
778デフォルトの名無しさん:03/10/13 05:32
画面の左右に、「現在の行数と先頭からの文字数」が表示されるような
メジャーモードを作ってみたいと考えているんですが、難しそうでとっ
かかりがありません。
左右の6文字分ぐらいに
1 1 | hoge hoge fuga fuga             | 1 16
2 17 | fuwa fuwa honya honya            | 2 34
3 35 | aada kouda souda               | 3 48
と、自動的に出てくるようにしたいのですがやはり、
文字を打ち込んだり、削除したり、検索したり、という命令をすべて
書き換えないと無理ですよね?1文字打ったらたちまち左右の部分が
くずれますもんね。
たとえば特定の桁を特別扱いしてくれて、中央の部分だけが文章の本
文だとみなしてくれるようなしくみってemacsにありますか?
779デフォルトの名無しさん:03/10/13 09:01
>>778
バッファを3つ使うとか。
>>771
(defun hoge (a &rest b)
(if (null b) (mapcar 'list a)
(let ((b (apply 'hoge b)))
(apply 'append (mapcar (lambda (x) (mapcar (lambda (y) (cons x y)) b)) a)))))

(apply 'hoge '((1 2 3) (4 5 6) (A B C)))
((1 4 A) (1 4 B) (1 4 C) (1 5 A) (1 5 B) (1 5 C) (1 6 A) (1 6 B) (1 6 C) (2 4 A) (2 4 B) (2 4 C) (2 5 A) (2 5 B) (2 5 C) (2 6 A) (2 6 B) (2 6 C) (3 4 A) (3 4 B) (3 4 C) (3 5 A) (3 5 B) (3 5 C) (3 6 A) (3 6 B) (3 6 C))
>>788
右の情報は冗長でしょ。左だけでも我慢できるなら、行番号表示するヤツを参考にしては。
それか、現在行だけもモードラインに表示するか。
元々は組み合わせに対してなんらかの処理をしたいって話だったんだろ?
確かに lisp の方が冗長かもしれないけど、
(defun lispy (fn lst)
(let ((result nil))
(labels ((iter (acc lst)
(if (null lst)
(push (funcall fn (reverse acc)) result)
(mapc (lambda (x)
(iter (cons x acc) (cdr lst)))
(car lst)))))
(iter nil lst)
(nreverse result))))
こんな感じの関数を作っといて、
(lispy #'print '((1 2 3) (A B C) (X Y Z)))
とかしたほうがトリッキーなコードに比べて後々楽だと思われ。
組み合わせのリストが欲しいだけの場合は
(lispy #'identity '((1 2 3) (A B C) (X Y Z)))
で OK だし。
>>782
そのコードのほうがわかりづらくない?
組み合わせのリストを返す関数とループで書いたほうがいんじゃない?
784778:03/10/13 14:08
>>779, 781
ありがとうございます。出来れば両端に出したいんです。
行番号が出るモードってどこにありますでしょうか。
バッファを3つ使うのはよいかも知れません。スクロールを完全に
同期させる方法はありますでしょうか
不勉強ですみません
また、(set-window-margins nil 6 6)とやると左右に6文字分空く
んですが、ここにはなにも書き込めないんですかねー。
ご指摘のとおり、771 さんのコード(見落としてました…)と
(defun map-hoge (fn lsts)
(mapcar fn (apply #'hoge lsts)))
のほうがよさそうですね。ユーティリティを一回書いとけば Perl のイディオムと
同じくらいに使いまわしが効くじゃんと言いたかったのです。
>>784 両端に…デカイ画面使ってるんだな。でも6文字分のスペースじゃ、行数+先頭から
の文字数を表示するには足りねーだろう。1000 行超えたあたりでファイルを編集してた
ら繋がっちゃって激しく混乱する予感。
>>786
> デカイ画面使ってるんだな。
なら highline.el あたりで幸せになれないかな。
>>784
> また、(set-window-margins nil 6 6)とやると左右に6文字分空く
> んですが、ここにはなにも書き込めないんですかねー。
(overlay-put (make-overlay 1 2)
'before-string
(propertize "_" 'display '((margin left-margin) "test")))
でいけるけど、全行これやったら遅そう。
789785:03/10/13 22:11
よっしゃ、汚名を挽回すべく http://pc2.2ch.net/test/read.cgi/tech/1063028224/565-569 にチャレンジだ。
(defun remove-1 (elem lst)
"Common Lisp's (remove ... :count 1)"
(if (null lst)
nil
(if (eql elem (car lst))
(cdr lst)
(cons (car lst) (remove-1 elem (cdr lst))))))
(defun perm (lst)
(if (null lst)
(list nil)
(mapcan (lambda (x)
(mapcar (lambda (y) (cons x y)) (perm (remove-1 x lst))))
lst)))
(defun map_perm (fn lst)
(mapcar fn (perm lst)))
どないなもんでしょ?mapcan と mapcar の組み合わせのあたりが自分としては
(define (´∀`) 'マターリ) さん風味に仕上がったと思ってるんですが。
いや、がんがってるとは思うし、リストならそれでいいと思うんだが、
元ネタは配列なので↓かなぁとか。
(defun map-vector-perm (fn vec)
(labels ((permute (end)
(if (= end 0)
(funcall fn vec)
(dotimes (i end)
(rotatef (aref vec (1- end)) (aref vec i))
(permute (1- end))
(rotatef (aref vec (1- end)) (aref vec i))))))
(permute (length vec))))
(map-vector-perm #'print (vector 1 2 3))
まぁ、Ruby にはあんまり興味ないし、読めないから外してるかも。
cl利用コードだらけ。
792778:03/10/13 22:50
>>786 ワラ) そうすね。ただそんな大きいファイルは編集しなそう
なんです。また、「先頭からの文字数」だけ表示できればそれでも
十分です。うまくいけば、必要に応じて8文字分とかに自動的にな
るようにできれば最高ですがまだ高望みですね
>>788 このoverlayって全くしりませんでした。ちょと勉強してみま
す。ありがとうございます。
>>791 何か不満でも?…って過剰反応し過ぎかな。周囲の schemer が
反復使いすぎとか副作用使いすぎとか煽ってくるので過敏になってるのか
もしれん。
>>793
うーん、なんか lispスレでやったら?みたいな。
確かに emacs上で動くんだけど、elispスレ的でないというか。
>>789
remove-1は使わないだろうなあ。
(defun rotate-list (lst)
(do ((a lst (cdr a))
(b '() (cons (car a) b))
(r '() (cons (append a (reverse b)) r)))
((null a) (reverse r))))

(defun perm (lst)
(if (null lst) '(())
(apply #'append (mapcar (lambda (x) (mapcar (lambda (y) (cons (car x) y)) (perm (cdr x))))
(rotate-list lst)))))

(rotate-list '(1 2 3 4))
((1 2 3 4) (2 3 4 1) (3 4 1 2) (4 1 2 3))

(perm '(1 2 3 4))
((1 2 3 4) (1 2 4 3) (1 3 4 2) (1 3 2 4) (1 4 2 3) (1 4 3 2) (2 3 4 1) (2 3 1 4) (2 4 1 3) (2 4 3 1) (2 1 3 4) (2 1 4 3) (3 4 1 2) (3 4 2 1) (3 1 2 4) (3 1 4 2) (3 2 4 1) (3 2 1 4) (4 1 2 3) (4 1 3 2) (4 2 3 1) (4 2 1 3) (4 3 1 2) (4 3 2 1))
796785:03/10/14 10:34
>>790
>>795
キターーーーーーーーーーーーーーーーーーーーーーー
(remove x lst :count 1) 相当のものを作ることに頭がいってしまい
ましたが、こんな手もあるんですね。すごいなぁ。

>>794
まぁ、elisp なんだから良いではないですか。cl は emacs に
標準添付なわけで dotimes, dolist, labels くらいならまだ十分 elisp でしょう。
(dotimes (i 5)
(lexical-let (n i)
(lambda (x) (+ x n))))
とかやりはじめたら流石に移動したほうが良いかもしんないですけど…。
>>794
かなりどうでもいいんだが、navi2ch で見ているので elisp で動くコードだと
C-x C-e ですぐ評価できるのがうれしい。
(defun perm (lst)
(if (null lst) '(())
(apply #'append (mapcar (lambda (x) (rotate-list (cons (car lst) x)))
(perm (cdr lst))))))
799778:03/10/15 08:39
788さま他皆様有難うございます。なんとかとっかかり位は出来ました
overlayってあまり参考文献はないですかね... 良く分からず書いています
(propertize " " ...) の " " の部分てダミーなんでしょうか。

(defun make-both-margins ()
(interactive)
(setq left-margin-width 6)
(setq right-margin-width 6)
(set-window-margins nil 6 6))
(defun show-bilateral-letternum-of-line ()
(interactive)
(let ((a nil) (b nil))
(progn
(beginning-of-line)
(setq a (make-overlay (point) (point)))
(overlay-put a
'before-string
(propertize " " 'display `((margin left-margin)
,(concat (make-string
(- 5 (length (number-to-string (point)))) 32)
(number-to-string (point)) "|"))))
(end-of-line)
(setq b (make-overlay (point) (point)))
(overlay-put b
'before-string
(propertize " " 'display `((margin right-margin)
,(concat "|" (make-string
(- 5 (length (number-to-string (point)))) 32)
(number-to-string (point)))))))
(list a b)))
>>799
要編集だと厳しいね
>>799
> (propertize " " ...) の " " の部分てダミーなんでしょうか。
です。
info の File: elisp, Node: Display Margins より。

If you put such a display specification directly on text in the
buffer, the specified margin display appears _instead of_ that buffer
text itself. To put something in the margin _in association with_
certain buffer text without preventing or altering the display of that
text, put a `before-string' property on the text and put the display
specification on the contents of the before-string.
つーか、そーゆう行番号表示は elisp でどーにかするよりも Emacs 自体を
なんとかするのが正攻法だと思われ。実際、Windows 用の xyzzy は組み込み
で行番号表示を持ってるし。
803778:03/10/15 20:58
>>801 ありがとございます。安心しました。
>>802 いやー行番号より、先頭からの文字数を表示するというミョーなことが
したいんですよ。ほんとはスペースやリターンを数えない、読める文字だけ
をカウントしたいのです
しかしoverlayというのは面白いですね。
(overlay-put (make-overlay (point) (point)) 'after-string "+"))
とかすると+の字は消えない石みたいになりますね。どうせならウィンドウ
上で位置を固定出来ればもっと使い道がありそうですが、前の文字の挿入削
除で動いちゃうんですね。なににつかうんだろ
>>803 それはモードラインじゃ駄目なのか?…ん?カーソル位置じゃなくて
ひょっとして、各行の文字数を表示したいってことか?
805778:03/10/15 21:31
799に書いたへなちょこコードを実行して戴くと分かると思うんですが、
先頭からの文字数を、各行の左右に表示したいんです(そんなやつあま
りいませんか) 799のだと編集に応じて変化してくれないので、そこを
頑張って書いてみようとおもつています
モードラインに表示するようにすれば?
モードラインに書けばいいだけの話
>>806>>807
なに連呼してんだよw

>>778
ここで叩かれて強くなってきたほうがいいんじゃないか?
http://pc.2ch.net/test/read.cgi/unix/1063880951/
そもそも、なぜ先頭からも文字数をいくつも表示したいのか語ると話が早い。
show-paren-style → expression
としてるんだけど、>>799 だと左右のエリアまで色付いちゃうね。
別に上のコード自体は欲しいと思う featureじゃないのでどーでもいいが、
技術的な問題として、ちょっと気になるかも。
気になるなら margin に表示する部分の face を指定しましょう。
視覚的な折り返しに対してマージンを仕込む方法はあるんでしょうか?


  頭ああああああああああ尻

がウィンドウ幅で折り返されたら、

  頭ああああああああ
ああ尻

じゃなくて、

  頭ああああああああ
  ああ尻

にしたいのです。
overlay等調べてみたけど今一つできなさそう。
似たようなことをしているlibraryもないし…。
Windowsの秀丸だとできて なぜEmacsでできん、と。
妙な要求があるもんだな。
  頭ああああああああ
  ああ尻

Window 幅を広げると、

  頭ああああああああああ尻

に戻るってこと?
そりゃ無理だ。
>>812 だーかーら、そゆことは lisp の範囲ではなく C のレベルでなんとか汁。
ただな、大多数の人がその機能を不要だと思ってるわけよ。だから「なぜ?」を
説明しないと食いつき悪いと思うよ。ホントに。
自前でおりかえし処理表示する mode 書けば
lisp レベルでなんとかなると思うが。
elisp だけでも不可能だとは言わないよ.でも実用性とか考えると C レベルで実装
(lisp から操作できるインターフェースも含めて)しちゃうのが ''the right thing''
じゃないかな〜と言っているわけ.でも,lisp にしろ C レベルにしろ,必要性と
いうか有効性が無いならだれもそんなことしないでしょ? だからその辺を説明して
(あるいは熱く語って)同志を募れば?と言ってるの.
実用性は全く感じないし、激しくイラネと思うが、
Cのレベルで書いたほうが何かと楽そうには感じる。
そもそもマージンって何に使うもんなの?
>>744
おいっ comp.lang.lisp でも似たような話題がでてたぞ。

http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&threadm=3F857177.2F4BC9CA%40eng.cam.ac.uk&rnum=1&prev=/groups%3Fselm%3D3F857177.2F4BC9CA%2540eng.cam.ac.uk
http://www.geocities.co.jp/SiliconValley-SanJose/7474/cllMemo.html#0001

てことは c.l.l と 2ch のレベルは大して違わないってことだな。日付で見る
と 2ch のほうが先だからこの記事書いたやつは 2ch 見て書いたんだな。
>>820
おもんない && 頭悪そう
recursive-edit() すると、exit-recursive-edit()するまで自由にできますが、
再帰編集に入った直後に予め指定したコードを実行させる事ってできないものかなあ。

今思いついた変な例だけど、query-replace-regexpみたいな事してて、
カーソル位置にある関数名がふと気になったとします。
この時、置換作業はそのまま続けたいけど、その関数について調べたい場合、
あるキーを押すと、再帰編集に移行しつつカーソル位置にある関数名で
自動的にdescribe-functionしてくれて、
ついでに M-C-c するまで気の済むまで定義元ファイルを見たりできると便利かなと。
一旦終了して C-s C-s の方がよっぽど自然で使い易いが
>>823
うーむ、例が悪かったですかね。
とりあえず、なんかの対話的コマンド実行中に
別の事したいなと思う事が時々あるんですよ。
>>824
では、いい例を希望。何がしたいのか分かりません。
>>825
ではえらく具体的な例を。
SKKでミニバッファに表示された候補を見てて、
「これ何?」と思ったとき、例えば 'A'の入力で
'a'に対応した語を lookup-wordなり emacs-w3m経由で
ググッたりできたらいいな、と。
適当な変数に候補を代入して (recursive-edit)とするぐらいしか
今は思いつかないけど、辞書引きまで自動化できないものかと。

他の用例は……、前回思ったのがずいぶん前なので忘れた。
query-replace-regexp中に ? を押すと
C-r to enter recursive edit (C-M-c to get out again),
というのがありますね。
んで、replaceは操作が全て一関数にハードコードされているのでreplace.elを
書き換えるつもりじゃないと無理そうね。

それはそれとして、recursive-edit突入後にコマンド実行するちょっとした実験↓
(progn
(setq deferred-action-function
(lambda ()
(let ((f deferred-action-list))
(setq deferred-action-list nil)
(apply (car f) (cdr f)))))
(setq deferred-action-list '(call-interactively describe-function))
(recursive-edit))
なんとかなりそう? ならなさそう?
>>827
ほぉ〜、こんな仕組みがあったとは。
doc-string付いてるくせに、全然 emacsのドキュメントとかで触れられてない。
で、post-command-hookの存在を思い出したんだけど、今回はこちらで十分かな。
# ググってみたところ、deferred-action-list は
# 昔の skeleton.elで利用されてたものの、
# 手元の mule19.34附属の物では既に
# post-command-hookを利用するよう修正されているようです。
(defmacro execute-in-recursive-edit (&rest code)
(let ((hook (make-symbol "--execute-in-recursive-edit-hook--")))
`(progn
(fset ',hook
(lambda ()
,@code
(remove-hook 'post-command-hook ',hook)))
(add-hook 'post-command-hook ',hook)
(recursive-edit))))
こんなんでどお?
モードラインに桁数を表示するのに、左端を0でなく1とした
数を出したいんだけど
(setq mode-line-format '(:eval (number-to-string (+ 1 (current-column)))))
とか
(setq mode-line-format (number-to-string (+ 1 (current-column))))
とか
(setq mode-line-format (number-to-string (+ 1 (string-to-number "%c"))))
とかしても、カーソルに追従して変化してくれません
(setq mode-line-format "%c")
では、左端が0になってしまいます
これは、カーソル移動や文字入力にフックをするようにmajor modeを書かないと
むりですかね?
>>830
(add-hook 'post-command-hook 'force-mode-line-update)
832デフォルトの名無しさん:03/10/26 14:10
(add-hook 'post-command-hook (lambda () (interactive)
(setq current-column (number-to-string (+ (current-column) 1)))
(force-mode-line-update)))
(setq mode-line-format (list "" 'current-column))
mode-line-format の evalって、実際どーいう条件の時に評価されるの?
>>833
update するとき
いつupdateされるの?
836830:03/10/26 17:43
>> 832
ありがとうございます。すごいなー。
MMX Pentium 180MHzのパソコンだとカーソル動かしてから桁数がでるまで
ちょっと間があるのがかわいい。
pointが動いた時のhookにすればいいんだろうけど、よく知らない。
気休め程度に
(add-hook 'post-command-hook (lambda () (interactive)
(when (/= current-column (current-column))
(setq current-column (number-to-string (+ (current-column) 1)))
(force-mode-line-update))))
>>837
ナイスなアイデアだ。
でも、間違いが3つくらいありそうだぞ。
(add-hook 'post-command-hook (lambda () (interactive)
(let ((x (number-to-string (+ (current-column) 1))))
(when (or (not (boundp 'current-column))
(not (string= current-column x)))
(setq current-column x)
(force-mode-line-update)))))
文字列を作るのはいろいろな意味で負荷が高いので、
post-command-hook では数値のまま処理して、
mode-line の方で文字列に変換すべき
841デフォルトの名無しさん:03/10/26 19:59
Emacs Lispの初心者で、Meadow2に付いているInfoを見ながら
Emacs Lispの機能をちょこちょこと試しているところです。

ざっと目を通していてよくわからなかったのが構文テーブルの使い方です。
構文テーブルの使い方を短いサンプル付きで説明しているサイトなどを
ご存知の方はいませんか?
842830:03/10/26 20:02
質問者ですが
post-command-hook より post-command-idle-hook の方を使った方が、
なんだかカーソル移動への反応がいいみたいですね
843デフォルトの名無しさん:03/10/26 22:36
lispなんか使えても社会に貢献できねーだろクズ共が
趣味でやるLispは楽しい
会社でやるLispは現実逃避
846デフォルトの名無しさん:03/10/26 23:05
そもそも会社じゃやらねーだろ
んなこたーない。そういう仕事が取れるか取れないかというだけ。

848デフォルトの名無しさん:03/10/27 00:02
例えばどんな仕事がある?一つでいいから例教えてくれよ。
大学機関で使うとかじゃなくてな。
>841
おれもよくわかってないが、一個だけ使い方知ってる。text-mode で

aaa_bbb_

という文字列の一番最初にカーソルを置いて M-f とするとカーソルは aaa の次の _ の
ところに移動する。でもここで

(modify-syntax-entry ?_ "w" text-mode-syntax-table)

を評価すると _ で止まらず最後まで移動するようになる。上の命令は _ という文
字を単語の一部とみなせと構文テーブルで指定するということ。他にも例えば

(modify-syntax-entry ?# "<" text-mode-syntax-table)
(modify-syntax-entry ?\n ">" text-mode-syntax-table)

とすると text-mode で # から行末までをコメントを表すものと指定できる。
正規表現とかにも影響を与える
Allegro 使う仕事とかありそうだ。
(プログラマやめたので最近は知らんけど)
以前は、まじでエキパートシステムとか
スケジューリング作成システムとかの、
LISPの仕事があったよ。90年代前半
です。これはLISPで作ったスケジューリ
ング製品があったわけです。
で、それが*Emacs* Lispとどんな関係があるんですか?
そもそも843からスレ違い
855kaoru:03/10/27 18:34
>>843
ごめんな〜、クズで。
(gc)
ぎゃ〜消える、消える〜〜だれか参照をくれ〜…
(unbound >>857)
859デフォルトの名無しさん:03/10/27 20:26
エキスパートシステムはプロローグでと昔から決まってます。嘘つかないで
ください
へー。エキスパートシステム製作とかあったのか。楽しそうだなぁ。
やっぱエディタには Emacs とか使ってたんですか? elisp を駆使したりしました?

と、無理やりスレの流れに近づけてみる。
もうやめて、次行こ。次。
>>860
M-x doctor
863デフォルトの名無しさん:03/10/28 03:07
エキスパートでProlog使うとバックトラックがPrologまかせに
なるので、Lispでいろいろ制御した方が良いことが多いです。

そもそも、Lispの方が歴史が古いので、Prologよりいろいろと
ライブラリが揃っています。
まだやるんかいな。おもんな。
865psychopath:03/10/28 11:37
>>860 じゃないが、医者に行ってみた。
結構すごくてちょっとびっくり。ガイジンとチャットする練習になる。
漏れはまだそういうことはできんと分かったのはちょっとショック。

Hi,

How do you do? What brings you to see me?

ah, i have some serias problems.

Why do you say ah you have some serias problems?

yes, i have. it's so serias

Is it because of your plans that you say yes you have it's so serias?

my wife doesn't gimme blow job.

Tell me something about your family.

none of your buisiness.

...
正直,ネタ振りもなしで "おもんな" しか言わんやつより雑談のほうがよっぽどマシと思われ….
>>866
だってPrologとかエキスパートシステムとか言われてもねえ。
気持ちがわからないこともない。
serias
阪神の外人だろ
870865:03/10/28 12:39

seriousでした。キャーはずかしー。
871デフォルトの名無しさん:03/10/28 13:11
>>866
たしかに、おもんなとだけ繰りかえされてもねぇ。
気持ちがわからんこともない。
(message (mapconcat #'prin1-to-string '(キタ (゚∀゚) (∀゚ ) (゚  ) (  ) (  ゚) ( ゚∀) (゚∀゚) !!!!!) "━━"))

(mapcar (lambda (x) (message (concat "キタ━━" (prin1-to-string x) "━━!!!!!"))
(sleep-for 0.12))
'((゚∀゚) (∀゚ ) (゚  ) (  ) (  ゚) ( ゚∀) (゚∀゚)))
(animate-string "キタ━━(゚∀゚)━━!!!!!" 10)
(let ((shu '(  シ シュ シュッ)))
(setcdr (nthcdr (1- (length shu)) shu) shu)
(while shu
(message (prin1-to-string (car (setq shu (cdr shu))))) (sleep-for 0.12)))
(add-hook 'window-setup-hook (lambda ()
(mapcar (lambda (x) (message (concat "Emacs " emacs-version " キタ━━" (prin1-to-string x) "━━!!!!!")) (sleep-for 0.05))
'((゚∀゚) (∀゚ ) (゚  ) (  ) (  ゚) ( ゚∀) (゚∀゚)))
(if (fboundp 'animate-string) (animate-string "キタ━━(゚∀゚)━━!!!!!" 10))))
(let ((shu (mapcar #'prin1-to-string '(  シ シュ シュッ))))
(nconc shu shu)
(while t (message (car (setq shu (cdr shu)))) (sleep-for 0.12)))
そろそろ秋田
いまごろ青森
Emacs Lispに、コードのどの場所でどれだけ時間がかかっているかを調べる
プロファイラというものはありますか?

こういうのってどっかになかったかな?
(defmacro maplambda (lst var &rest body)
(if (null body) `(mapcar ,var ,lst)
`(mapcar (lambda (,var) ,@body) ,lst)))

(maplambda '(1 2 3 4) x (+ x 1))
(2 3 4 5)

(maplambda '(1 2 3 4) #'list)
((1) (2) (3) (4))
なにこれ?どのへんが嬉しいのか良くわからん.不明瞭な mapcar ??
lambdaと括弧が消える
ありがちなマクロの悪用例
885デフォルトの名無しさん:03/11/01 23:30
Emacs スレで嫌われまくってる cl ネタで済まんけど、 それなら
(loop for x in '(1 2 3 4)
collect (+ x 1))
(loop for x in '(1 2 3 4)
collect (list x))
のほうがマシかもよ。lisper 以外にも割と意味が通じやすい。
(Paul Graham が loop 嫌いなんで、彼の本で勉強した人には不評だったりするが)
>>885
それはゴテゴテしすぎてやだな。

あまりにも不評なんでmapcarとlambdaに戻そうかな。
>>881
CL がメインのユーザのおれから意見すると、

(maplambda '(1 2 3 4) x (+ x 1))

よりは、

(dolist* (x '(1 2 3 4))
(+ x 1))

ていうほうがしっくりくる。基本的には dolist なんだが、map したリストを
返すという仕様。

>>885
loop は Lisp っぽくないからな、そこの部分だけ異質に見える。まぁ、覚え
るのが面倒なのが本音だが。
やっぱり
(map (lambda (x) (+ x 1)) '(1 2 3 4))
が漏れには一番しっくりするなあ。
処理内容にもよるだろうけど、「写像」が目的なら尚更。
その前にletを使っていたときは
(let ((f (lambda (x) (+ x 1)))
...)
(map f '(1 2 3 4)))
とかして直にlambdaを書いて長くならないようにしている。

ところでdefsubst使わずにdefmacro使って展開させてるのってダメかな。
(defmacro (mapcon f lst)
`(apply #'append (mapcar ,f ,lst)))
890887:03/11/02 02:41
>>889
その例の場合、インライン関数に比べてマクロだと何がいいの?
元々関数のものをマクロにするのはあんまりおすすめできないと思う(高階関
数がらみでハマるから)。そういう意味で >>881 の maplambda も、マクロに
するなら mapcar よりは dolist に近い名前にしておいたほうがよいと思った。
(defmacro mapcon (f lst)
`(apply #'append (mapcar ,f ,lst)))
(defun test (x)
(mapcon #'f x))
だとこうだけど
byte code for test:
args: (x)
0constant apply
1constant append
2constant mapcar
3constant f
4varref x
5call 2
6call 2
7return

(defsubst mapcon (f lst)
(apply #'append (mapcar f lst)))
(defun test (x)
(mapcon #'f x))
だとこうなる
byte code for test:
args: (x)
0constant f
1varref x
2varbind lst
3varbind f
4constant apply
5constant append
6constant mapcar
7varref f
8varref lst
9call 2
10call 2
11unbind 2
12return
バインドが邪魔
気にするな
elispで手続き型言語っぽいと批判されないための
主なポイントは次のようなものと考えていますがあってますか?

(1)whileはなるべく使わない。
(2)setqは単に値をセットして以降変えないなら良いが、
ループ内で、ころころ値を変えるような使いかたはよくない。
lisperとしてか、elisperとしてか、どっちよ?
>>894
それなりの速度でうまく機能するなら手続き型っぽくても気にする必要はないのでは。
elispのInfoのどこかで再帰よりも反復の使用を勧めていたような気もするし(←実行速度の都合上)。
「そのコードって手続き型っぽいな」と言われたら「こう書いた方が速いんだよ」と言い返しとけば?
本当に速いのかどうかは知らないけどさ。
「手続き型っぽくない == 関数型っぽい」と仮定して、思いついたことを適当
に箇条書きにすると、
- 副作用をなくす(破壊的操作 setq や nconc などをなくす)。
- let で宣言した変数を変更しない。
- 自由変数をなくす。
- マクロでも関数でも書けるものは関数で書く。
- 新しいデータ構造を作ったらそのデータ構造を操作する高階関数を作る。

あと、elisp 特有のことだと、
- elisp は末尾再帰の最適化をしないので、再帰呼びだしを使わない。

もちろん、これらを教条的にあてはめるんじゃなくて、パフォーマンスやメン
テナンス性との兼ねあいを考えて、必要に応じて手続き型っぽい書きかたをす
ればよいと思う(そこが Lisp のいいところ?)。

関数型スタイルについて知りたければ、ML, Haskell, Clean をざっと勉強し
てみるのがよいと思う(Lisp は純粋な関数型ではないため)。
Schemerとしては末尾再帰を意識してるのは手続き型言語っぽくないと思う。
まずは再帰で書く。破壊的操作はなしで。
ちゃんと動くことを確認したら別の関数を書いてでも末尾再帰にする。

それからループにする。ループでは破壊的操作はあり。
(while lst ... (setq lst (cdr lst)))とか。
でも、setcar、setcdrはなし。nreverse、nconcはあり。

cond使って条件がいくつもあるやつはループにしづらいけどね。
>>895
んー、それはあまり意識していませんでした。
Lisperとしては○○、elisperとしては△△、みたいに書いてくれるとうれしいです。

>>896
> elispのInfoのどこかで再帰よりも反復の使用を勧めていたような気もするし(←実行速度の都合上)。
やはり、そうですか。

>>897
詳しく書いてくれてありがとうございます。

> - 副作用をなくす(破壊的操作 setq や nconc などをなくす)。

これは、関数の外に影響を与えてしまうような書き換えはダメっていう意味ですよね?
(その下に別にletのことを書いているので、そう思ったのですが)
分かります。ただ、そうなるとscheme でいうところの、
(define foo (let ((count 0)) (lambda () (set! count (+ count 1)) count)))
みたいなのはどう書くのがいいのでしょうか? >>229 でも同じことが書かれていますが、俺なら

(setq foo-count 0) ; 場合によってはdefvar
(defun foo () (setq foo-count (1+ foo-count)))
と書いてしまいます。 よくないですか?

(899 のつづき)
> - let で宣言した変数を変更しない。

(let ((x (get-x))
y)
(foo x)
(bar x)
(setq y (get-y))
(hoge x y)
(fuga x y))

のような処理はどう書けばいいんだろう、と悩みます。
(get-x はfoo,bar の前に、get-y はfoo,barの後に呼ばなければ
いけないと考えてください)

(let ((x (get-x)))
(foo x)
(bar x)
(let ((y (get-y)))
(hoge x y)
(fuga x y)))

と書くのがよさそうな気もしますが、これをやっているとletが
どんどん深くなってしまいます。
(900のつづき)
(let* ((x (get-x))
(y (progn (foo x) (bar x) (get-y))))
...)


(defun hoge-fuga (x y) (hoge x y) (fuga x y))
(let ((x ...))
...
(hoge-fuga x (get-y)))

も可能だけどよくなさそう。「パフォーマンスやメンテナンス性との兼ねあいを考え」るべき
ところなのでしょうか?それとも、いい書き方ありますか?

> - 自由変数をなくす。
これは、ちょっとびっくりしました。
(let ((coding-system-for-write 'foo))
(bar))
的な書き方は、最初とても抵抗がありましたが、今はむしろ、これがelisp的なんだと思ってます。

その他のアドバイスは非常に納得です。ありがとうございました。

>>898
> (while lst ... (setq lst (cdr lst)))とか。
これ、lisp的ではないと思うんですが、いいんですか?
>>894
while ってけっこう使う気がする。
mapc とかで済むときはそっちのほうがいいけど。


>>899
> (define foo (let ((count 0)) (lambda () (set! count (+ count 1)) count)))

そういう関数は、参照透過性がないから関数型でいう「関数」じゃないと思う。
必要なら defvar 使って書くのが elisp 的だと思うけど、
なるべくそういう関数を使わないように設計するのが関数型風かな。


>>900
呼び出し順序が重要な時点で、関数型の世界からは外れてるよね。
原理的には深くなってでも let するのがきれいだろうけど、
そういうときは素直に setq しちゃうのが一番な気がする。
903897:03/11/03 12:30
>>899
> これは、関数の外に影響を与えてしまうような書き換えはダメっていう意味ですよね?
そうです。例えば以下のような nreverse は個人的には OK。関数内の push
で作ったコンスセルだから、list には影響をおよぼさない。
(defun my-remove-if-not (func list)
(let ((result nil))
(dolist (item list)
(when (funcall func item) (push item result)))
(nreverse result)))

> (define foo (let ((count 0)) (lambda () (set! count (+ count 1)) count)))
> みたいなのはどう書くのがいいのでしょうか?
基本的には、書かない。書くとしたら elisp はクロージャがないので、
グローバル変数を使う。
904897:03/11/03 12:35
>>900
> これをやっているとletがどんどん深くなってしまいます。
おれの場合は let でどんどん書いていって、あまりにもネストが深くなった
ら、それは「関数を分割すべし」というサインだと思っているので、関数を作
るか flet, labels を使う。

let を「変数宣言」というよりは「値に名前をつける」という感覚でとらえて
みるといいと思う。

それと、この例の foo, bar, hoge, huga みたいな値を捨ててる関数呼び出し
(つまり副作用が目的)は、なるべく書かない。

>>901
> > - 自由変数をなくす。
> (let ((coding-system-for-write 'foo))
> (bar))
(foo 1) => 10 ならば、いつどこで呼びだしても結果が変らないようにするの
が関数型スタイルだから。elisp はダイナミックスコープだから、関数型にあ
わない気がする。その例の場合 optional 引数にでもしといたほうがいいと思
う(elisp 的ではないけど)。

Emacs はエディタなので、関数はほとんど副作用(カーソルを動かしたり、文
字を表示したり)のためにあるから、なかなか難しいところなんだけどね。
原理主義を貫くのも大変だな、と思った。
906897:03/11/03 13:09
>>905
そうだねw

elisp で関数型のスタイルを身につけるのはかなり難しいと思う。ML とかだ
と、例えば let で宣言した変数は変更できないようになっているので、関数
型のスタイルを身につけたいのなら Lisp よりだいぶ楽。
>> (while lst ... (setq lst (cdr lst)))とか。
>これ、lisp的ではないと思うんですが、いいんですか?
理想を貫くには手駒が少ないからやむをえない妥協だ。
末尾再帰やnamed-letがサポートされたら抹殺するよ。
その日がくるまでは dolist で我慢する。
(require 'cl)なコードは書かないって自分ルールがある。
そのわりにはmapconとか.emacsに書いてるけどね。
>>903
ああ、let で宣言した変数を変更してる。
もちろん、だからといってその書き方が良くないとは思わないけどさ。
要するに、理想像を念頭におきつつ、バランス感覚をもって
「崩す」のがベストってことだな。
>>909
ひょっとして889?
mapconは(apply #'nconc (maplist f lst))だよ。

(mapcon #'list '(1 2 3))
((1 2 3) (2 3) (3))

(defun hoge (f lst)
(apply #'append (mapcar f lst)))
(hoge #'list '(1 2 3))
(1 2 3)
'a と (make-symbol "a") の違いがわからん。
後者はどういう時に利用するもんなんでしょうか?
>>911
ちなみにmapcanが(apply #'nconc (mapcar f lst))

>>912
解釈系がもってるシンボル表に入っていない(internされていない)
シンボルが作られる。
(hoge foo)だったらシンボル表のhogeとfooを指してて
hogeの関数セル、fooの値セルを使う。
make-symbolは新しくつくってシンボル表に入れず関数セル、値セルは空いている。
この空いてるところを利用するんだろうけど、
使ったことがないので使い方はわからん。
反復を抹殺する?dolist で我慢する?おーおー再帰以外を完全に見下してやがるな。
Schemer か?はっ、笑わせるぜ。なんでも再帰でかけるから、再帰以外
は不要か?んじゃなぜ Scheme は lambda で書けるのに let とか持って
るんだ?あぁ?便利だから、という実用的な観点からじゃねーのか?あるいは、
関数呼び出しと変数のバインドを意味的に区別したいからか?どっちにしても
リスト処理や反復操作に名前がついてる do 系列を見下せる立場じゃねーだろ!
便利でかつ、読み手に意図が明確に伝わるほうがマシじゃねのか!?
named-letのおまけだ。
>>914
elisper 必死だな(藁
再帰だって便利でかつ、読み手に意図が明確に伝わるぞ
>>915 つまりは絶対必要じゃないけど、あれば便利だからついでに入れちゃったと?
   でも dolist とかはカスなわけ?基準がいまいちだなぁ…。
>>916 あんまり面白くないな。もっとオラをワクワクさせてくれ!ループ抹殺、完全再帰のすばらしさ
   に納得したら Schemer になろうかと思ってるんだから。

末尾再帰がループと等価であることくらいは理解してるます。
なんでそこまでループを見下すのか?再帰的な操作ならともかく、本質的に反復的な
操作まで再帰で書かないといけない理由は何?どう嬉しいの?そこんとこを詳しく
知りたです。elisper としては。
理屈っぽい話はしてもしょうがないとは思うが、
再帰と反復が別々よりは再帰に統一したほうが単純で美しいってことじゃないの?
といってもSchemeにはfor-eachがあるけどね。
map系のように関数を渡すやつ。
(for-each (lambda (x) ...) '(1 2 3 4))

末尾再帰させてると状態の変化を記述してるって感じがするな。
>>918
> なんでそこまでループを見下すのか?

「見下す」ようなことを誰か言った?

scheme が好きになるようなヒトは潔癖症、あるいはそれに近いってだけでしょ。
末尾再帰だとこういうふうに書くってのはある。
(defun hoge (lst)
 (cond ((null lst) 'x)
    ((a (car lst)) 'y)
    ((b (car lst)) 'z)
    (t (hoge (cdr lst)))))
これがいいスタイルだと感じるわけ。
反復の途中で脱出させるのはかっこわるい。
まあでも、好みの問題だろうけど。
言語の機能を十二分に生かして、簡潔で効率のよいコードを書けばいい。
なるほど。漏れは、リストの頭から順番に処理して、かつ返り値がリストじゃ
ないときは dolist、関数をリスト要素に適用して、結果のリストが欲しいときは mapcar
てなのが好みだ。
じゃあ、俺はfor-eachを書いて使おうかな。
リストに対して繰り返し処理をするときは dolist,mapcar など便利なのがあるけど、
バッファーに対する繰り返し処理はやっぱりwhileを使うしかないの?
例えば、search-forwardして、見つかるごとに何か処理しなければいけないときとか。
最近 Common Lisp 好きに loop を語って貰ったので↓でも良い様な気がしてる。
(loop for x in lst
when (a x) return 'y
when (b y) return 'z
finally (return 'x))
お前ら、ほんとに、そんなに loop が嫌なのかと。
>>924 while でいいんじゃねーの?なんか不満でもあるのか。どうしてもというならば、
(with-all-buffer ...)
みたいなマクロを組んで、内部で while を使うか、再帰するか、goto を使うかは、
グローバル変数の *style* で切り替えるとか。
何が悲しくてforとかinとかreturnとかfinallyを書かなきゃならんのか
俺はloop使わない方が好きだ。
>>925
このスレで loop使いたきゃ、そのまえに俺が納得いくまで
loopについて語ってくれ。
じゃないとついてけないので……。
だんだん不毛になってきたな。なんだか
「おれはラーメンが好き」
「いやいや、やっぱり僕はカレーが好き」
というのを必死に言いあってる感じ。ただの好き嫌いの問題じゃん。

>>914 は学生時代に再帰が理解できなかったコンプレックスをまだ乗り越えて
いないに一票。(と煽ってみる)
定食屋でカレーやラーメンについて語ってるような感じ。
LISP Schemeスレでさんざんやったような気がするんだけどね。
schemeや common lispやってない人間からしたら
いい迷惑って感じかもな。
威張るラストセックス プ)
>>912
make-symbol 使うのは、主に macro 書くときとかだと思う。
絶対に他と被らない symbol ができるから。
elisp info の Macros::Problems with Macros::Surprising Local Vars に例が出てるよ。
>>934 げげ!! 漏れ今迄 gensym 使ってた…まさか gensym が cl パッケージだったとは….
まいったなぁ,CL 好きだが,嫌われてるみたいだから emacs ではなるべく cl 使わない
ようにしようと思ったのだが.あぁ,xyzzy 良いなぁ.X 環境にも欲しいなぁ.
好きなら使えばいい。
でも俺は嫌いだから使用を強制しないでくれ。
いや,Emacs の cl は好き嫌いではなくランタイムには使わないほうが良いんでしょ?
今迄知らずに使ってただけで.強制する気は全く無いです.はい.
938925:03/11/04 22:36
>>927 >>928 正直、すまん。Scheme 話だったので LISP Scheme スレと
勘違いしてしました。elisper に loop を勧める気はないです。

まぁ、CL なら loop も捨てたもんじゃないんですよ。リスト中の条件に
合う要素(条件は複数ね)を数えたい場合とか(これはそのままじゃ emacs じゃ動かないけど)、
(loop for x in lst
counting (F? x) into h1
counting (G? x) into h2
finally (return (values h1 h2)))
が一番すっきりしてると思うわけ。別にこれが lisp らしいと主張する気は
さらさらないっす。ちょいと小粋で便利な別の言語を覚えるつもりでどーぞ、と。
loop に興味持つ人は少なそうだけど、居たら続きは LISP Scheme スレでやりましょう。
「ラーメン(反復)?カレー(再帰)? とろくさい、きしめん(loop)をわすれとっ
たらあかんわ」
という人がでました。
>>938
それは普通、関数書くだろ。
(defun hoge (p lst)
(let ((n 0)
(while lst
(if (funcall p (car lst)) (setq n (+ n 1)))
(setq lst (cdr lst)))
n))

(values (hoge 'F? lst) (hoge 'G? lst))
941925:03/11/05 00:31
>>940 スレ違いだから LISP スレで…と思ったら Emacs にも loop あったんですね。
cl がんがってるなぁ。loop のメリットとしては、
- 効率が良い(リストを一回走査するだけ)
- 短い
- 読めばなんとなく意味がわかる(非 lisper にも、ね)
ただ、Common Lisper でも loop は嫌って人も居る(漏れも最近までそうだった)
のも事実。でも、簡単な使い方くらいなら覚えておいても損はないと思う。
…でもまぁ、Emacs Lisp では cl パッケージなのでそんなに勧める気はないです。
リストを一回だけ走査したいんなら勝ち目ないなあ。
この関数ならloopで書いても速度はあがるまい。
(defun hogehoge (lst &rest p-lst)
(mapcar (lambda (x) (hoge x lst)) p-lst))

(apply 'values (hogehoge lst 'F? 'G?))
elispでの valuesとかの扱い知ってるのか知らないのか、
どっちなのかね?
たぶんあなたは別のスレ行ったほうがあなたにも
elisperにも幸せと思われ。
943 ではないが,values 云々はどーでもよくないか?気に入らないなら list に読
み換えればいいじゃん.943 でも結局 hoge を 2 回呼ぶからリストを 2 回なめる事
になるんじゃないのか?同等の効率を得ようと思ったら,
(let ((x nil) (v1 0) (v2 0))
(while lst
(setq x (car lst))
(when (F? x) (setq v1 (+ v1 1)))
(when (G? x) (setq v2 (+ v2 1)))
(setq lst (cdr lst)))
(list v1 v2))
と書くわけだが,これは loop マクロの展開結果とほぼ同じなんだよね….
まぁ,しかし emacs の loop には致命的な弱点がある.それは嫌われ者の cl
だという事.925 も,CL なら(これは Common Lisp ならの意味だろう) loop
も捨てたもんじゃないと言ってるだけで,elisp には勧めないと言ってるんじゃん.
興味のある香具師は LISP スレへの移動を勧める.
>>944
うすうすlistのエイリアスだろうなって思ってたけどね。

>>945
一回走査なら専用のloopには勝てないわけで、
hogehogeを書けるかって話にもっていこうとしたの。
二重ループならloopでも(length lst)×(length p-lst)だけの走査が必要で
loopにp-lstを展開するような機能はあるのかとか
p-lstを展開するマクロ書けるのかって聞きたかったの。

でも、loopの話はもういいや。
Perlやっててelisp始めたばかりです
Lispは汎関数がいかしますね。
しかし型キャストが面倒ですね(string-to-numberなど)。
自動的に型キャストするライブラリーってありますか?
また別件ですが逆行列を計算できるライブラリーもありますでしょうか
>>947
> しかし型キャストが面倒ですね(string-to-numberなど)。
Perlって文字列と数字を区別しないのかな...

> 自動的に型キャストするライブラリーってありますか?
私はGNU Emacs 20を使っているんですが、標準のライブラリには
そういうのはなかったと思います。

いろいろなライブラリを集めたEmacs Lisp Listで探してみたらどうでしょう?
http://www.anc.ed.ac.uk/~stephen/emacs/ell.html
英語ですけど。だれか短い説明だけでも日本語に翻訳してくれないかな...
rubyなら "123".tos, pythonでも string.atoi("123")
煽り覚悟で書くと、
Perlやってて汎関数がいかしてるってんなら、Rubyでもいいんじゃね。
951デフォルトの名無しさん:03/11/07 10:51
>>947
elisp で数値計算か?そんなパッケージあったかなぁ.数値計算ソフトとの
インターフェースなら一杯あるからそれを使えば?SCI-LAB と連携するのがお勧めかなぁ.
どうしても Lisp でプログラミングしたいなら Common Lisp + MATLISP とか.↓な感じ.

* (setf mat [100 1; 20 5])

#<real-matrix 2 x 2
100.00 1.0000
20.000 5.0000 >
* (m/ mat) ;; 逆行列の設定

#<real-matrix 2 x 2
1.04167E-2 -2.08333E-3
-4.16667E-2 0.20833 >
* (m* mat (m/ mat))

#<real-matrix 2 x 2
1.0000 0.0000
0.0000 1.0000 >
952947:03/11/07 13:02
> いろいろなライブラリを集めたEmacs Lisp Listで探してみたらどうでしょう?
> http://www.anc.ed.ac.uk/~stephen/emacs/ell.html

> SCI-LAB と連携するのがお勧めかなぁ.
> どうしても Lisp でプログラミングしたいなら Common Lisp + MATLISP とか.↓な感じ.

有難うございます。調べてみます。
逆行列は、実は今は R (www.r-project.org) をemacsから呼んでいるのですが、
(実は途中の文字列の parsing で Perl をかましています..ださい)
遅いし、Rをインストールしてないと使えないので、他の手段がないかなと思ってます。

> Perlやってて汎関数がいかしてるってんなら、Rubyでもいいんじゃね。

Rubyを習うとPerlと見かけが似すぎてて混乱しそうなので、習っていません...
R で遅いから elisp ってのは違う気がするな…。R より速いってこたぁないだろう。
純粋に計算速度の問題なら計算部分だけ C で書くとか。
954947:03/11/08 07:25
R は、起動に5秒ぐらいかかるんですよね
起動してからの計算は別に遅くもないんですが。
Lisp でも他の Common Lisp のアプリケーションをインストールする必要が
あるのだと結構おおがかりですね。
結局 Perl の ライブラリを使ってしまうかも知れない..
なんと「起動するまでが」遅いって話だったのか….最初に 5 秒待つのが嫌なのか.
それって一回だけじゃないの?ひょっとして,頻繁に Emacs を終了,起動とかやっ
てる人? Common Lisp 云々は「計算が」遅い場合の話なので 947 の望む話とは違う
だろう.もちっと具体的にやりたいことを書かないと他人に伝わらないと思われ.
ものによっては elisp で済むかもしれないし,Perl のがてっとりばやいかもしれない.
ファイルの読みこみ時間じゃないのか
980くらいになったら次スレ立てようか。
なんで cl って嫌われてるの?
1. ランタイムにつかうとマズーだから
2. Common Lisp より Scheme が好きな香具師が多いから
3. 再帰原理主義者は do 系列の反復用構文が嫌い
4. cl の拡張 loop マクロは文字列やハッシュをループで処理するときに便利だが、
  なんでか嫌いな人が多い。Common Lisper の中でも別れる。
  Peter Norvig 本から入門した人→ loop が作れる。使うべきときには使う。
  Paul Graham 本から入門した人 → Paul が loop 嫌いなので loop は糞だと思ってる。

…まぁ、1がもっとも大きな原因じゃないの?
cl の好悪はおいといて、スレにコードを書く時は、
> 1. ランタイムにつかうとマズーだから
なわけだし、Navi2ch で C-x C-e できるよう、cl 使わず書いて欲しい。
具体的に言うと、何が使っちゃ駄目なの? dolist, dotimes はいいよね?
駄目なのは loop だけ?
dolist, dotimesは subr.elにあるし、十分認知されたから ok.
ついでに elisp的にというよりスレ的にだが、
cl利用しまくりコードは lispスレへカエレみたいな。
>>959
> 1. ランタイムにつかうとマズーだから
具体的には何がマズいの?
教義で禁じられているからです。
http://www.gnu.org/manual/elisp-manual-21-2.8/html_node/elisp_709.html
> Please don't require the cl package of Common Lisp extensions at run
> time. Use of this package is optional, and it is not part of the
> standard Emacs namespace. If your package loads cl at run time, that
> could cause name clashes for users who don't use that package.

cl-* 以外の全ての外部名は、本来ユーザーに公開されてるはずの名前。
たとえば、.emacs で replace という俺コマンドを定義していた場合、
ランタイムで cl を要求されちゃうと動かなくなる。
966958:03/11/09 21:35
なるほど。
cl の出来そのものが悪いという訳じゃないのね。
emacs の正式パッケージじゃないから
名前がバッティングするおそれがあるということだけか。
>>959 の 2-4 は好みの問題だしね。
素人なので「run-time以外」という表現がよく理解できませんが
どういうときには使っていいのでしょうか?
多値が使えない
バイトコンパイル時
実際自分で使うものでも.emacsでもcl使ってない人って多いの?
elispまともに書かない人は別として。
俺は自分で使うものはcl使いまくりなのでcl全然構わない派なんだけど。
971958:03/11/10 01:26
おれはいきなり require してるよ。
次スレテンプレ用リンク集

* Emacsカスタマイズ入門
ttp://www.netfort.gr.jp/~kiyoka/emacs_setq/emacs_setq.html

* GNU Emacsマニュアル (Emacs20用)
ttp://www.sr3.t.u-tokyo.ac.jp/~takekawa/gnujdoc/emacs-20.6/emacs-ja_toc.html

* リファレンスマニュアルは(ちと古い)
ttp://www.fan.gr.jp/~ring/doc/elisp-manual/elisp.html

* GNU Emacsマニュアル(英語) (Emacs21用)
ttp://www.gnu.org/manual/elisp-manual-21-2.8/html_node/elisp.html

* Programming in Emacs Lisp
ttp://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp.html

* Emacs Lisp あれこれ
ttp://www.mew.org/~kazu/doc/elisp/

* Emacs Lisp で書かれたプログラムのバグを知らせる方法
ttp://www.jpl.org/elips/BUGS-ja.html

Emacs21用リファレンスマニュアルの和訳ってありますか?
ランタイムにclパッケージ群が必要かどうかって、cl.elとか実際に覗かないと
わからないよね? それって面倒だな。 
漏れは自分では cl 使ってる気はなかったが、cl がロードされていた…。loop 以外
に具体的に何がまずいの?具体的に言ってくれなきゃわかんねーYO!! いちいち cl
かどうか調べるのマンドクサ。cl 見たくない香具師は見ないってことでどーよ?
navi2ch のフィルタリング機能でも使えばそれくれー簡単だろう。
>>971
CLのinfoに"Some features conflict with existing things in
Emacs Lisp"と書いてあるけど実害はないの?
>>973
大体この関数が怪しいとかって予想つくでしょ?
で、それを describe-function すれば定義したファイル判明するし。
いうほどやっかいじゃないと思う。
# clが loadされると subr.elにあるのに再定義されてしまう
# dolistのような例もあるけど。
## cl が loadされた後に subr.elので再再度定義しなおしたりしちゃったら
## なんかマズいことあったりするのかな。
>>975
漏れ elisper じゃないから良くわかんないけど,拡張された cl なやつ
(素のやつでは使えない機能付き)で置きかえちゃうから、cl 無しの人で実行で
きないとかでないの?漏れ気づかずにロードされてたクチだけど、100 MB オーバー
の大量の elisp パッケージのどれも問題が出たことはないし(たぶん)。

>>973
だから、どれなんだ?具体的に言ってくれ。そしたら一応気をつけるから。
今迄の話だと,俺には loop くらいしか推測がつかない。
このスレでよく出るものでは、
mapcon, mapcan, maplist, mapcar*, flet, labelsなどなど。
* loop、do、lexical-let、labels 等のマクロ
(eval-when-compile (require 'cl)) でコンパイル時に解決できるから
他人に配布するプログラムでも使ってかまわない。
ただし、初心者の質問への答え等には向かないと思う。

* merge、union、map 等の関数
実行時に cl に依存してしまうので、他人に配布するプログラムでは
使ってはならない。自分だけのために書くならお好きに。
ド初心者で悪いんだけど、実行時に cl に依存すると何が問題なの?
cl って emacs の標準配布物だよね?
>>980 ログよめ。>>965
初心者的には俺 merge とか 俺 union とか定義するなら、素直に cl 使った方が
いいような気もするんですけど、そーゆうもんでもないんですね。よくわかんない
けど、とりあえず cl は避けておきます。なんでこんなの標準添付されてんのかな?
require したらエラーにするくらいしてくれてもいいのに。ややこしいなぁ。
>>982
Emacs part10
http://pc.2ch.net/test/read.cgi/unix/1066719492/

245 :名無しさん@お腹いっぱい。 :03/10/31 23:40
>>244
だったら使わない方がいいよ。cl は「○○もないのかよ」ってな
Common Lisp 厨房をなだめるためにあるパッケージだから。
The Emacs Lisp Reference Manual の範囲で書いとけ。
知らぬ間に cl がロードされていて困ってます。.emacs 内では require していませ
ん。どうやらなにかのパッケージが勝手にロードしちゃってるようです。このままだ
とどのような恐しい事が起るのでしょうか?また,どのように対処したらいいのでしょうか?
>>982
cl-*.el のソースをコピペして関数名を変えて使ってるよ。

>>984
他の人はどうだか知らんが、今まで cl をロードしてて変なことになったこと
はないよ。info の注意書きは「依存しないようにしておいたほうが無難」く
らいの意味あいなんじゃないの?

この問題は、そもそも elisp にパッケージ機構がないのが原因なんじゃないの?
ド初心者です。apel みたいな標準名前空間(パッケージ名の prefix 無しくらいの
意味ね)に入れちゃうパッケージはわりとメジャーなようですがどうなんでしょう?
標準で付いてくる cl はつかってはならないのなら,apel みたいな外部ライブラリ
は言語道断なんでしょーか? cl で置き換えられちゃう関数群ってアッパーコンパチ
なんでないの?なんか elisp 始める前に混乱中ですが…。
987971:03/11/10 15:24
>>975
それは
Some Common Lisp features have been omitted from this package for
various reasons:
この欄に出てくる文でしょ。emacs と conflict する feature は
別名にしてるって書いてあるよ。

lexical-let とか flet とか label とか、単純に便利だと思うんですけどね。
人にくばる可能性があるものには使わないけど。
こういうの誰か作ってくれない?

(require 'cl-cl)

(cl-union ...)
(cl-merge ...)

みたいにプレフィックスが全部ついてるの。機能は cl と全く同じで。
cl(|-(macs|extra|...)).elを読み込んで、symbolを置換してから評価するとか?
990971:03/11/10 20:35
単純に
(defun hoge
(defmacro hoge
(defalias hoge
これらを置換したら?
そろそろ次スレだね。
誰か立ててー俺立てて見たけど無理だった。
前スレ
Emacs Lisp
http://pc2.2ch.net/test/read.cgi/tech/1004551074/

関連スレ
Emacs part10
http://pc.2ch.net/test/read.cgi/unix/1066719492/
LISP Scheme Part8
http://pc2.2ch.net/test/read.cgi/tech/1058263391/
さえ入っていれば大丈夫だよ。
>>986
apel はそうでもないけど、糞flim は本家 gnus 使ってると smtpmail-send-it あたりで
emacs 標準のものと名前が衝突して、しかも微妙に仕様が違うから document 通りに
設定してるの動かない、とハマる。
しかもファイル名まで同じだから余計タチ悪い。氏ね。
995 :03/11/10 23:44

ヤフー掲示板で「学習指導」を行っていた
学習塾の名物講師・田村晋也が 【 男児ポルノ販売で逮捕 】 されたため、
塾に通っていた保護者(特に母親から)激しい罵倒をされています。

【社会】男児ポルノ画像、メール配信した疑い 教諭ら6人逮捕[10/09]
http://news5.2ch.net/test/read.cgi/newsplus/1065871362/

逮捕されたのは、
田村晋也(39)・・・・・さいたま市南区 南浦和1−20−11−201
地図:http://map.yahoo.co.jp/pl?nl=35.50.55.477&el=139.40.16.481&la=1&fi=1&sc=3

犯人の経営していた塾
『まったく新しい学習空間 TOM'Sクラブ』

埼玉県 戸田市本町4-*-*  モー****パー*戸田***F
048-4**-7***
正確な住所・電話番号等の記載:
http://www.google.co.jp/search?q=cache:dQRI_9ohaWYJ:www11.ocn.ne.jp/~juken/search/tohuken/saitama.html+%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%8F%E6%96%B0%E3%81%97%E3%81%84%E5%AD%A6%E7%BF%92%E7%A9%BA%E9%96%93TOM%27S%E3%82%AF%E3%83%A9%E3%83%96&hl=ja&ie=UTF-8
現場の地図:http://map.yahoo.co.jp/pl?nl=35.48.9.882&el=139.41.7.470&la=1&fi=1&sc=3
埋め立て
Emacs Lisp 2
http://pc2.2ch.net/test/read.cgi/tech/1068467385/
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。