Emacs Lisp 2

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

前スレ
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/
2デフォルトの名無しさん:03/11/10 21:31
2
(・∀・)ニヤニヤ 3-get-p?
4前スレ988:03/11/10 21:49
こういうのでいけるかと思ったけど...

(fset 'original-defun (symbol-function 'defun))

(defun map-tree (f tree)
(if (consp tree) (mapcar #'(lambda (item) (map-tree f item)) tree)
(funcall f tree)))

(defmacro defun (name argument-list &rest body-forms)
(let ((new-name (intern (concat "cl-" (symbol-name name)))))
`(original-defun ,new-name ,argument-list
,@(map-tree #'(lambda (item)
(if (eq name item) new-name item))
body-forms))))

(defun fact (n)
(if (<= n 1) 1
(* n (fact (1- n)))))

(symbol-function 'cl-fact)
=> (lambda (n) (if (<= n 1) 1 (* n (cl-fact (1- n)))))

;;; *** これを忘れずにしよう ***
(fset 'defun (symbol-function 'original-defun))
5前スレ988:03/11/10 21:50
こういうのが駄目だと気づいた。

(defun even-p (n)
(if (zerop n) t
(odd-p (1- n))))

(defun odd-p (n)
(if (zerop n) nil
(even-p (1- n))))

(symbol-function 'cl-even-p)
=> (lambda (n) (if (zerop n) t (odd-p (1- n))))

(symbol-function 'cl-odd-p)
=> (lambda (n) (if (zerop n) nil (even-p (1- n))))
6前スレ988:03/11/10 22:03
結局こんな感じにするしかないのか?誰かいいアイデアない?

(defvar cl-symbol-list '(fact even-p odd-p)) ; cl の symbol すべてを列挙する

(defmacro defun (name argument-list &rest body-forms)
(let ((new-name (intern (concat "cl-" (symbol-name name)))))
`(original-defun ,new-name ,argument-list
,@(map-tree #'(lambda (item)
(if (memq item cl-symbol-list)
(intern (concat "cl-"
(symbol-name item)))
item))
body-forms))))
> ; cl の symbol すべてを列挙する
これは多分必要だろうね。
ついでに subrで定義されてるけど clで再定義されちゃう関数対策も。
つーかもういいよ。嫌いな人も cl はレスごと Navi2ch であぼーんでもすりゃいい
でしょう。漏れもさりげなくロードされてたみいだしもういいや。2ch で必死にl を
排除しても使ってるパッケージがロードしてちゃぁねぇ。ぶっちゃけランタイムにロー
ドされてても実害ないんだろ?
cl 好きなのはかまわんが、警告無しで非互換な変更されることがあるぞ。
例えば、emacs20 で mapc は cl 関数として
(mapc CL-FUNC CL-SEQ &rest CL-REST)
と定義されていた。emacs21 になって built-in になったんだけど、
(mapc FUNCTION SEQUENCE)
と、一つしかシーケンスを受けとらなくなった。NEWS には新規にmapc が実装
されたとは書いてあるけど、cl ユーザーへの notice は何も無し。ランタイ
ムで cl を要求するコードは推奨してないのだから、そういったコードへの配
慮は必要無いってことみたい。
108:03/11/11 19:18
別に cl 好きではない。むしろ emacs スレではアンチ cl だった。でも、
知らない間にロードされてんの。アンロードとかできないんでしょ?
使ってる elisp を全部チェックして cl 使ってるやつを排除するのマンドクサ。
激しく致命的な問題があるなら考えるけどさぁ…。
全部チェックしなくても
(require 'loadhist)
(file-dependents (feature-file 'cl))
これでわかるよ。
12not 8:03/11/11 20:02
>>11
おーこれ知らんかったー、サンクス。やってみたら犯人は completer だった。
こいつはしゃーないなぁ…
一つ外すとまた別のが表示させるから、これがなくなるまでやっていけって?
color-theme を外して…げっ!eieio とか外しちゃ話になんねぇ…。つーか…これって、
コンパイル時に使ってるだけの奴もひっかかってない??やっぱ手動チェックかなぁ…。
犯人ってひどい言い様だな。もう、いい。漏れは eieio は捨てられん。
cl ロードしていいよ。もう cl 使うな原理主義者の文句は甘受する。
つーか、(require 'cl) するだけじゃねーか?俺関数が乱立するよか
よっぽどマシだろ。
cl をロードしてるっぽいパッケージ一覧。(require 'cl)で grep。
tuareg, eieio, ecb, haskell-mode, ilisp, python-mode
speedbar とかかな。sml-mode や navi2ch や Mule-UCS の一部にも
eval-when に囲まれてない (require 'cl) があるな。でもコンパイル
して使う分には問題ないの?つーか、そこまでして cl は避けなきゃいけないの?
そもそも、なんで cl は自分で定義する関数、マクロ等々を cl-... とプレフィックスを付けなかたったの?
そもそも、なんで elisp にはパッケージ管理等の名前空間管理システムがないの?
そもそも、なんで elisp は dynamic bind なの?
全部 rms のせい。
言動を見てると、Emacs Lisp はあくまでもエディタ拡張用言語であり、
本格的なプログラミングには別の言語を使って欲しいような感じ。
18mami:03/11/11 23:07
>>15
> eval-when に囲まれてない (require 'cl) があるな。
navi2ch で bcomp.el 以外にあります?
>>16 dynamic bind 云々は Lisp の歴史を考えれば仕方ないだろう。てゆう
か、cl なんかロードしちまってもいいんじゃねーの?と flim とかで苦しんだ漏れは思うわけだが。
ま、病的に cl を恐れてるんじゃなければ、かまわんだろ。そんなことより
もっと elisp 話しようよ。
> もっと elisp 話しようよ。
そだね。じゃあ、どうでもいいネタをひとつ。こういうマクロ作ってみた。
make-symbol の使い方はこんなんでいいの?

(defmacro alist-bind (var-list alist &rest body)
;; (declare (indent 2) (debug t))
(let ((tmp-alist (make-symbol "tmp-alist")))
`(let ((,tmp-alist alist))
(let ,(mapcar #'(lambda (var) `(,var (cdr (assq ',var ,tmp-alist))))
var-list)
,@body))))

(setq alist '((a . 1) (b . 2)))

(alist-bind (a b) alist
(list a b))
=> (1 2)
別に cl依存したパッケージ作成されようが俺的には全然構わんが、
# たとえ eval-when-compileとかしてなくっても、だ。
clな関数な話題は、なるべく lispスレを利用していただきたい。
>>20
make-symbol はそれでいいけど、
< `(let ((,tmp-alist alist))
> `(let ((,tmp-alist ,alist))
>>21
> clな関数な話題は、
今の話題は cl な関数自身ではなく、cl がもたらす弊害について。
つまり、このスレ以上に適切なスレはない。
おまいが舞う構わないは全く関係無い。
ちゅーか、なんで cl な関数な話題は lisp スレで、なの?
cl って elisp で書かれた elisp 用のライブラリだよね?
>>23
cl の弊害って今まででた奴は A. 標準関数を拡張しちゃう、B. 俺関数とあたる、
C. 将来の非互換の可能性、くらいか? B. C. はあらゆるライブラリに共通だと
思うが、A. はいかんともしがたいな。我慢できねー香具師は我慢ならんだろう。

mapc なんかも Common Lisp というリファレンスがあるだけわりと互換性の
ある変更で済んでマシな部類だっと思うけどねぇ。
A は cl 的には bug じゃないの?
info ではバッティングは避けるようなこと書いてあったけど。
というかさ、name space が一つしかないんだから、
emacs がこの先どれくらい進化するのか知らんけど、
こういうどろくさい部分は残り続けるな。
つーかすでに妥協のかたまりみたいなもんで、
本当にクリーンなもの使いたいなら hemlock とか使うしか。
>>22
うおっと、たまたま変数名が同じで動いてただけか。
しかし、なかなか話題が変らんな... 2ch であーだこーだ言っても仕方無かろうに。
他に話題もないようだし、いいんじゃねーの?
(defun hoge (x y)
(mapcar (lambda (z) (cons x z)) y))
こんな関数どっかにある?
>>30
あるとしたら、どんな名前になると思う?
map-cons
338:03/11/12 20:42
>>18 それだけです。bcomp.el ってバイトコンパイル用の lisp ですか。
   ちょっと見ればわかるのに、よく読まずに名前を挙げてしまって申し訳ないです。
>>30
わざわざ別関数にするほど汎用性があるとは到底思えないのだが
別関数にした理由は2回でてきたのと
lambdaの中で使ってたのでlambdaを減らして見やすくしようかと。
前スレ後半に出ていた loop を使って、
(loop for z in y collect (cons x z))
と書けば?と思ったが、
(mapcar (lambda (x z) (cons x z)) y)
こっちとタイプ数が変わらない事に気づいた。だめじゃん loop …
ま、こんなの適当に名前つけとけばいいんじゃないの?
また話を蒸し返す……。
漏れは cl 良いと思うけどね。気にせず語れや。loop だって while に
展開されるんだから elisp 的にグッドじゃないか。漏れ的には
無いと死ぬ: case, ecase, reduce, ignore-errors, count-if
あれば便利: find, loop, destructuring-bind, every, some
return, return-from, flet, labels, rotatef
union, merge とか
嫌い: do (読みにくくない?漏れだけ?)
てな感じなわけだ。つーか、初心者に cl 使うなって教えるのか?
あれば便利なんだし、注意点を教えるだけでいいんじゃないかなぁ。
…でも do だけは勘弁な。
(ふりだしに戻る)
Emacs Lisp の専用スレ。
少数派による互助を中心に、初心者の相談も気が向けば受け付けます。
単なる Emacs ユーザーは別板の Emacs 関連スレにどうぞ。

前スレ
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/
elispと関係なく cl利用なコード披露したがる奴が
時々現れるから変な事になるんだろ?
ま、elispと関係なく scheme的なコード披露したがる奴も
たいていセットなんだけど。
なんで自分達の巣におさまってないのかねぇ。
scheme的なコードも嫌われるの? 何故?
末尾再帰で書くから
eval-and-compileって、これで括らない場合とどう違うのか、
ドキュメント読んでも分かりません。
具体的に、どういう時に有効なのでしょうか?
コンパイルされることを前提にいくつもの環境を念頭においた*.elや.emacsを書いていてload-pathやrequireが絡むときとか。

てゆーか人に聞く前にgrepくらいしろぃ。
標準添付のelispでも結構使われてるじゃねーか。
>>41 Scheme 的なコードって再帰つかうやつことの話?
41 の思う elisp なスタイルってどんなのよ?
cl 禁止ってこたぁ ignore-errors も使っちゃだめなの?エラー処理とかどうすんだよ… >>41
(codition-case 'hoge
(progn (エラーを無視したいコード))
(error nil))
とか書かなきゃならないの?マンドクサ…。
>>45
grepぐらいしてるよ〜。あちこちで見かけるけどサパーリ分からなくて
悲しい思いしてるのに、無下に切り捨てないでくれよ。
>>47
同じような意見は何度も出てるんだけど、わざとループさせようとしてるの?
ループって今迄に ignore-errors の話が出てたのか…?いや、使うなって意見が
激しくしつこいから、無しでやっていってるのかな〜とおもって。(condition-case ...)
で長くなったらダルくない? 漏れは ignore-errors とかは使うほうが良いと思うし、
どーせ cl 使うなら便利な機能の話は有難い。しかし、本当に使ってはいけないなら
使うのを止めてもいい(別に愛着があるわけじゃないし)。 ロードしたくない人むけに
eval-when-compile でコンパイル時に使うようにすりゃいいだけの話ではないの?
>>48 どーゆう時に役に立つかって?
1 - cl をランタイムにロードするのが我慢ならない人が居ます。
2 - 普通に (require 'cl) と書くと,そのプログラムをロードしたときに cl がロードされてしまいます。
3 - したがって cl を使うときは (eval-when-compile ...) で囲んでコンパイル時に評価しておきます。
すると,そのプログラムをロードしても cl はランタイムにはロードされません。cl を使うときは
eval-when-compile で囲むのが御行儀が良いとされています。eval-when-compile はこーゆう時に有効なのです。

え、コンパイルしないでロードしたら? その場合は普通に require されてしまうの
で、elisp コードをむやみに評価しないように気をつかいましょう。下手をすると
cl がロードされてしまいます。

# 気にしない人は全然気にしないからこの手の話は荒れるんだよな…。
ignore-errors は普通に elispなコード書いてても便利だよね。
(require 'cl)して利用してるパッケージも多いし、
俺もここで書かれるまで clのとは知らなかった。
このスレで clウザがられてるのは、
elisp(emacs上で動かしたい)コードの一部として
loop なり mapcon なりが出てるのでなく、
それを使う事自体が目的に見えるというか、全面に出てきすぎてて
拒否反応起こす人がいるとか?
あと各種パッケージでも利用頻度低い clの関数は
馴染みがないわけだし。
# incfあたり、そろそろ解禁日も近い感じがするが。
>>51
× eval-when-compile
○ eval-and-compile

;; eval-when-compile は自明っしょ。
バイトコンパイル時には、トップレベルのフォームのうち、限られた物しか
評価されない。あるフォームをバイトコンパイル時にも確実に評価したい場合、
eval-and-compile で囲む。
foo.el:
(eval-and-compile
(message "hoge")
(sit-for 1))
bar.el:
(message "hoge")
(sit-for 1)
をバイトコンパイルしてみると違いがわかる。
自分で書いたわけでなくて申し訳ないが、例えば↓とか読みやすくない?
(defun url-encode-string (str &optional coding)
(apply #'concat
(loop for c across (encode-coding-string (or str "") (or coding 'iso-2022-jp))
collect
(cond ((= c ?\n) "%0D%0A")
((string-match "[-a-zA-Z0-9_:/.]" (char-to-string c))
(char-to-string c))
((= c ?\x20) "+")
(t (format "%%%02x" c))))))
>>50
未出の各マクロについてこれは便利だから…てやってったらループじゃん。
これまでに cl マクロ自体の有用性を否定してる人はほとんどいないから、
個別のマクロ挙げていっても意味ないわけ。
>>52 が書いてるように、cl で書くこと自体が目的のようなレスが目立ったり、
cl から発展して Common Lisp 自体の議論 (loop マクロの是非等) を延々と
続けられたりしたので、cl マクロを使ったコードを *このスレに書く* のが
嫌われてる。
… cl のコードを LISP スレに貼ってどうなると言うのだ?
つーか、emacs 用コードを lisp スレに貼られてもなぁ…。
elisp の話は elisp スレのが相応しいような…。
>>57
前スレ後半あたりとか、別にemacs用コードじゃない clなコードが
ちょっと多めだったよ。あのあたりからじゃん、clネタのループって。
よっしゃ。そんじゃ、とりあえず 55 のコードを理想的な elisp スタイルに
書き直して loop に引導を渡してやれ!俺は while に展開されるなら、まぁ、
いいかなぁという気がしている。elisp らしいスタイルとやらをビシっと見せてくれ。
元コードって w3m-url-encode-string じゃないの?
ああ!もう! elisp は末尾再帰が最適化されないんだから話題の tail call はやめてよ!!
>>59
(defun my-url-encode-string (str &optional coding)
(apply #'concat
(mapcar (lambda (c)
(cond ((= c ?\n) "%0D%0A")
((string-match "[-a-zA-Z0-9_:/.]" (char-to-string c))
(char-to-string c))
((= c ?\x20) "+")
(t (format "%%%02x" c))))
(encode-coding-string (or str "") (or coding 'iso-2022-jp)))))
あ、(apply #'concat (mapcar (lambda ... は (mapconcat (lambda ...
の方がいいか。
elisp キターー。elisp 入門者の漏れは初めて mapconcat 使いどころがわかりますた。アタマイイ!
さすがに loop よりビルトインの mapcar や mapconcat のが速いですね。いや〜勉強になります。
elisp だと効率が大事なところは組み込みの map 系を使うのが最速ですかね?
ところでこーゆうときは mapconcat のセパレータは "" と nil のどっちがいいんでしょう?
elisp 上の性能なら ビルトイン > while = loop > 再帰 だろう。elisp レベルの
反復より C レベルの反復のが速いのは当然。再帰は…Scheme 化を待て。
同じシンボルで関数セル、変数セル、属性セルの
三つとも利用してるコードって結構沢山あると思うんだけど、
もしもし scheme化されたら、そーいうのってどうするの?
置換の関数使ってもいいんじゃない?
結構メジャーなパッケージでも、
複数に分けた方がいいような一つの関数が
必然性もなく長々続くことがあるので、
なんでこんな書き方するんだろうなーと思ってたが、
多数の人間で長い間開発してると、他の人への配慮もあって、
なかなか無闇に関数を整理できなくなってくるからかもと
思い始めた。
>>66
http://www.gnu.org/software/guile/docs/guile-ref/Symbol-Props.html
elisp からの変換用に、シンボルには関数スロットやプロパティスロットも
用意されてるよ。後はトランスレータの仕事。
変数、関数はともかく、property は関係無いでそ
guile-emacsって進んでるの?
がんがったけど、あきらめたのかと思ってたんだけど。
emacs21互換のguile-emacsは無いよね。
一応やってんのかな。
http://savannah.gnu.org/cgi-bin/viewcvs/guile/guile/guile-core/lang/elisp/ChangeLog?rev=1.11&content-type=text/vnd.viewcvs-markup
guile-emacs 0.1 で動くことはわかったので、Emacs 側への統合開始の条件である
Emacs Lisp との 100% 互換を目指してるはずだけど…
このペースだと使い物になるのは10年後くらいか。
guile-emacs といえば、lookup の作者はどうした
>>73
おごちゃんに弟子入りしてバリバリのコボラになってしまった。;_;
なんでリスパがコボルに。
>>74
lookupの開発は誰か引きついでるの?
>>74
相当の変人だと思っていたが、そこまで変人とは
どんなところが変人なの? >>76
>>75 Lookup が放棄されて有志が引き継いだのは有名な話。
>>76 匿名だからってそんなこと書いちゃいくないね。
>>78
のこのこ戻ってきて、また放り出したのも有名
lookup の現状がよくわからない
あんまり脱線すると「○○話は××スレで」とスレ奉行様のお怒りを買うぞ。
スレ奉行の話はスレ奉行スレで
うーん、はまった。
(defun foo (function)
(funcall function))
(defun bar (function)
(foo (lambda () (funcall function))))
(bar (lambda () (print "hoge")))
→(error "Lisp nesting exceeds max-lisp-eval-depth")
ここまで短くすればすぐわかるけど、実際はもっとゴチャゴチャなので、
なぜ動かないのかしばらくわからなかった。
せめて仮引数くらいは lexical scope キボン。
(defun bar (function)
(foo `(lambda () (,function))))
(defun bar (function)
(foo function))
>>85
それだと function じゃなくて cons を渡してることになる。
動作は同じだけどバイトコンパイルされない。

>>86
84 は単純化してる。実際はもっと複雑な処理をする高階関数からもっと複雑
な処理をする高階関数を読んでるので、その指摘は的外れ。
(defun bar (function)
(foo (byte-compile `(lambda () (,function)))))
>>88
byte-compile がコンパイルする引数は lambda。car が 'lambda のリストではない。
実際にそれで動くということと、そう書いていいかということは違う。
>byte-compile がコンパイルする引数は lambda。
lambdaってのはどういう意味なの?
ラムダ(λ)
lambda
<サイエンス‐単位・計測>
微小な体積を表すのに用いてきた単位で、一マイクロリットル、すなわち一〇億分の一立方メートルに
当たる。

10年くらい前、ワールドミュージック(死語?)の流れで瞬間的に流行ったダンス音楽。
>>84
仮引数の名前にプレフィックスをつけとく。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#cl-elisp-memo-lambda
前スレでも同じ話題がでてた。
84は実は今回嵌ったわけでもないが、話題作りのために
嵌ったふりをしているに一票。
# いや、参考になったけど。
elisp パッケージの発表場所で、有名どころは日本にある?
ドキュメントが英語なら gnu.emacs.sources でいいだろうけど。
XEmacs 専用パッケージは gnu.emacs.sources にはポストしにくいでしょう?
http://www.emacswiki.org/cgi-bin/emacs-jp.pl
とりあえずこのあたりはどうか。日本とは言えないかもしれないけど
>>97
> * 日本人制作 Elisp の公開場所の提供、
ここは良さそうだね。

http://www.emacswiki.org/elisp/index.html
elispパッケージの一覧もあるし。

各パッケージの先頭一行目に書かれている説明が日本語に翻訳されていると、
英語が苦手な人が選ぶときにいいとおもう。
;;; a-menu.el --- create a menu from a specified directory
これを
;;; a-menu.el --- 指定したディレクトリからメニューを生成する。
として一覧になっているといいなと。
あっ、俺がやればいいのか。
Nemacsも対象なのか。メモ用に併用してる俺のために、
M-x とか M-:でヒストリ使えるようにする elispとか誰か作ってくれないかな。
多分どこかのアーカイブに埋もれてそうな気もするが。
100ゲトズザ。
Nemacs Lisp と GNU Emacs Lisp の違いを一行で述べよ。
俺の超能力によると、Nemacs lisp = GNU Emacs19 Lisp + 日本語処理関連。
そうですか、誰にも相手をしてもらえませんか。
googleでちょろっと調べた感じでは、
Nemacs lisp = GNU Emacs18 Lisp + 日本語処理関連
みたいですね。
私はelispパッケージを開発するときは最低限度として、GNU Emacsの最新版と
XEmacsの最新版で動くように気をつかっているけど、さすがにNemacsまでは
手がまわらないという気持ちです。
Nemacsは趣味ですから。
ちょっと変更で対処できるならする。そうでないなら諦めるかな。
あのくらいの軽快さと lisp の拡張性があるのは
魅力的だね。
なんで今の emacs はあんなに重いんだろう。
タブ文字を含むときのカラム位置の計算にバグがあったのが致命的だったな
elispで「画面上での行」の概念を扱おうとするとハマるよね。
vertical-motionを使って、画面行単位の移動コマンドを書いたことあるんだけど、
タブなんかが入ってくると、もう気が狂いそうでした。結局、ユーザから文句が来た
ときだけ、場当たり的に対処するという泥縄になっています。
105が3人ぐらいまでに絞れたわけだが。
107105:03/11/27 09:51
イヤーン! トクメイのママでイサセテ....

>>103
> あのくらいの軽快さと lisp の拡張性があるのは
> 魅力的だね。
> なんで今の emacs はあんなに重いんだろう。
それがemacsに統合されたMULE部分のせいにされたりして怒っている西洋人もいるよね。

俺としてはelispするときに、MULEのおかげでcharacter型で多国語の文字を透過的に扱えるのが
非常にうれしい。まぁ、いまとなっては他の言語でもUnicode対応しているみたいだけど。
そういえば、Meadow2ではUTF-8が標準で扱えたな。やるなGNU Emacs21。XEmacsはどうだろ。
>>84-94 で扱っている問題って、有名なFunarg問題だよね?
>>103
Nemacsが出た当初から「軽い」と言われていたかは大変疑問です。
コンピュータでやってることのレベルは変わらんのに、
なぜソフトウェアは必要スペックがどんどん増えるんだろう。
> コンピュータでやってることのレベルは変わらんのに、

この仮定が間違っているから
というか、
emacs はコンピュータの処理能力の進化よりも重くなってはいない
と思う。
> コンピュータでやってること
昔: 2次元エロ画像でオナーニ
今: 2次元エロ動画でオナーニ
先: 3次元エロ動画でオナーニ
115デフォルトの名無しさん:03/11/28 09:08
>>114 一面の真理をついてるね。
>>113
> というか、
> emacs はコンピュータの処理能力の進化よりも重くなってはいない
> と思う。
おれもそうは思うけど、elispが強力すぎて、「これelispでできないかな?」->
「ちょっといじってみるか」 -> 「プロトタイプができちゃった」-> 「発表しちゃえ」
<- イパーン人:「遅せーよ。それにエディタのマクロ言語でそこまでやるか?」
という感じになることも多いのでは、webブラウザといい、psgmlとか...
psgml はいいから nxml 使え、と。
is nxml a replacment for psgml? http://mail.gnu.org/archive/html/help-gnu-emacs/2003-09/msg00568.html
nxmlの公式サイトがみつからないな...

James Clarkタソはelispのプログラムを発表するのはこれが初めてかな?
コードの質はどうだろう? (と無理にelispの話題へ)

nxml-mode.elをちらっと見ただけだけど、elファイルの慣習に従ったファイル書式だし、
docstringの書き方も先頭は短い1文でそのあとに長い説明という慣習に沿っているな。
まぁ、さえてる人は何をやらせても...ということかな?
関数や変数の定義文に書くdocstringの多国語化なんてのは話題にならないのかな?
アイデアとして本来のelispファイルとは別ファイルで各関数、変数の
日本語や他の言語のdocstringを定義できるという仕組みがあれば、
elispにそんなに詳しくないけど英語が読める人が、自分の使っている
コマンドのdocstringを片っ端から翻訳してそのファイルを配ってくれる
というシナリオもあるのでは?
>>118
ダンプ分なら、起動時にDocファイルへのポインターを書き換えるという実装
なら簡単そうだな。
>>119
> ダンプ分なら、起動時にDocファイルへのポインターを書き換えるという実装
>なら簡単そうだな。
ああ、Docファイルか... なんかそんなことやっていると聞いたことがあるような。
最初は実行時に食うメモリを小さくしようとしてやったという話だったような。

それだとDocファイルの翻訳を、一人で全部やるという話になりそうな気がする。
そうするとみんなビビって手を出したがらないような。とくに分かっている人ほど
自分が知らないコマンドの翻訳をするのを避けたがるような。

自分がよく利用するコマンドで何が起こるかよく知っている人が自信を持って、
翻訳する。そして、それが沢山、集積されて、よく使われるコマンドほど
翻訳が早くすすむというシナリオを頭に描いていますた。
この話題ってスレ違いじゃないよね?
そんな人間は翻訳なんてしたがらないと思うが。
そうすると信頼性も落ちるし、誤訳などのフィードバックと再配布をうまくやる
仕組みがないと難しいんじゃないかな。
XEmacs 方面で docstring にも gettext を使う作業してたと思う。
翻訳がどの程度進んでるか知らないけど。
>>121
> そんな人間は翻訳なんてしたがらないと思うが。
大量には翻訳をしたくないけど、気が向いたときにちょこっと
自分が良く知っているコマンド群の翻訳をやりたいって人は結構
いるような気がします。私もその一人ですし。

イメージとして翻訳の責任者が一人いて、誤訳や訳語などの調整、管理を行い、
各訳者はWikiみたいなシステムを利用してフラッと訪れては翻訳するという感じです。

現在たりないのは実は翻訳者ではなく、翻訳者たちの管理者なのではないかと思います。
訳語なんかもEmacsに関する文書(マニュアル、elispマニュアル、docstring, ...)の
日本語化ということできっちり決めてしまえば、(例えばbufferはバッファなど)
それこそelispでちょっとした自動翻訳もどきも実現してしまうのでは?
docstringなんかアテになんないからイラネ
そんなこと言うなよ。せっかく書いたんだからさ。
126デフォルトの名無しさん:03/11/29 13:18
>>124
> docstringなんかアテになんないからイラネ
これはelisperの反応としてはある意味で正常と言うか、
私もまず分からないことがあればコードを見ます。

ところが一般ユーザーはEmacsを文書作成のためのエディタとしてみているわけで、
elispの実行環境として見ているわけではありません。したがってelispのコードを
読む気も起きないでしょう。

現在、マニュアルは日本語に翻訳がされていますが、docstringはまだ日本語化
されていません。流れとしては、次に翻訳のターゲットになるのは、コマンドや
defcustom関連のdocstringや各パッケージのelファイルに書かれている ;;; Commentary:
部分ではないでしょうか?

Emacsに標準添付されているパッケージ群が英語で説明が書かれているだけで、
一般ユーザの目にふれないままになるのは、あまりにも、もったいないと思います。

ゲリラ的に、ウェブページ上で各パッケージの使用説明書を書いているボランティア
もいるみたいですけど。
;;; Commentary: は確かに日本語で読みたい事しばしばだな。
どっちかというとユーザとして読む事が多いから。
こうした考え方の行く先には、コマンド名、変数名の日本語化という課題もありますね。
それが良いことかどうかは、判断が分かれるでしょうけど。
>>128
別に変数や関数の名前を国際化せんでも、docstring を国際化する仕組みさえ作れば、
Costomize に全部放り投げれるやん。
国際化するために一々変数やら何やら書換えてたらプログラマが逃げ出すぞ。
>>129
> 国際化するために一々変数やら何やら書換えてたらプログラマが逃げ出すぞ。
たしかにそうなのですが、コマンド名くらい日本語でも...
普通のアプリケーションのメニューは日本語化されるのが通例だし...

あと、純粋にプログラマとしての考えでは、関数、変数のための気のきいた
英語名を考えるのってかなり苦労しませんか? ネイティブスピーカーでは
ないのだし。

だったら日本語なら適切な変数名を思いつくのかと言われれば、
「やってみなければ分からない」とこたえるしかないですね。

表計算やデータベースなどのマクロ言語を使ったプログラミングでは
変数名などに日本語が使われている歴史がありますよね?
別に今でも

(defvar てすとメッセージ "日本語の関数、変数名のてすと")
(defun てすと ()
(interactive)
(message てすとメッセージ))

ぐらいなら出来るけどね(^^;;
>>131 あっ、できるんだ。じゃどうせ英語でドキュメント書かないつもりなら、
日本語でプログラミングしてもいいですね。ウソウソ、デモ、チョットホンキ。
ローマ字で名前をつけてるやつもいる
ローマ字で書くと昔のベーシック見てるみたいで
かっこ悪くない?
(defun ni-bai (atai)
(* atai 2))

(ni-bai (ni-bai futon))
日本語で書くと、既存の関数と混ぜたときに激しくキモい
ひたすら defalias するとか。

(defalias '関数定義 'defun)
(defalias 'もし 'if)
(defalias '小さいか等しい '<=)
(defalias '一引く '1-)
(関数定義 竹内関数 (甲 乙 丙)
(もし (小さいか等しい 甲 乙)

(竹内関数 (竹内関数 (一引く 甲) 乙 丙)
(竹内関数 (一引く 乙) 丙 甲)
(竹内関数 (一引く 丙) 甲 乙))))
変数名なんて、よっぽどうまくやらないと趣味の悪い訳語になると思う。
ただでさえオープンソースものの日本語訳の質は貧弱なのに。

あと、ほとんどのシンボルはいくつかの単語を`-'でつないだものだったりするが、
「ほげ-もげ」……美しくない。入力もしにくい。

>>130みたいな日本語キチガイの伝でいけば、Excelの関数も日本語になってないのでまずそうだが、そっちはいいのか?
138デフォルトの名無しさん:03/12/01 07:53
>>134
> (* atai 2))
atai を atoi (ascii to integer)と見間違って数秒間だけ思考がとまりました。
たぶんプログラミング中は、頭が英語モード(省略表記の展開機能付き)になっていると
思われます。

>あと、ほとんどのシンボルはいくつかの単語を`-'でつないだものだったりするが、
>「ほげ-もげ」……美しくない。入力もしにくい。
これは日本語にあったトークンのつなぎ方の研究も必要でしょう。

> >>130みたいな日本語キチガイの伝でいけば、Excelの関数も日本語になってないのでまずそうだが、そっちはいいのか?
これも時の流れの中で決まると思いますが、素人の視点にたったとき、
なんでプログラミング言語は日本語を使わないの? という疑問はいつまでも残る気がします。

「プログラミング言語では国際語である英語を使うのが普通になっているおかげで、国際的に
通用するソースコードになっていい。」という意見には、「じゃぁ、最初から、みんなで英語を
使って生活する?」ということを聞いてみたい。

すくなくとも、個人が書き捨てにするようなプログラムでは日本語でプログラミングできてあたりまえという考え方が
なさすぎる気がします。

とはいうものの、big, small, large, one, two, ... などアルファベット表記されている単語でも
ほとんど日本語になってしまっているものもありますね。
これは極端な例ですが、charがcharacter、intがintegerの略だと分からないような人ってもしかして、
結構、初心者には多くないですか? 侮りすぎですか?
そして説明されても「intはintegerの略です」-> 「integerってなに?」みたいな。
「integerとは整数です」という説明が英語圏の人より1つ余分に必要になりますね?
この手の余分に教育にかかる手間の総量はどのくらいでしょう?

インドに優秀なプログラマが多いと噂に聞きますが、あそこのプログラマたちは
英語がペラペラですよね?
140ヽ(´ー`)ノ:03/12/01 08:59
>>138
いや、だからさ、国際化なんて UI で解決すればいいし、そうすべきモノでしょ?

> 「プログラミング言語では国際語である(以下略)聞いてみたい。
日常生活と不特定多数の人間が読むコードを一緒くたにする神経が俺には信じられん。

もう一つ重要な(というか、当然の)事、肝心のコーディングの事を考えてない。
ある日本人が日本語を使ってコードを書き、自分のコードを GPL で公開しました。
そのプログラムが気に入ったギリシャ人のオッサンは特定の機能がギリシャ語では
うまく機能しない事に気が付き、修正する事にしました。

1. 日本語フォントをインストールする
2. 日本語入力をするために IM を入れる
3. 使っているツール(エディタ、コンパイラ、etc) を国際化対応させる

この論理で行くと、優れたプログラマはフランス語もドイツ語もハングルも日本語も、
そして勿論英語も知ってなきゃいけない。少なくともオープンソースにおいては
英語でコード書いた方が可搬性/生産性が高くと思うんだけど、どうよ。
そもそもクローズドならそもそも初心者のために変数名を多言語化する必要ないし、
その上、自分達のコードを日本語やローマ字で書くという選択肢は以前として存在する。

プログラミングを勉強したい初心者ならついでに英語も勉強してくらはい。
main, this, class, get/set, print とかなら中学生でも分かるでしょ。
別に TOEIC 700 点以上取らないとコードが書けないって訳でもなし。

>>139
「int = 整数」でいいじゃん。それなら一段階。
なんで int なの?って説明を求められた時に始めて答えてあげれば良い。
>>140
> 英語でコード書いた方が可搬性/生産性が高くと思うんだけど、どうよ。
> そもそもクローズドならそもそも初心者のために変数名を多言語化する必要ないし、
> その上、自分達のコードを日本語やローマ字で書くという選択肢は以前として存在する。
いやお説ごもっともです。異存はございません。それを踏まえての、あえてしてみる、
思考実験として書きました。

> 「int = 整数」でいいじゃん。それなら一段階。
> なんで int なの?って説明を求められた時に始めて答えてあげれば良い。
int = 整数を覚える手がかりがまったくありませんね?
極端に話題を振るのが好きな私としては「BooFooWoo = 整数ね」といわれて
なっとく出来るのかなと。ネイティブスピーカーなら「integerを略してintと書くのね」
と即座に納得できるだろうし。

英語と日本語との違いという面では、漢字が我々の脳へ訴える力、
例えば、planeより面、axiomより軸、interfaceより界面のほうが、
われわれの心に響くのでは?

以上を書いてきたのは、「変数名を日本語にしてみたらどうだろう」->
「気でも狂ったか?」的なやりとりをいくつかの場面で目撃してきたからです。
現時点で日本語を使ったプログラミングが現実的だとは思っておりません。
ですから、私もプログラミングするときは英語を使っていますし、必死に
勉強しております。
初心者のとき、void の意味が分からなかったなぁ。
初心者のとき、引数の意味が分からなかったなぁ。
143141:03/12/01 09:29
あっと、今になって気づきましたが、変数などを「国際化」という枠組みの
中で多言語化して欲しいという論点では書いておりませんでした。

いちプログラマとしてプログラミングをする立場で、英語が出来ない/嫌いな
凄腕プログラマという人もいるだろうに、現在の状況ではそういう人は
活躍の場がせばめられられて、世間的にももったいないと思っていたからです。
実際に、英語嫌いな冴えてる友人がいたことも、そう思った理由の一つです。

いちじるしくスレ違いで申し訳ない。>> all
voidは何かfj始めてわかったなぁ
>>142
> 初心者のとき、void の意味が分からなかったなぁ。
> 初心者のとき、引数の意味が分からなかったなぁ。
だから、用語を決めるときの重要性はあなどってはならないと思います。
英語では、学術的な用語と一般的な用語との乖離が日本語ほどはなはだしくは
なかったと思います。
ここで気が利いた例を挙げればいいのですが浅学のためあげられません。
あくまで私がそう感じていると言えるだけです。

プログラミングに関して私が尊敬しているある人がプログラミング能力を
高めたかったら、英語を死に物狂いで勉強しろといった意味は、とうぜん
資料が英語だからということを指しているのでしょうが、総合的に、今、
プログラミングをするということは、英語とは切り離せないことだと思っています。

>>140
日常生活と不特定多数の人間が読むコードを一緒くたにする神経が俺には信じられん。
同じ言語コミュニケーション活動というくくりで考えています。
実際このやりとりも、日常生活の延長ですが、不特定多数の人間、たとえば、
エチオピアの人たちも読んでいるかもしれません。

そして将来的には、コンピュータがこの過去ログを読んで意味を理解した上でなんらかの処理を
するという可能性もあるわけです。

トンデモでスマソ。
覚える手がかりって別になくてもいいんじゃないの?

第一、英語を学習する際に integer = 整数 だって覚える手がかりはないじゃない。
トンデモっていうか、何を主張したいのか分からないよ。

>いちプログラマとしてプログラミングをする立場で、英語が出来ない/嫌いな
>凄腕プログラマという人もいるだろうに、現在の状況ではそういう人は
>活躍の場がせばめられられて、世間的にももったいないと思っていたからです。
が主張なのなら、>>140
>プログラミングを勉強したい初心者ならついでに英語も勉強してくらはい。
>main, this, class, get/set, print とかなら中学生でも分かるでしょ。
で解決。

elisp に関係ない話はこっちでやってくれ
http://life.2ch.net/test/read.cgi/yume/1069749452/l50
>>147
> トンデモっていうか、何を主張したいのか分からないよ。
主張というほどのものは無くて、elispの国際化から端を発した
世間話のつもりだったけど、度がすぎましたね。

> elisp に関係ない話はこっちでやってくれ
おっしゃるとおり。すみませんでした。

イタチの最後っ屁ではないですが...
>>146
> 第一、英語を学習する際に integer = 整数 だって覚える手がかりはないじゃない。
だから概念構築からやらなければならないので、英語学習が大変なのです。
という訳でelispのdocstringの多国語化は、
>> 122
> XEmacs 方面で docstring にも gettext を使う作業してたと思う。
> 翻訳がどの程度進んでるか知らないけど。
という感じかなとは思うけど、Commentary:部分はどうかな?
徐々にマニュアルに取り込まれているという感じかな?
Commentary: 部分を自動抽出してマニュアルに入れるという
方法も考えられるね。そうすれば、わざわざelファイルを覗く
必要もなくなるし。いま、elcファイルだけを配るLinux
ディストリビューションってあるよね?
そういや英語圏の人はプログラミング言語が英語なのをうれしいと思ってるのかね
本などでプログラミング言語の説明をするときキーワードを一々イタリックにしたりね

もし変数名やキーワードが日本語になると
API ドキュメントなどで日本語キーワードを「」で囲んだりすることになるかもね

>>141
> 以上を書いてきたのは、「変数名を日本語にしてみたらどうだろう」->
> 「気でも狂ったか?」的なやりとりをいくつかの場面で目撃してきたからです。

日本語は助詞が複雑だよ?
(´-`).。o(…cons とか cdr とか、どうやって訳すんだろう…)
> 英語と日本語との違いという面では、漢字が我々の脳へ訴える力、
> 例えば、planeより面、axiomより軸、interfaceより界面のほうが、
> われわれの心に響くのでは?
なんかそこはかとなく不吉な文章だな…。界面のほうが心に響くか?
「界面って?」「interface の事」みたいな会話が飛び交いそうだが…。
まぁ、あれだ。ローカライズは各国でがんがってくれと。だって、漏れ
英語でもヒィヒィいってんのにサンスクリット語の変数名に悩む未来はイラネ。
(´-`).。o(…合体 とか 体 って訳すんじゃないかな…)
>>149
> 方法も考えられるね。そうすれば、わざわざelファイルを覗く
> 必要もなくなるし。いま、elcファイルだけを配るLinux
> ディストリビューションってあるよね?
昔、debianを使っていたのですが、たしか、elファイルとelcファイル
は別パッケージだったような気がします。今はどうなのだろう?

>>150
> そういや英語圏の人はプログラミング言語が英語なのをうれしいと思ってるのかね
>本などでプログラミング言語の説明をするときキーワードを一々イタリックにしたりね
厳密な定義はプログラミング言語内で規定されているのは、当然としても、
なんらかの、脳みそへの引っかかりのようなものがあるから、英語のキーワードを
使っているのではないでしょうか? ある意味では数学の+, -, などはそういう意味では
英語vs日本語という観点からは中立的といえるのかもしれません。

> 日本語は助詞が複雑だよ?
手始めに名詞レベルでの日本語化はどうだろうと思います。
また、助詞の複雑さといってもそれを利点に変えるチャンスはあるのでは?

>> 151
> (´-`).。o(…cons とか cdr とか、どうやって訳すんだろう…)
英語でもなんじゃーこりゃー!的な、もうすでに意味がとれない単語が
沢山あるのは承知しています。Cobolでの実験もしっているつもりです。
触ったことないけど。
NullPointerException
空指標例外
言葉が英語から日本語への翻訳という枠組みからでてくるという思考を一度、
はずしてみたらどうだろう?
ただ実質的に「NullPointerException」は、プログラミングの世界では「日本語」と
言ってもいい存在に「現在は」なっているということは分かります。

>NullPointerException
>空指標例外
あきらかに漢字圏の人間には「空指標例外」の方が何なのか連想しやすそうですね。
これが名前としてふさわしいという意味ではないです。もっとよさそうなのがあるでしょう。

>>152
> なんかそこはかとなく不吉な文章だな…。界面のほうが心に響くか?
バレましたか、私も界面はどうだろうと思いますが、激賞する人もいるので
書いてみました。

elisp万歳!
>>154
> 昔、debianを使っていたのですが、たしか、elファイルとelcファイル
> は別パッケージだったような気がします。今はどうなのだろう?
今でもそう。Emacs単にインスコしただけじゃ el は入らない。

>>156
> これが名前としてふさわしいという意味ではないです。もっとよさそうなのがあるでしょう。
略して「カラシ」とか。
NullPointerException
ぬるぽ
# なんかすごく伸びてるが

>>136
special form に対しても defalias出来るんだ、
と当然の事に感心してしまった。
国際語がマルチバイトな言語だったり、コンピュータの発達した国が
そーいう圏内だったらどうなってたんだろう。
<ヽ`∀´> コンピュータの起源はウリナラニダ。
ソースコードはハングルで書くニダ。とか?
ウリナラにLisperっているの?
なんか、すんごいのびてると思ったら、英語を異常なほど嫌ってる基地外が暴れてるだけかよ
基地外というほどではないと思うが、
実際英語以外の言語で実用的なプログラミングは
あまり行なわれていないな。
日本語の場合は文字コードがまるで違うので別の問題があるが、
独仏のプログラマなんかはどんな感じなんだろ。
独語の関数とか、やはりキモい感じがするのかな。
視点が興味深いので貼ってみます。

----

情報技術者の定義
http://www.ne.jp/asahi/bdx/info/jp-cyberscope/jp-cyberscope-20010321.html
> 最近の意見交換の中から、昔から思っていることで
> ここに書いていなかったことをまとめておく。反論歓迎。

> * コンピュータ技術は本質的にアングロサクソン文化の
> 継承物であるため、基本的にその中心言語は英語となる。
こんなののどこが興味深いんだか……。
そろそろスレ違いも飽きたので、これ以上やるならどこかにスレ立ててやってくれ。
MIND とか AppleScript とか知らんのけ?


  ス  レ  違  い  は  他  板  へ


関連リンク: http://life.2ch.net/
蒸し返すようで悪いのだがC-b, C-fが

C-u 後ろ
C-m 前

なんてキーバインドだったら絶対にemacsなんて使わないからな。
>>170
キーの並び的に C-b, C-f より自然に見えるけどな
C-mが改行に準じる動作以外に割り当てられるのはさすがにいやすぎかと。
>>172
それは Emacs や readline がそうなっているのに慣れたからだと
はあ? Emacsとreadlineだけしかものを知らん奴というのも珍しいな。

僕は矢印キーしか使わないのでNP
>>174
知らないけれど他にどんなのがあるの?
MS-Winのメモ帳とかedlinとかWordstar系とかviとか。
TECOもそうかも。
N-88 BASIC
Ok
メモ帳がC-mで改行できるのしらなかた。おしえてくれたエロい人アリガトウ
>>179 制御文字コードを規定したISO規格で決まっていたでしょう?
Emacsのキーバインドだってそれにそったものだよね。
だから何らかの形の日本語化が行われるとしても、規格にそむいた独自路線を
走ることはないでしょう。
>>180
そういや UNIX 系 OS では改行が ^M って表示されるな
Windows 上の C-M はそれに追随したものだと思っていたのだが
ISO 規格だったのか…

ところで Emacs は ^H をヘルプにして潰してるけど何でよ?
knee-jerk reactionでは、"H"elpから?
Emacs は UNIX 生まれじゃないしな
UNIXでの改行は LF(^J) だよ。
ここにいるやつの程度が知れるな。
悪い、間違えた。
http://pc.2ch.net/test/read.cgi/prog/1069868102/
このスレと勘違いして煽り入れて書いてしまった。スマソw
>>184
画面出力の改行のことではなくキー入力の改行の話
elispといえば、guile-emacsってどうなの? 既存のelispプログラムを実行できる
くらいの互換性は確保しているの?
RMSもなんだか、現行のEmacs Lispを大幅に変更する気が本当にあるのかなという
気がする。だいたいschemeに変更したからって得られるものは何よ?
現在のEmacs Lispを若干補正するくらいで、どうにかなるのじゃないの?
とりあえず、packageの導入。Lexical scoping あたりかな?
先生!。Scheme君で独自拡張路線を走るよりも、どうせならMacLisp系列ということで
Common Lisp君を見習ってしまった方がよいと思います。もう遅いのでつか?
だれがRMSを説得するかという問題。
http://mail.gnu.org/archive/html/emacs-devel/2002-08/msg00372.html
From: Richard Stallman
> Guile is the standard extensibility package of the GNU Project, All
> GNU packages that include an interpreter for extensibility are
> supposed to use Guile. It is inconsistent for Emacs not to support
> Guile.
>
> It would not make sense to replace Guile with Emacs Lisp in everything
> else.
つまり、将来的に Guile をサポートする *ことになっている* のは技術的理
由からではないのです。
君の〜、行く道は〜、果てしなく遠い〜...
というguile-emacsの進化とは別問題として、Emacs Lispの進化は続くでしょうね...
とりあえず、packageシステム入れろ矢ゴラッァ! 互換性とるのなんか簡単だろ!
パッケージ書くのが苦痛なんだよ!

あっ、俺がやればいいのか...
elisp packageシステム開発する -> emacs開発チームへ相談 -> RMSに相談 -> >>189
193デフォルトの名無しさん:03/12/04 10:09
gccの移行はうまくやったよな。あれは関係者はそうとう慎重に事を運んだって噂だね。
つまりRMSがEmacs改良のボトルネックになってるのか?
RMSクラスだと「そういうことも全て考えた上で判断している」可能性も
否定できないので、難しい。
>> 189
> だれがRMSを説得するかという問題。
竹内郁雄先生になんて、お願いできないの? お友達同士でしょ?
emacsでシェルを起動するとdos窓がタスクバーに表示されないのは
どういう仕掛けなん?
良く知らないで書いているのでアレですが、XEmacs ではダメなんですか?
Who Wrote にも RMS は入ってないし。
RMS=DQN
200ヽ(´ー`)ノ:03/12/05 15:49
しばらくしたら temp-buffer を勝手に閉じてくれる lisp があった気が
するんだけど、どないしても探せないのですよ。誰か知らね?
どうやって temp-bufferかそうでないか判断するの?
with-temp-buffer の事じゃないよね?
202ヽ(´ー`)ノ:03/12/05 19:10
>>201
レスどもー。

キー入力があると *Completions* とかを閉じてくれるものなんで、
with-temp-buffer では無いと思われ。

momentary-string-display の temp-buffer 版っぽいようなことを
hook でやってくれるようなモノだったと記憶してるんだけども、
記憶が曖昧で(;´Д`)。

頑張って自分で作ってみます。

>>202
http://www.geocities.co.jp/SiliconValley-Oakland/7673/
ここの lcomp.el は?
自分は自作コード使ってるけど(ヘボいが自作なので)。
204ヽ(´ー`)ノ:03/12/06 10:41
>>203
あ、それです、それです。ありがとう。
205デフォルトの名無しさん:03/12/09 10:47
ひまつぶしに、バイトコードコンパイラをイジくろうと思うんだけど、
バイトコードの定義って"(elisp)Disassembly"で少し紹介されているだけで、
正確な定義ってbytecomp.elを読むしかないのかな?
GNU Emacs と XEmacs で非互換のバイトコードもあるよね?
んなやる気のないやつにイジられてもね。
まあコンパイラよりは先にVMの実装読んだ方が早いよ。
>>206
>まあコンパイラよりは先にVMの実装読んだ方が早いよ。
src/bytecode.cをすこし読んでみたんだけど、これが2千行以下で
このくらいなら遊びで自作VMを乗っけてみるのもオツかなと
思いました。いやドラゴンブックを読んでいるもんで。

バイトコンパラは何か改良の余地はあるのでしょうか?
目標があったほうが弄りがいもあるでしょう?
あのVMはいくらでも改良できるから、適当なCPU上でJITで
動かせる様にしたりすると大勢の人間に喜ばれるかもね。
コンパイラの改造としてはレキシカルスコープにしてみたりとか。
RMSは怒るかもしれないケドさ。
関係ねえもんな。
レキシカルスコープになったら動かない自作のコード沢山ありそう...
>>208
> あのVMはいくらでも改良できるから、適当なCPU上でJITで
> 動かせる様にしたりすると大勢の人間に喜ばれるかもね。
ドラゴンブックの範囲を超えるな...だから面白いのか...

> コンパイラの改造としてはレキシカルスコープにしてみたりとか。
これは、lexical-letがclにあるからハックバリューが低いような。

> RMSは怒るかもしれないケドさ。
> 関係ねえもんな。
わらた。
elispにCommonLisp風パッケージを追加するのは、intern類にadviseすれば
簡単にできると思ってやってみようと思ったけど、read, load, などCで
書かれたprimitive群は、Cで書かれたinternを直接呼んでいるようなので、ダメですね...
   elisp: (intern name &optional obarray) => symbol
common-lisp: (intern name &optional package) => symbol, status
と引数までそろっているのに...残念。
>>211
Vobarrayをコピって差し換えればいけるかも。
面倒だけど。
(let* ((obarray (make-obarray てきとー)))
(read ...)
(exportするシンボルをVobarrayに書き書き))
みたいな?
あのぅ…… すみません。
「ドラゴンブック」って何でしょうか? ググってみても「富士見ドラゴンブック」
くらいしか出てきません。あきらかに無関係ですよね、コレは。
215214:03/12/15 04:21
たぶんコレの事ですね。探す努力が欠けてました。本当にすみません。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4781905854/
日本語版のカバーにドラゴンはすんでいるのかな?
217デフォルトの名無しさん:03/12/15 19:05
質問です。
大学のPCでemacsを使っていると、「#include」や「int」とか「printf」とか打つと文字色が変わるのですが、
自分の家のvine linuxに付いていたemacsを使うと色が変わりません。そうやったら変わるのでしょうか?
もし設定等ありましたらお教えください。宜しくお願い致します。
(global-font-lock-mode t)
>>217 微妙にスレ違い。
ここはEmacsの設定スレではありません。テンプレにも書いてあるでしょ。

バージョンすら書いてないけど、メニューがあればメニューから選べるはず。
別の方法としては ~/.emacs.el (ないしは ~/.emacs)に
(global-font-lock-mode t)
と書いておくことかな。

次からはLinux板(になければUNIX板)のEmacsスレへどうぞ。
Linuxの各ディストリビューション、とりわけVineLinuxでは
他の環境のユーザが知らない独自設定がされている場合が多いので、
Linuxでの話はLinux板で聞く方がよいです。
220デフォルトの名無しさん:03/12/15 20:49
>>291
 そうでしたか。どうもすみませんでした。
そして答えていただきありがとうございました!
CLパッケージで定義されているlexical-letについて質問です。
(lexical-let bindings body)において、bindings中の変数をgensymで作成した
uninterned symbolで置き換えることによって、lexical-scopingを実現している
んだろうなと思ったのですが、こんどはそれを参照する側のbody中の各フォーム
で元の変数への参照を、先のgensymで作成したシンボルに置き換えなくては
なりませんね? これって異常に大変そうなのですが、ほんとにそうやっているの
かな?
そんなことしてないんじゃないの?
シンボル名の完全な置き換えなんてマクロを全部展開した上でないと無理だし、
コンパイル時に行わないと時間掛かりすぎるし。
でも、こんな感じなんだよね...
(macroexpand '(lexical-let ((a 10)) (+ a a)))
(let ((--a--95409 10)) (+ (symbol-value (quote --a--95409)) (symbol-value (quote --a--95409))))
ほんとにそうしてるよ。
cl-macroexpand-all 使って、全部展開して置き換えてる。

肝は lambda 式の変換だと思う。
(lexical-let ((foo 1)) (lambda (n) (+ n foo)))

(lambda (&rest --cl-rest--) (apply (quote (lambda (G56371 n) (+ n (symbol-value G56371)))) (quote --foo--) --cl-rest--))
みたいになる。
コンパイルしないと遅いんだろうね、たぶん。
CLパッケージのマニュアルにも、定義している関数外にクロージャを
持ち出さない限り、普通のLetを使うべしみたいなことが書いてあったと思う。
226デフォルトの名無しさん:03/12/16 22:19
Emacs LispでCLの範囲指定コメント#|〜|#って作れないでしょうか?
>>226 Emacs LispにはCLにあるreadtableという仕組みがたしかなかったと思うので
実現するには、Cレベルでいじる必要があるのではないでしょうか。
ところで、#|〜|#ってどんな場面で重宝しますか?
228226:03/12/18 18:36
>>227 レスどうも.無理っぽいですか…
.emacs内の一連の動作を一時的に無効にする時にあると便利だと思いますけど.
C++で言えば;が//,#|〜|#が/*〜*/にあたります.(一応)
(ignore "〜") とか。
(when nil 〜) とか。
(quote 〜)
ブロックの最後に適用したいときにダメじゃん
贅沢言うな。
prog1
>>228
>.emacs内の一連の動作を一時的に無効にする時にあると便利だと思いますけど.
慣れとは恐ろしいもので、私の場合、行頭に;;を複数行にわたって入れるだけで
今のところ不便を感じません。ただ
(or (test1-p foo)
(test2-p bar))
で、(test1-p foo)を殺すのは
(or ;;(test1-p foo)
...)
でいけますが、(test2-p foo)を殺すときに、
(or (test1-p foo)
;;(test2-p bar)
)
と最後のカッコを移動するのが面倒だと思うことがあるので、最初から
(or (test1-p foo)
(test2-p bar)
)
と書くことがあります。
(when nil ...)
などコードの解釈で、無効にするやりかたは、色がコメント色にならず、
意味が分かりづらいのでほとんど使いません。
リージョンをコメントアウトするコマンドとかありそうだ
あるとしたら実質#|〜|#と同じ機能だよね。
調べたらありますた。comment-region, uncomment-region
|(or (test1-p foo)
| -!-(test2-p bar)-!-)
-!-と-!-がregionとしてこの状態で、M-x comment-regionすると、
|(or (test1-p foo)
| ;; (test2-p bar)
| )
になりました。これであしたはホームランだねパパ。ありがとう。
キモチワルイね。
基本的なとこはCommonLispに習うべきだと思うなあ・・
#|〜|#はネストもできるんだぜ?
所詮エディタに付属の言語
>>238
>基本的なとこはCommonLispに習うべきだと思うなあ・・
これは賛成。

>#|〜|#はネストもできるんだぜ?
現状での解決策は、
;; ;;(foo)
;; ;;(bar)
;; (buz)
というように行を分けて書くしかないのかな?
;; ;;(foo)
;; ;;(bar)
;; (buz)
このやり方で、コメントを外すときとコメントにするときは、
C-x r d (delete-rectangle)とC-x r t (string-rectangle)を私は使用しています。
みなさんはどうですか?
>>241
おなじく。C-x r k の方をよく使うけど。
kill-rectangle-saveが欲しい……
>>241
C-u M-x comment-region
advice.elのドキュメントって長いな…。誰か訳してないものか。
私はadvice機構をElisp Manualの"(elisp)Advising Functions"ノードで学習しましたが、
まぁまぁ分かりやすいですよ。日本語訳されていないのかと思ったら、されていますね。
それとも、そんなこと知っててadvice.elファイル内のCommentary部分の話をしているのでしたら、スマソ。
"abc" という文字列から、"abc-1","abc-2","abc-3"といった
関数名を生成してコールすることは可能でしょうか?

よろしくお願いします。
可能。
教えてください (>_<)
>>246
事故解決しました
(funcall (intern "abc"))
250246:03/12/22 03:22
連続質問失礼します。

文字列から生成された関数monyoに値をsetfしたいのですが
失敗してしまいます。

どこがまずいのでしょうか?
申し訳ありませんが、教えてください。

(defmacro monyo (a)
`(car ,a))

(let* ((data 'c)
(li '(a d))
(func "monyo"))
(setf (funcall (intern func) li) data)
(print "~S" li))

何がしたいのか分からん。
何がしたいのか良くわからんが、マクロはfuncallできないにょ。
lambdaで囲め < マクロの funcall
>>250
macro は先に展開されるから、 setf には (funcall (intern func) li) が、展開されずに渡される。
これが (car li) に展開されることは実行時まで予測できないから、 setf がうまく展開できないと思う。

compile しない場合なら、 funcall とかの setf method 定義してけばいけるかな…
>>250 やりたいことがいまいち読みきれないので何ですが、
setfというちょっと複雑なしくみより、すなおに
Function: fset symbol definition
を使えば考えがまとまりやすくなりませんか?
そしてmanyoをマクロにしたい気持ちの理由はなんでしょう?
256250:03/12/22 11:42
お騒がせしてます(>_<)

やりたいことは"文字列で渡された関数名に対応した関数に、
値をsetfすること"です。
下記S式の"monyo"にあたる部分を文字列にしたいのです。
monyoはマクロでも関数でもかまいません。

(setf (monyo li) 'c)

わかりづらい説明ですみません…
よろしくお願いします。

(let ((name nil)) (set (intern "name") t) name)
=> t

setf 使いたがってるのはCommonLisperだから?
>>256
>やりたいことは"文字列で渡された関数名に対応した関数に、
>値をsetfすること"です。
手順1: "monyo"という文字列がnameという変数に設定された。(setq name "monyo")
手順2: 関数"monyo"を定義する。(fset (intern name) #'(lambda (arg) (car arg)))
手順3: (setq list (list 'a 'b)) => (a b) (setf (monyo list) 'x) => x, list => (x b)
が機能するようにしたい。
手順4: CLパッケージのマニュアル"(cl)Customizing Setf"にある定義用マクロ
defsetfかdefine-setf-methodで定義する。defsetfの簡単な方を使うとき。
(defun defsetf-name (access-fn-name update-fn)
(eval `(defsetf ,(intern access-fn-name) ,update-fn)))
を定義しておく。
手順5: 動的に(defsetf-name name 'setcar)を呼び出す。

どう?
259258:03/12/23 13:36
チェッ、ニゲラレタカ。。。
>>256
>下記S式の"monyo"にあたる部分を文字列にしたいのです。
>monyoはマクロでも関数でもかまいません。
>(setf (monyo li) 'c)
字面のとおりに解釈したとして、(setf ("monyo" list) 'c)が機能する
ようにしたいとしたら、setfをいじるしかないな。
>>258
返事が大変遅くなり、申し訳ありません。

早速教えていただいた方法を試してみたのですが、
この方法だと"monyo"がBlack Boxのとき利用することが
できません(T-T)。

手軽に実現する方法はないのでしょうか…
(複雑に実現する方法もわかりませんが^^;)
>>261
>この方法だと"monyo"がBlack Boxのとき利用することが
>できません(T-T)。
black boxという意味は実行時に文字列の正体が決定されるという意味ですか?
たとえば、ユーザーに入力してもらうので、あるときは"monyo"次は"boyoon"とか?

"monyo"がblack boxのとき、その関数としての定義はいつ決定されますか?

恥ずかしがらずに、こちらの手がかりとなりそうなことを、できるだけ具体的に
ずらずらと書いてみてください。最終的にどういうコードがどういう結果を返せば
満足なのかとか。

もしかしてネタ? ツラレテモイイヤ。
関数に値をsetfするっていうのが分からん

(setf (funcall (intern func) li) data)
これはliが(c b)になってほしいってこと?
(defmacro monyo (a)
`(car ,a))

(let* ((data 'c)
(li '(a d))
(func "monyo"))
;; (setf (funcall (intern func) li) data)
(eval `(setf (,(intern func) li) data))
;; (print "~S" li))
(print li))
>>264さんの方法で関数monyoにsetfすることができました!

みなさんありがとうございました^^
あの、今 elisp-intro-jp 読み進めてて
Cutting & Storing Text (テキストのカットと保存)
の演習問題にさしかかってます。search-forward の実装が課題の
ようですが、いくら正規表現ぬきでいいとはいえ、これっていきな
り飛躍しすぎじゃないですか?立往生してます。

とりあえず考えたのは 引数の文字列を対話的に受取って、それを
1文字ずつに分解、そんで1文字サーチしてマッチしたら次の文字
も連続してマッチするか調べていく。。っての思いついたんだけど
変かな?
比較を減らす方法がいくつかあるので、一度調べてみては?
search-forwardを使って検索して見つかったら
ポイントを移動してメッセージを出す問題だと思うけど。
>>268
そういうことでしたか。
(defun my-search-forward (word)
"my-search-forward"
(interactive "sSearch Word: ")
(if (search-forward word nil nil)
(message "Found!")))
こんなんでいいんですかね。とりあえず動いてますが。

次の問題が
* キルリングに第3要素があれば、それをエコー領域に表示する関数を書いてみよ。
キルリングに第3要素がなければ、適切なメッセージを表示せよ。

こうなってるんですが問題の意味がよく分かりません。第3要素
ってなんのことでしょうか。プログラム以前に国語の問題ですね。。

search-forward 本体の実装を勉強するときには>>267さんの
こと調べてみたいと思います。
(message (or (nth 3 kill-ring)
"ネーヨ"))
>>270
サンクス!!
<>で囲まれた文字を抜き出したいんですがうまくいきません。
(defun my-get-tag ()
(interactive)
(let ((search-word-beg "<")
(search-word-end ">")
beg end get-list)
(save-excursion
(while (search-forward search-word-beg nil nil)
(setq beg (1- (point)))
(search-forward search-word-end nil nil)
(setq end (point))
(copy-region-as-kill-nomark beg end)
(setq get-list (cons (car kill-ring) get-list))))
get-list))
とりあえず抜き出したタグを get-list に保存していくところ
を完成させたいんですけど get-list が空っぽのままです。
kill-ring には追加されてるんですが、なぜなんでしょう?
267の個人情報が暴かれそうです。
>>272
とりあえず実行してみたけど、ちゃんと抽出してるみたいだよ?
copy-region-as-kill-nomark って関数がなかったから copy-region-as-kill にしたのと、
error になるから search-forward の第三引数 t にしたけど。
; search-forward の第三引数の意味って、処理系依存だったりするのかな…

ところで get-list が空っぽって、どうやって確認したの?
>>274
成功してるんですか。関数の最後に get-list を置いてるので
M-x my-get-tag で呼びだしたら現在のバッファに get-list の
中身を表示してくれるのかなーと思ったんですが。
>>275
(insert (car get-list))
したらちゃんと表示されました。勘違いしてたみたいです。
すみません。

ところで GNU Emacs Lisp Reference Manual ってほとんどの
関数のことが書いてあるんですか?たとえばバッファ、開始
ポイント、終了ポイントを渡すと、その文字列を返してくれる
ような関数が欲しい時に info の 文字列とバッファのところ
を読んで、なかったら諦めて自分で作るなりしないといけない
んですか?
> 関数のことが書いてあるんですか?たとえばバッファ、開始
> ポイント、終了ポイントを渡すと、その文字列を返してくれる
buffer-substring
一連の流れ読んでないけど、ここだけ見えたので。
apropos使え
と関ポよをん
グラフの準備
われわれの目標は、Emacs Lispのソースコードにあるさまざまな長さの関数定
義の個数を表示したグラフを作ることである。

elisp-introで説明を読んでて何がしたいのかさっぱりだったんで、最初に
完成させたいグラフを見てみた。次の式を評価するとこんなグラフができる
らしい。なんだこれ。どこがどこに対応してるんだ。。?

(graph-body-print '(1 2 3 4 6 4 3 5 7 6 5 2 3))

*
* **
* ****
*** ****
********* *
************
*************
SKK の辞書使って fill-paragraph してくれる lisp 無いかな。
禁則処理よりももっと賢く改行して欲すぃ時があるんだけど。
282ヽ(´ー`)ノ:03/12/27 06:25
>>280
*
* **
* ****
*** ****
********* *
************
*************
1234643576523
>>282
何も言わずにさらりと回答するところを見るとあんた漢だね。
自分が馬鹿なのがいけないんだけどさ、こんなグラフ見ずら
くてしょうがないよ。普通

1 *
2 **
3 ***

だと思うんだけど。elispの入門書なんだから勉強できれば別
に問題ないんだけどねヽ(´ー`)ノ
>>283
上→下のグラフと左→右のグラフ、どっちが手間が多いか
ちょっと考えれば分かると思うんだが
283でもないが、左→右のほうが楽そうに思えるけど。
282見てもどういう対応があるのか解らない。
普通のブラウザとかだとスペースが潰れる
↓も等幅フォントじゃないと多分ずれる

        *
    *   **
    *  ****
   *** ****
  ********* *
 ************
*************
1234643576523
おまえらElispスレくらいnavi2chで見ろyo
>>288
navi2ch で見てても モナーフォント使ってたり環境は
色々ってことなんじゃない?

また質問なんだけど、さっきの棒グラフを折れ線グラフ
にしろって問題です。

折線グラフは、各バーの先頭より下が空白の棒グラフであると考えられる。 折線グラフのコラムを作るには、
まず、値より1小さい空白文字のリストを作り、`cons'を使って印のシンボルをリストに繋げ、`cons'を使ってリ
ストの先頭に空白文字を埋め込む。

たぶん頭悪いんだろうけど、これも言ってる意味がよく
分からないんだ。。
*
* *
***
***
---
324

これを折れ線グラフにするとどんなグラフになるの?
こうだろ。

*
*
*

---
324

値が0のとき工夫がいるな。
こうするのかな? それともそこまで考えてない出題か?

*
*
-*-
102
ム板とかをモナーフォントで見てる馬鹿などシラネ
292ヽ(´ー`)ノ:03/12/27 21:04
ASCII で「折れ線」グラフって辛いと思う。
artist-mode を上手く使って作れないかなぁ、とか。

>>281
具体的にはどんなのよ。
>>290
なるほど。そう考えてから文章読むと明確ですね。
ほんと国語力ないな自分。。いまからチャレンジ
してみます。
             /ヽ       /ヽ
            /  ヽ      /  ヽ
  ______ /     ヽ__/     ヽ
  | ____ /           :::::::::::::::\
  | |       //       \  :::::::::::::::|
  | |       |  ●      ●    ::::::::::::::|   何このスレ...
  | |      .|             :::::::::::::|   
  | |       |   (__人__丿  .....:::::::::::::::::::/  
  | |____ ヽ      .....:::::::::::::::::::::::< 
  └___/ ̄ ̄       :::::::::::::::::::::::::|
  |\    |            :::::::::::::::::::::::|
  \ \  \___       ::::::::::::::::::::::::|
>>292
たぶん、fill-columnに到達したとき、そのままだと

ながいながいぎょう……禁則処
理みたいな例

になるのを、SKK辞書に「禁則」、「禁則処理」がある事を利用して、

ながいながいぎょう……禁則
処理みたいな例

というふうにしたいのでは?
新年をあかるく迎えられそうなelispを一発おねがいします。痛くてもいいです。
>>296
ttp://www.geocities.co.jp/SiliconValley-SanJose/7225/log/1001393679.html#R87
これなんかどう?
すっきりした状態で新年迎えられるよ。ついでに痛いし。
>>297
こういうレスを見ると、年末年始だな、って思うよ。
まぁ俺には休みが無いわけだが。
M-x doctor
(defun my-upcase-word ()
(interactive)
(backward-word)
(upcase-word)
(insert " "))

この関数、 upcase-word のところでエラーが出て
しまって動きません。
error: (wrong-number-of-arguments #<subr upcase-word> 0)
この手順通りに手動でやるとちゃんと動くんですが。
upcase-word を調べてみたところ、別に引数は必須
じゃないみたいです。何がいけないんでしょうか。
>>300
手元のだと引数が一つ必須って書いてあるけどな…
interactive に呼ぶと自動で引数を補ってはくれるけど。
ほんとに *scratch* とかで (upcase-word) を評価して error 出ないの?
(upcase-word) を評価するとエラーでました。すんません。
こういう場合はどうしたらいいんでしょう。がんばって引数
を渡すようにするしかないですか?
>>302
1単語だけが対象でいいならとりあえず固定値を渡しときゃいいんじゃない?
その後にでも my-upcase-word へ引数を渡す方法を勉強するとか。
>>300
やりたいのはつまりこういうこと?

(defun my-upcase-word (p)
(interactive "p")
(if (eolp)
(let ((pos (point)))
(upcase-word (- p))
(goto-char pos))
(upcase-word p)))
>>303>>304
おお。動きました。
upcase-word に -1 を渡すと直前の単語に対して作用してくれるんですね。
んでカーソルが行末じゃなかったら通常通の upcase-word みたいに動くと
いうことですか。勉強になりました。ありがとん。ついでに downcase-word
と capitalize-word にも同じようなやつ作ってキーに割りあてときました。
-3を入力したら今日より3日前の日付けを返すような関数を作る際に
助けになるような関数ってありますか?
format-time-string だけでは大変で…
(apply (lambda (s min h d mon y dow dst zone)
(format-time-string "%Y-%m/%d"
(encode-time s min h (- d 3) mon y)))
(decode-time))

みたいなのとか、かな…
306じゃないけど、encode-timeでマイナスの値扱えるのかー!
以前似たような事したいとき、
current-timeをゴニョゴニョするのかなーなんてやってたよ。
>>306です。 encode-time, うっかり見逃しておりました。
ありがとうございました!
EmacsスレでXEmacsは現在勢力が弱くなってきているという話を聞いたのですが、
XEmacs Lisperの人っていらっしゃいますか? 精力減退を感じますか?

EIEIOを使っている人、使い心地はどんな感じですか? 遅くないですか?
XEmacs使ってないけど、某elispパッケージ開発系MLでも
もうXEmacsサポートするのも嫌だけど、いいアイデアは
出すけど作業途中でトンずらする奴と、そんなのを崇めてる
その他ボケナスが開発続ける限りどうせいずれなくなるし
みたいなこと書かれてたよ。詳しいこと知らないけど。
某MLって伏せる必要あるのん?
そういう年頃なんだよ
「某」を覚えたてなんだよ
315311:04/01/08 00:52
いや記憶があいまいで。多分emacs-w3m
316デフォルトの名無しさん:04/01/08 08:36
なるほど、そういう年頃なんですな
317デフォルトの名無しさん:04/01/08 09:12
正確な数字は無理にしても、おおまかなGNU Emacsのユーザ数とXEmacs
のユーザ数の比率がわからないかな…。俺はドキュメントの正確さに
惹かれてずっとGNU Emacsを使ってきたけど。

GNU Emacsだけのことを考えてプログラミングすればいいのなら楽だな。

XEmacsの今後の開発の方向性はどうなっているのだろう?(スレ違いか)
>GNU Emacsだけのことを考えてプログラミングすればいいのなら楽だな。

まったくそれで構いません。XEmacsをサポートするために生産性が
下っているとは残念・・・と言いたいGNU Emacsユーザがたくさん
いるのではないでしょうか。
と318は自分の考えを一般化してみたのであった。
# ちょっとの変更で両方使えるようになるなら、
# 切り捨てなくてもと、もう一年ぐらい XEmacs使ってない俺は思う。
# 〜が対応してないからこっちの使用を断念ってのは M$的みたいで。
実行環境がmeadowかどうかを確かめるかっこいいコードを教えてください。

ちなみにGNU Emacs 20未満であることを確認するときは以下のようなコードを思い付きました。
これももっといいのがあれば教えてください。
(when (or (featurep 'xemacs) (<= emacs-major-version 20))
;; code for GNU Emacs 20 未満
)
>>320
(fboundp 'Meadow-version) とか?
322320:04/01/12 15:25
>>321 ありがとう。

>>320 まちがえちゃった。正しくは、
(when (and (not (featurep 'xemacs)) (<= emacs-major-version 20))
;; code for GNU Emacs 20 未満
)
>>321
どっちかってーと (featurep 'meadow) では?
324322:04/01/13 08:28
>>323
>どっちかってーと (featurep 'meadow) では?
あれっ、これってありましたっけ?
てっきり無いと思ってました。これがあるなら話は早いですね。
>>324
(Meadow-version) => "Meadow-2.00 Beta2-dev (WOMINAHESHI)"
(featurep 'meadow) => t
326デフォルトの名無しさん:04/01/13 21:10
他所で尋ねたのですが分かりませんでした。教えてください。コメント記号の
数に応じて,そのコメント行の色を変更するには,どうしたらいいのでしょう
か。
たとえばですが,emacs-lisp-modeだと,;の行は青色で,;;;の行は赤色にし
たいのですが。
マッチさせて色を変える
C-h v font-lock-defaults RET
つい最近たまたまその手の elisp見たんだけど、なんだったかなー。
emacs21に標準で付いてたやつで、コメントを見てなんとなく実行してみたら、
;;; Commentary: とかのフォントが大きくなったりした。
local-variableとかでファイル毎に定義できたと思う。
>>328
手掛りに調べてみます。
>>329
それ利用したいなあ。追加情報があったらどうぞよろしく。
√(二分の一乗根)はどのように表現すればいいのでしょうか?
sqrt
333デフォルトの名無しさん:04/01/18 09:24
emacs-wiki.el を改造したくて意気ごんで elisp-intro-jp を読破
したものの、実際にコード読んでみたらサパーリ(´・ω・`)ショボーン
334デフォルトの名無しさん:04/01/18 12:09
>>333

いきなりコードを全部読破しても、理解するのは難しいと思うよ。
まずは、やりたいことに関係する部分をちょこちょこいじってみるのが吉かと。

おいらも emacs-wiki を改造してるから、少しはアドバイスできるかも。
>>333 やりたいことがあるということは、elispをものにする上で有利だと思う。

elisp-intro-jpを読み終ったら、Emacs Lisp Reference Manualにざっと目を通したり、
または、それをしなくてもソースファイルを読みながら、必要に応じて、
C-h TAB ;;info-lookup-symbolやM-x find-function、M- x find-variableを駆使してがんばれ。

その他にも改造したい部分を含む関数の挙動をedebugで観察したり、eldocモードを使うなど
色々おもしろいことはあるよ。
インストールしたemacs lispにタグジャンプできるようにしておくといいよ。
結構便利。
>>336
find-function とかじゃなくて tag 使うの?
それとも併用?
>>334-336
`C-h f' `C-h v' `M-.' あたりを駆使してがんばってるんですが、
すんなり読めるようにはなりませんね。日々修行が必要ということ
でしょうか。。


> C-h TAB ;;info-lookup-symbolやM-x find-function、M- x find-variable
これは知らなかったんで使ってみます。

>>334
とりあえず html を出力する時に 改行ごとに <br> タグを付加するように
したいんです。その際に * でヘッディングしてる行には <br> をつけない
ようにしたいんです。何かアドバイスいただけると嬉しいです。
339デフォルトの名無しさん:04/01/18 21:24
>>338

emacs-wiki-publishing-markup の中の、コメントで plain paragraph separator
って書かれてる正規表現をいじればよさげ。

デフォルトでは、<p> タグに置き換えられるようになってるね。
>>337
単にfind-function知らなかっただけです……。
読みこんでない*.elの関数も検索できます、と言い訳させてください。(^_^;
ご指摘ありがとうございました。

おいらが使っているinfo-lookup-symbol用の設定。.emacsに書いておくもの。
だれかの参考になればうれしい。

Emacs21では、何もしないと、該当マニュアルページが表示されてもページ内の
検索対象シンボルの記述箇所にジャンプしてくれない、これはprefixとしての
正規表現を指定していないから。以下でやっていることは、それを指定して
やるのと、clパッケージのマニュアルも検索対象にいれること。

(setq info-lookup-highlight-face nil) ;; 反転表示オフ
(load "info-look")
;; add prefix spec which make point jump to the headline after lookup.
(info-lookup-add-help
 :mode 'emacs-lisp-mode
 :regexp "[^][()'\" \t\n]+"
 :doc-spec '(("(elisp)Index" nil " - [^:]+: ")
             ("(cl)Function Index" nil " - [^:]+: ")
             ("(cl)Variable Index" nil " - [^:]+: ")
             ("(emacs)Command Index" nil " - [^:]+: ")
             ("(emacs)Variable Index" nil " - [^:]+: ")))
symbolを指定すると最初にinfo-lookup-symbolで検索、
失敗したら、find-function, find-variable で検索、
失敗したら、find-tagで検索する、そんなコマンドfind-elisp-symbolが欲しい。

自分で書けばイイノカ...
>>339
亀レスすまそ。アドバイスを参考にしてがんばってみます。
344デフォルトの名無しさん:04/01/25 12:08
"abc" の中の `a' を `b' に置換したいんだけど

(subst-char-in-string "a" "b" "abc")
すると "abc" が返ってきます。何か使い方間違ってますか?
"bbc" が返ってくることを期待してるんですが。

subst-char-in-string is a compiled Lisp function in `subr'.
(subst-char-in-string FROMCHAR TOCHAR STRING &optional INPLACE)

Replace FROMCHAR with TOCHAR in STRING each time it occurs.
Unless optional argument INPLACE is non-nil, return a new string.
(subst-char-in-string ?a ?b "abc")
=> "bbc"
char だから (subst-char-in-string ?a ?b "abc")
>>345
成功しました。
`?' 演算子知りませんでした。 subst-char-in-string の第一、第二引数は
文字列じゃなくて文字だったんですね。勉強になりました。
subst-char-in-string (fromchar tochar string &optional inplace)
(subst-char-in-string "abclmn" "ABCLMN" "Leave me alone!")
=> "LeAve Me ALoNe!"
みたいな拡張も視野に入れているのかもしれないけど、
関数のデザイン的に、現状の仕様ではfromchar,
tocharに文字列を渡したらエラーにして欲しいな。

と思ったらReference manualにはこの関数は記載されていないね。
lisp/subr.el にある下請け関数なんで、手抜きに30ルピー。
文字列でなくても配列型なら使える実装になっているね。

(subst-char-in-string 'a 'b [a b c])

で [b b c] が返る。
350ヽ(´ー`)ノ:04/01/25 21:21
> => "LeAve Me ALoNe!"
=> "LeAve Me AoiMoe!" に見えた(;´Д`)
>>349 文字列でなくても配列型なら使える実装になっているね。
文字列も配列の一種だからね。
次はsubst-char-in-sequenceという名前にして、リストでも
良い事にするとかって、そりゃ、clのsubstituteだよね。

こういうsequenceという抽象データ型を操作する関数を定義しておいて、
実際にリストにするかベクタにするかは、使用時に有利になるほうを選ぶ
というコーディングにはロマンを感じます。

個人的には、alist、plist, hash-table でそういうことをやりたいので、
これらを抽象化したデータ型の統一操作関数群が標準で欲しい。
データが少ないときはalistを使っておいて、データが増えたらhash-tableに
するってとき多いよね?

>>350
> => "LeAve Me AoiMoe!" に見えた(;´Д`)
「萌え」という単語は知っているけど、Aoiはわからないな...
352ヽ(´ー`)ノ:04/01/26 10:53
>>351
http://www.google.co.jp/search?q=AoiMoe&lr=lang_ja
// ム板じゃ塩兄ちゃんはあまり有名じゃないのか。
塩兄ちゃんどころか、itojunさん知らんひとも多いしな。
VOIDを知らん人は少なそうだw
>>351 EIEIO を使えば。
EIEIOでdefmethodを使うという話?
抽象データ型としてhash-tableとalistを操作する関数を「標準」で欲しい
というところがミソなんじゃないの?

自分で書くなら、hash-table-p、listpを使って関数内で場合わけすれば書けるよね?

外してたらごめんよ。
「標準」って最初から付いてくるっていう意味で言ってるとしたら、EIEIO を
勧めるのは方向ちがいだったね。すまん。

けど、そういう関数の要望が高くなったとしても、C で実装するかなあ。
Sequence でもリストと配列では違いが大きいから、ディスパッチャを書くこ
とになる。C で書くより Lisp の方が楽。Lisp で用意してくれるだけなら、
遅くなるだけだと思う。

データの出し入れの前にチェックもしたいから、そこまで含めて初期化とゲッ
タ、セッタの関数の仕様を固定しておいて、とりあえず alist か plist で実
装。重くなってきたらハッシュで書き直す。さらに重くなったら外部のDBを呼
ぶように書き直す。ということで困らないと思うけど。
結論には賛成。今まで外部データベースとの連係までは考えたことはないけど。

> けど、そういう関数の要望が高くなったとしても、C で実装するかなあ。
おれはelispに速度はあまりもとめないたちなので、CかLispかは問題には
しません。というかなるべくLispで書いてほしい気がする。

> Lisp で用意してくれるだけなら、遅くなるだけだと思う。
それはそうなんだけど、そういう関数が最初から決まっている
だけでも、初期化、ゲッタ、セッタの関数名、引数の順番を考えたり
定義したりする手間も省けると思うんだよね。まぁ、foo-init, foo-get,
foo-setでもいいけど。

とは言うものの、よく考えてみると俺がalistがすごく便利だと考えているのは、
consから構成されているという実装を知っていて、たまに、単なるリストや
木として処理したりという反則ぎみの使い方をするからなんだと思う。矛盾しているね。
C++で、void test_*() というメソッドについて
CPPUNIT_TEST_SUITE(MyTest);
CPPUNIT_TEST(test_foo);
CPPUNIT_TEST(test_bar);
...
CPPUNIT_TEST_SUITE_END();
という行を別に書く必要があるのですが、手で維持するのは面倒なので
// (call-process-region (point-min) (point-max) "sh" nil (current-buffer) t "-c" "grep '^[ ]*void[[:space:]]\\+test_.*()' |sed 's/void[[:space:]]/CPPUNIT_TEST(/; s/().*/);/'")
というコメントを
CPPUNIT_TEST_SUITE(MyTest);
の後に入れて、コメントの次の行頭で C-x C-e するようにしています。
が、
* 古いリストを手で消す必要がある
* テキスト処理に外部プロセスを使ってダサい
といまいちよくありません。
これらの点を改良したいのですがelispではどう書けばいいのでしょう?
とりあえず、操作手順を記録するキーボードマクロ
C-x ( ;; start-kbd-macro 記録開始、C-x ) ;; end-kbd-macro 記録終了
C-x e ;; call-last-kbd-macro で自分のやりたい事の手順を一通りなぞって
みるのはどうでしょう。

うまくいけば、name-last-kbd-macro, insert-kbd-macro でコマンドとして
ファイルに記録もできますし。

> * 古いリストを手で消す必要がある
> * テキスト処理に外部プロセスを使ってダサい
実質的に問題になっているのは最初のものだけだと思うので、それだけ
解決すればいいのでは?

正攻法は、"(elisp)Search and Replace"で正規表現による置換を勉強すること
かな。
361Emacs Lisp :04/02/08 05:17
で完全数を探すスマートなやつを書いてください。
>>361
F島さんですか?笑
スマートじゃないけど。
100000まででは(6 28 496 8128)だった。
(defun divisor (x)
(let ((n 1) (p '()) (q '()))
  (while (< (* n n) x)
   (if (= (% x n) 0) (setq p (cons n p) q (cons (/ x n) q)))
   (setq n (+ n 1)))
  (nconc (nreverse p) (if (= (* n n) x) (cons n q) q))))

(defun perfect-numberp (x)
 (= (* 2 x) (apply #'+ (divisor x))))
364Emacs Lisp:04/02/09 21:13
>>362
だれっすか?
>>363
サンクスコ。これで単位がきます。
教官にここのURL送っておこう。
elispで課題を出すのか…
367Emacs Lisp:04/02/10 09:41
>>366
友人は gcc でアセンブラはかせて出していました。
>>367
ネタ決定
>>329,330
激しく遅レスだが、それ hi-lock-mode でしょ
>>369
326です。ありがとうございます。それを探してました。
M-x hi-lock-mode
M-x highlight-regexp [RET] ^;;;*.$ [RET] 色
ですね。
拡張子で判定して,ファイルを開くといつもhighlightできると便利なんです
が。。。
>>370
M-x highlight-regexp [RET] ^;;;*.$ [RET] 色
ではなく,
M-x highlight-regexp [RET] ^;;;.*$ [RET] 色
でした。
372369:04/03/01 17:08
そんなら
(add-hook
'emacs-lisp-mode
'(lambda ()
(highlight-regexp "^;;;.*$" 'hi-red-b)
))
とか
Elisp でファイルをアップロードしたいのですが,

<form enctype="multipart/form-data" action="upload.cgi" method="post">
<input type="file" name="uploadfile">

に対してアップロードする方法が分かりません.google で検索してみましたが,
ダウンロードについてはいろいろと見つかりましたが,アップロードは見つかり
ませんでした.
open-network-stream して http://www.ietf.org/rfc/rfc2616.txt
参考にしつつ自前で書く。
326です。
>>373
一箇所, 'emacs-lisp-mode を 'emacs-lisp-mode-hook とすれば,それでOKでした。
376デフォルトの名無しさん:04/03/06 10:55
教えてください。
emacsの正規表現で,「空白行の次の行の先頭が数字」で始まる文字を表現す
るにはどうすればいいでしょうか?
^$^[0-9]
では,うまくsearch-forward-regexpできません。
^\n[0-9] みたいに、直接改行文字埋め込むとか…
>>376

\n[0-9].*$
379378:04/03/10 13:21
間違えた
行でなくて文字ですね。
\n[0-9].hoge
>>379 それだと空白行いがいにもまっちしませんか?
\n\nにすればよかろう
そりゃそうだ。
バッファの先頭が空行だったら?
>>383
自分で考えろ
\\(\n\\|\\`\\)\n[0-9].hoge
なぜ>>377がスルーされてるのか不思議だ。
つーか、>>377が正解の1つで、あとは、みんなで別解を探して遊んでいるんでしょ?
387デフォルトの名無しさん:04/03/13 00:37
Wandlust にあるメールフォルダを参照して新しいフレームにタイマーをつかっ
て何分かおきにアップデートするプログラムを elisp で書きました。

set-buffer を使っているので save-excursion を使って囲みましたが、タイ
マーでそれが実行されるとそのフレームのアップデートはうまくいきますが、
その際、本体の emacs カーソルが消えてしまい、なにもしないと二度ともどっ
てきません。(フォーカスからはずれるような感じ、なにかキー操作すると戻っ
て来る)。作成した新しいフレームにカーソルが移動しているようには、見え
ないので save-excursion は、うまく動作していると思います。教えて君で
す、スンマソン。
私の知識も大したものではないのですが、
別の wm でやるとどうなりますか?
または、その現象を超単純化した lisp でも出していただけると
わかりやすいと思います。
ちなみに、 save-excursion は window とか frame のことは関知しないよ。
window 周り担当は save-window-excursion。
frame は、 poe に save-selected-frame ってのがあるみたい。

でも、何かすれば戻ってくるってことは、ただカーソル見えないだけ?
あんまり害がなさそうな気がする…
終わったとき redraw-display でもしてみるとか?
390デフォルトの名無しさん:04/03/14 01:14
MLD5に収録されているXemacsを使っているのですが、
Lisp Interaction ModeでCtrl-jで評価できると
ある本で読んだのですが、改行されてしまいます。
どうもCtrl-jが改行に割り当てられているような
のですが、なぜなのでしょうか?設定を弄ったり
はしていません。みなさんはどうされていますか?
C-h k C-jでヘルプがでるから見たら?
eval-print-last-sexpになってないのかな。

M-C-xだとミニバッファに評価してくれる
392デフォルトの名無しさん:04/03/14 12:46
>>391
eval-print-... に設定するにはどうすればいいのでしょうか?

あとEmacs Lispのよい参考書を教えてください。
いま山本和彦さんの「リスト遊び」という本で勉強
しています。かなり自分には合うプログラミング言語
だと思います。
>>392 EmacsマニュアルとElispマニュアルを、大変ですが一度は通読しておくと
便利です。何しろ原典ですから頼りになります。私はそうやって勉強しました。
日本語に翻訳したものもあるはずです。

あと、elisp入門みたいな短めの文書もあると思います。

これらの文書はネットから無料で入手できます。

>>392
> eval-print-... に設定するにはどうすればいいのでしょうか?
応急措置としては、
M-x loca-set-key C-j eval-print-last-sexp

本来ならlisp-interaction modeでc-jが改行になっている原因を
突き止めた方がいいと思うけど、一時しのぎとしては、.emacsに
(define-key lisp-interaction-mode-map "\n" 'eval-print-last-sexp)
と書いてみるとか。
emacs-lisp-modeで C-xC-e, C-uC-xC-eしか使ってないな。
Emacsを使っているときのみでよいのですが、
CtrlキーとCaps Lockキーの役割を入れ替えたい
のですが、誰かくわしいかたやり方を教えてください。
考えているのは、.emacsファイルで設定をいじって
入れ替えるやりかたです。

お願いします。
>>395
それは Emacs 側でやることじゃないんじゃないか?
397395:04/03/15 21:31
実は Windows 上で Meadow というエディタを
使っていて、 Meadow を使っているときだけ
Ctrl と CapsLock を入れ替えたいなと思いまし
て。。。
398デフォルトの名無しさん:04/03/15 22:06
>>388 >>389
レスサンクス。ご指摘どおり、save-window-excursion を
使ったらうまくいきました。select-frame 関数が原因だっ
たのかな。
>>397
windowsなら「窓使いの憂鬱」使えば?
最近Emacs関連の書き込みが少ないせいか、妙に親切なレスが多いのに感心する
>>397
おいおい、FAQだよ。
ttp://meadow.sourceforge.jp/cgi-bin/hiki.cgi?%B0%EC%C8%CC%C5%AA%A4%CA%BE%F0%CA%F3#l4

ちっとは調べろ。あと、マルチポスト( ゚Д゚)イッテヨシ。
>>397
HHKかえばいいよ。

ごろ寝してHHK腹の上に置いて
モニターを天地逆さまにおいたら
むちゃくちゃ使いややすいぞ。
たまに頭に血登って気絶するけど
やめられん。
>>402
どんな体位でやってるんだ?
モニータが天地逆さまってどんなだ?
想像つかねー
>>402じゃないんで想像だけど、
頭に血が登るという部分から想像するに
ベッドの端から頭がはみ出るような形で仰向けに寝て、
首を背中側に90度曲げるんじゃないかな。
そうすれば普通と上下が反対になるから、
モニターを天地逆に置く理由になる。
HHK って window に使いにくくない?
なんだって?
HHK って window に使いにくくない?
なんだって?
HHK って window で使いにくくない。
なんだって。
1: Happy Hacking Keyboard って Microsoft Windows で使いにくいか。
2: Happy Hacking Keyboard って X Window System で使いにくいか。
可能性としては、これくらいしか思い浮かばん。
でどうなの?
いずれにしろスレ違いなわけで。
10秒後になにか動作を起こすようにしたいんですけど
これではどこがいけないんでしょうか?

(run-at-time "10 sec" nil (message "hoge"))

これをscratchでC-jしたら
[nil 16474 46984 123352 nil "hoge" nil nil]
とででミニバッファにhogeと表示されました。
10秒後にhogeと表示されるのを期待していたのですが。
(run-at-time "10 sec" nil #'message "hoge")
>>414
ありがとうございました。
cvs update -rlexbind
本当?
>>417
yes
互換性はどうやって保つのかな? lexical-letとか使うの?
letをlexicalにしてしまったら、ある意味、漢だね。
有効になるのは Emacs Lisp ファイルの頭に
-*- ... ; lexical-binding: t; ... -*-
と書いておいた場合か、(with-lexical-binding BODY) での BODY。

ただし、メンテナ自身が
http://mail.gnu.org/archive/html/emacs-devel/2004-04/msg00276.html
> There's also the `lexbind' branch
    (略)
> but until recently I haven't used it for everyday use;
だそうだ。
421KingMathematician ◆5lHaaEvFNc :04/04/17 16:52
xyzzy lisp の (progn (setq x (random 50)) (dotimes (y x) (format t "~d~%" y)))
は、 emacs lisp の何に相当しますか?
(progn
(setq x (random 50))
(dotimes (y x) (print (format "%d" y) (current-buffer))))
とか?
423KingMathematician ◆5lHaaEvFNc :04/04/17 19:11
Re:>>422
(progn
(setq x (random 50))
(dotimes (y x) (princ (format "%d\n" y) (current-buffer))))
でうまくいきました。

誰か emacs lisp と xyzzy lisp の相違点について解説してもらえませんか?
自分で調べようともしないのは何故?
>>423
xyzzy lisp ??
坊やだからさ。
>>423
>誰か emacs lisp と xyzzy lisp の相違点について解説してもらえませんか?

Common Lisp ユーザのための Emacs Lisp メモ
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#cl-elisp-memo

最近、xyzzyを触り始めたのですが、Common Lispに6割程度の準拠度という話を聞きましたが、
Common Lisperとしての視点でアレッ?と感じた非互換なところは、
* readtable caseが実装されていないか、何かが違う。
* パッケージ名に"COMMON-LISP"ではなく、"LISP"を使っている(cltl1のせい?)。
* ecaseなど、単純に定義できるマクロを定義していない。

p.s. xyzzyのソースを読んでみてぇなぁ

>>420
> 有効になるのは Emacs Lisp ファイルの頭に
> -*- ... ; lexical-binding: t; ... -*-
> と書いておいた場合か、(with-lexical-binding BODY) での BODY。
少し苦しい気がするけど、しょうがないのかな。
何もせずデフォルトでlexical bindingにできるようにして、互換性も保てる方法があれば、
良いのだろうけど。
> p.s. xyzzyのソースを読んでみてぇなぁ
最近知ったんですが、ソースは公開されてるようですよ。
情報ありがとう
Ruby や Perl での正規表現、先読み(lookahead)を elisp で使いたくなったとき、
みなさんどうしてますか?

elisp には先読みってありませんよね?

# メルマガ内の広告を invisible にするために使おうと思ってます。

looking-atあたりを使うコードに手で書き直すしかないのかな。
実際に先読み指定を含んだ正規表現をここで見せてみたらどう?
432430:04/04/23 20:39
>>431

> looking-atあたりを使うコードに手で書き直すしかないのかな。
> 実際に先読み指定を含んだ正規表現をここで見せてみたらどう?

"john(?=ney)" みたいなのを想定してます。

というか、
先読みは自己流でムリヤリ作ってみて、その汚さ・不完全さに嫌気がさしました。
ご想像の通り、looking-at や match-data などを使いました。
しかし、もっと綺麗にやる方法についてどなたかの知恵を借りたいなー、
と思った次第です。

本当いうと、戻り読み "(?<foo)bar" のほうが欲しいんですが。
こんなんでどう?
"john(?=ney)" なら (re-search-forward-lb-la "" "john" "ney") とか
"(?<foo)bar" なら (re-search-forward-lb-la "foo" "bar" "") とかできるよ。

(defun re-search-forward-lb-la (lb-regexp regexp la-regexp
&optional bound noerror count)
(let ((lb-depth (regexp-opt-depth (concat "\\(" lb-regexp "\\)"))))
(when (re-search-forward (concat "\\(" lb-regexp "\\)"
"\\(" regexp "\\)"
"\\(" la-regexp "\\)")
bound noerror count)
(goto-char (match-beginning (1+ lb-depth)))
(re-search-forward regexp bound noerror count))))
434430:04/04/25 00:25
>>433
どもです。上に書いてもらったのに、関数を書き加えて、

(re-search-forward-with-lbla "john(?=ney)")
(re-search-forward-with-lbla "(?<=foo)bar")

のように使えるようにしました。
とりあえず、自分の用途には耐えられるものになりました。

(defun re-search-forward-with-lbla (regexp &optional bound noerror count)
(re-search-forward-lb-la (or (extract-lookbehind regexp) "")
(extract-normal-part regexp)
(or (extract-lookahead regexp) "")
bound noerror count))
(defun extract-lookbehind (regexp)
(if (string-match "(\\?<=\\([^)]+\\))" regexp)
(match-string 1 regexp)))
(defun extract-lookahead (regexp)
(if (string-match "(\\?=\\([^)]+\\))" regexp)
(match-string 1 regexp)))
(defun extract-normal-part (regexp)
(let ((lookbehind (extract-lookbehind regexp))
(lookahead (extract-lookahead regexp)))
(when lookbehind
(string-match (regexp-quote lookbehind) regexp)
(setq regexp (substring regexp (1+ (match-end 0)))))
(when lookahead
(string-match (regexp-quote lookahead) regexp)
(setq regexp (substring regexp 0 (- (match-beginning 0) 3))))
regexp))
カーソルが"foo"の直後にある時は"(?<foo)bar"を検索できないと思うが、そう言うもの?
436430:04/04/25 11:09
>>435

うーん、確かに検索できませんね。

自分の用途では、とりあえずそういう使い方をしないので不都合ないんですが、
きちんとした戻り読みの実装という意味では、中途半端なもんはだめですね。

誰か、直せませんかね。
根本的な改善も歓迎。
(defun re-search-forward-lb-la (lb-regexp regexp la-regexp
&optional bound noerror count)
(when (and (save-excursion
(re-search-backward lb-regexp nil t))
(= (match-end 0) (point)))
(goto-char (match-beginning 0)))
(let ((lb-depth (regexp-opt-depth (concat "\\(" lb-regexp "\\)"))))
(when (re-search-forward (concat "\\(" lb-regexp "\\)"
"\\(" regexp "\\)"
"\\(" la-regexp "\\)")
bound noerror count)
(goto-char (match-beginning (1+ lb-depth)))
(re-search-forward regexp bound noerror count))))
>>437
カーソルが"fo"の直後にある時は"(?<foo)bar"を検索できないと思う。
(>= (match-end 0) (point)) だね。
bound も la-regexp にしたがって調整して
(when (and bound
(save-excursion
(let ((p (point)))
(goto-char bound)
(or (looking-at la-regexp)
(re-search-backward la-regexp p t)))))
(setq bound (max bound (match-end 0))))
こんな感じか。
count を指定した時の挙動が変だから最後は
(re-search-forward regexp bound noerror)
>>439
re-search-backward は、 point より後まで続く文字列に一致しないでしょ。
>>438 の場合、他に foo が見つからなかったら、 buffer の先頭に戻らないといけない。

他に、 lb-regexp も regexp も la-regexp も \(foo\)+ 、みたいな場合が悩ましいね…
foofoofoofoofoo みたいな文字列に照合させたとき、
最長一致してほしいのは regexp であって、 lb-regexp じゃないよね。
(match-string 0) が "foofoofoo" を返してほしい。

これを満たすには、 regexp の前に lb-regexp を concat して re-search-forward するのは無理だと思う。
先にある部分式から最長一致しちゃうから。

search-forward の挙動をまねて、 count とか noerror の処理も自前で実装すればできそうかな…
(defun re-search-forward-lb-la (lb-regexp regexp la-regexp &optional bound noerror count)
(let* ((old-point (point)) (count (or count 1))
(regexp-with-la (concat "\\(" regexp "\\)" la-regexp)))
(catch 'found
(catch 'not-found
(while t (unless (re-search-forward regexp-with-la bound t)
(throw 'not-found t))
(let ((old-beginning (match-beginning 0))
(old-end-1 (match-end 1))
(old-end-all (match-end 0)))
(goto-char old-beginning)
(cond ((and (re-search-backward lb-regexp nil t)
(= (match-end 0) old-beginning))
(setq count (1- count))
(if (> count 0) (goto-char old-end-all)
(goto-char old-beginning)
(throw 'found (re-search-forward regexp old-end-1))))
(t (goto-char old-beginning)
(if (eobp) (throw 'not-found t)
(forward-char 1)))))))
(cond ((eq noerror t) nil)
((eq noerror nil)
(error "Search failed: \"%s\" \"%s\" \"%s\"" lb-regexp regexp la-regexp))
(t (goto-char (or bound (point-max))))))))
うわ、最後の行が間違ってる…
noerror が t でも nil でもなかったら、 goto-char したあと nil 返さないといけないんだっけ。

(t (goto-char (or bound (point-max)))
nil)))))

とかに修正だね。
"(?<a)a+"を検索してみれ
Perl同様look-behindを固定長限定で
(defun re-search-forward-lb-la (lb-regexp regexp la-regexp
&optional bound noerror count)
(let ((start 0))
(while (string-match "\\\\\\\\\\|\\\\\\*\\|\\\\\\+\\|\\+\\|\\*\\|\\\\{"
lb-regexp start)
(when (member (match-string 0 str) '("+" "*" "\\{"))
(signal 'search-failed "look-behind regexp must be fixed length."))))
(let (start)
(when (save-excursion
(and (re-search-forward regexp bound t)
(re-search-backward lb-regexp nil t)
(setq start (match-beginning 0))
(goto-char (match-end 0))
(looking-at (concat "\\(" regexp "\\)\\(" la-regexp "\\)"))))
(goto-char (min (point) start))))
(let ((start (point)))
(when (save-excursion
(and bound
(goto-char bound)
(re-search-backward (concat "\\(" lb-regexp "\\)\\("
regexp "\\)") start t)
(goto-char (match-end 0))
(looking-at la-regexp)))
(setq bound (max bound (match-end 0)))))
(when (re-search-forward (concat "\\(" lb-regexp "\\)\\(" regexp
"\\)\\(" la-regexp "\\)")
bound noerror count)
(goto-char (match-end 1))
(re-search-forward regexp bound noerror)))
うげ、改行多すぎと言われて編集したら変になった。最初の部分はこう。
(let ((start 0))
(while (string-match "\\\\\\\\\\|\\\\\\*\\|\\\\\\+\\|\\+\\|\\*\\|\\\\{"
lb-regexp start)
(when (member (match-string 0 lb-regexp) '("+" "*" "\\{"))
(signal 'search-failed "look-behind regexp must be fixed length."))
(setq start (max (1+ start) (match-end 0)))))
abababababaとなっている時、
"(?<a)b(?=a)"をCOUNTパラメタ付きで検索してみれ。

ポイントが最初のaの後ろにある時、
"(?<a)ba"も検索してみれ。
最初に regexp を探してそれから前後をチェックするんじゃ駄目?
それだと443がうまくないんじゃないかな

ユーティリティ
(defun variable-length-regexp-p (regexp)
(catch 'result
(let ((start 0))
(while (string-match "\\\\\\\\\\|\\\\\\*\\|\\\\\\+\\|\\+\\|\\*\\|\\\\{"
regexp start)
(when (member (match-string 0 regexp) '("+" "*" "\\{"))
(throw 'result t))
(setq start (max (1+ start) (match-end 0)))))))

(defun concat-with-paren (&rest regexps)
(concat "\\(" (mapconcat #'identity regexps "\\)\\(") "\\)"))
本体
(defun re-search-forward-lb-la (lb-regexp regexp la-regexp
&optional bound noerror count)
(when (variable-length-regexp-p lb-regexp)
(signal 'search-failed "look-behind regexp must be fixed length."))
(let ((beginning (point)) p)
(and (re-search-forward regexp bound t)
(goto-char (match-beginning 0))
(re-search-backward lb-regexp nil t)
(setq p (match-beginning 0))
(goto-char (match-end 0))
(looking-at (concat-with-paren regexp la-regexp))
(setq beginning (min beginning p)))
(and bound
(goto-char bound)
(re-search-backward (concat-with-paren lb-regexp regexp)
beginning t)
(goto-char (match-end 0))
(looking-at la-regexp)
(setq bound (max bound (match-end 0))))
(goto-char beginning))
(catch 'result
(dotimes (i (or count 1) (match-beginning 0))
(if (re-search-forward (concat-with-paren lb-regexp regexp la-regexp)
bound noerror)
(progn
(goto-char (match-end 1))
(re-search-forward regexp bound noerror))
(throw 'result nil)))))
最後の部分で、 re-search-forward で regexp だけ match させるには、
bound は la-regexp の match-beginning にしないとだめだよ。
.+(?=r) を barbaz から検索…みたいに、 la-regexp 以降まで一致しちゃう場合があるでしょ。


ところで、 lb-regexp で ? とか \| も弾いて、ほんとに固定長にしちゃえば、
search-backward しなくても、その長さだけ戻れば済みそうな気がする。

最初に regexp を探す場合で、 >>443 を aaaaaa とかから検索するには、
match しなかった場合に、 regexp の match-beginning より一文字後から再検索すればいいかな。

>>446 は、全部の b に一回ずつ match するのが正しいのかな。
本体
(defun re-search-forward-lb-la (lb-regexp regexp la-regexp
&optional bound noerror count)
(or count (setq count 1))
(or (integerp count)
(signal 'wrong-type-argument (list 'integerp count)))
(or bound (setq bound (if (< count 0) (point-min) (point-max))))
(let ((start (point))
(forward (if (< 0 count) t (setq count (- count)) nil))
(found t))
(while (and found (< 0 count))
(unless (if forward
(re-search-forward-lb-la-1 lb-regexp regexp la-regexp bound)
(re-search-backward-lb-la-1 lb-regexp regexp la-regexp bound))
(goto-char start)
(if noerror
(setq found nil)
(error "Search failed: %S %S %S" lb-regexp regexp la-regexp)))
(setq count (1- count)))
(if found
(point)
(unless (eq t noerror)
(goto-char bound)))))
サブルーチン
(defun re-search-forward-lb-la-1 (lb-regexp regexp la-regexp bound)
(let ((tmp-bound nil)
(not-found t))
(while (and not-found
(re-search-forward (concat "\\(" regexp "\\)\\(" la-regexp "\\)")
tmp-bound t))
(if (< bound (match-end 1))
(setq tmp-bound (1- (match-end 0)))
(goto-char (match-beginning 0))
(if (save-match-data
(re-search-backward (concat "\\(" lb-regexp "\\)\\=") nil t))
(progn (goto-char (match-beginning 1))
(re-search-forward regexp (match-end 1))
(setq not-found nil))
(goto-char (1+ (match-beginning 0))))))
(not not-found)))
サブルーチン2
(defun re-search-backward-lb-la-1 (lb-regexp regexp la-regexp bound)
(let ((tmp-bound nil)
(not-found t))
(while (and not-found
(re-search-backward (concat "\\(" lb-regexp "\\)\\(" regexp "\\)")
tmp-bound t))
(if (< (match-end 1) bound)
(setq tmp-bound (1+ (match-beginning 0)))
(goto-char (match-end 0))
(if (save-match-data (looking-at la-regexp))
(progn (goto-char (match-end 0))
(re-search-backward regexp (match-end 1))
(setq not-found nil))
(goto-char (1- (match-end 0))))))
(not not-found)))
「aaaaa」の直後にカーソルを置いて
(and (re-search-forward-lb-la "a" "a*" "a" nil t -1) (match-string 0))
=> ""
例が変だった。
(and (re-search-forward-lb-la "「" "a*" "」" nil t -1) (match-string 0))
=> ""
(aaaaa になって欲しい)
re-search-backward-lb-la-1で
> (progn (goto-char (match-end 0))
> (re-search-backward regexp (match-end 1))
> (setq not-found nil))

< (progn (goto-char (match-end 1))
< (re-search-forward regexp (match-end 0))
< (setq not-found nil))
にすればいいのかな?
固定長の regexp にマッチする長さを数えておいて
(defun split-regexp (regexp)
(let ((start 0) r)
(while (string-match "\\\\\\\\\\|\\\\(\\?:\\|\\\\[sScC].\\|\\\\.\\|."
regexp start)
(when (string= (match-string 0 regexp) "[")
(string-match "\\[^?]?\\(\\[:[a-z]+:\\]\\|[^]]\\)*\\]" regexp
(match-beginning 0)))
(push (match-string 0 regexp) r)
(setq start (max (1+ start) (match-end 0))))
(nreverse r)))

(defun regexp-match-length (regexp)
(catch 'giveup
(let ((count 0))
(dolist (x (split-regexp regexp) count)
(cond ((member x '("+" "*" "?" "\\{" "\\|"
"\\1" "\\2" "\\3" "\\4" "\\5"
"\\6" "\\7" "\\8" "\\9"))
(throw 'giveup nil))
((member x '("^" "$" "\\(" "\\)" "\\`" "\\'"
"\\=" "\\b" "\\B" "\\<" "\\>")))
((setq count (1+ count))))))))
bound を調整し
(defun concat-with-paren (&rest regexps)
(concat "\\(" (mapconcat #'identity regexps "\\)\\(") "\\)"))

(defun fixup-range-for-lb-la (lb-regexp regexp la-regexp beginning end)
(save-excursion
(and end
(goto-char end)
(re-search-backward (concat-with-paren lb-regexp regexp) nil t)
(>= (match-end 1) (or beginning (point-min)))
(looking-at (concat-with-paren lb-regexp regexp la-regexp))
(setq end (max end (match-end 0))))
(and beginning
(let ((len (or (regexp-match-length lb-regexp)
(error "unsupported look-behind regexp feature."))))
(goto-char (- beginning len)))
(re-search-forward (concat-with-paren lb-regexp regexp la-regexp)
end t)
(setq beginning (min beginning (match-beginning 0))))
(list beginning end)))
使う1
(defun re-search-forward-lb-la (lb-regexp regexp la-regexp
&optional bound noerror count)
(if (and count (< count 0))
(re-search-backward-lb-la lb-regexp regexp la-regexp bound noerror
(- count))
(apply (lambda (b e) (setq bound e) (goto-char b))
(fixup-range-for-lb-la lb-regexp regexp la-regexp (point) bound))
(let ((lb-depth (regexp-opt-depth (concat-with-paren lb-regexp)))
(count (or count 1))
(found t))
(while (and found (>= (setq count (1- count)) 0))
(if (re-search-forward (concat-with-paren lb-regexp regexp la-regexp)
bound noerror)
(progn
(goto-char (match-end 1))
(re-search-forward regexp (match-end (1+ lb-depth))))
(setq found nil)))
(and found (point)))))
使う2
(defun re-search-backward-lb-la (lb-regexp regexp la-regexp
&optional bound noerror count)
(if (and count (< count 0))
(re-search-forward-lb-la lb-regexp regexp la-regexp bound noerror
(- count))
(apply (lambda (b e) (setq bound b) (goto-char e))
(fixup-range-for-lb-la lb-regexp regexp la-regexp bound (point)))
(let ((lb-depth (regexp-opt-depth (concat-with-paren lb-regexp)))
(count (or count 1))
(found t))
(while (and found (>= (setq count (1- count)) 0))
(if (re-search-backward (concat-with-paren lb-regexp regexp la-regexp)
bound noerror)
(progn
(goto-char (match-end 1))
(re-search-forward regexp (match-end (1+ lb-depth)))
(goto-char (match-beginning 0)))
(setq found nil)))
(and found (point)))))
使う3
(defun string-match-lb-la (lb-regexp regexp la-regexp string &optional start)
(with-temp-buffer
(insert string)
(apply (lambda (b e) (setq start b))
(fixup-range-for-lb-la lb-regexp regexp la-regexp start nil)))
(let ((lb-depth (regexp-opt-depth (concat-with-paren lb-regexp))))
(when (string-match (concat-with-paren lb-regexp regexp la-regexp)
string start)
(string-match regexp (substring string 0 (match-end (1+ lb-depth)))
(match-end 1)))))
"a+(?=a+)"をBOUND指定付きで検索した時にBOUNDを超過して
本体のa+に一致してしまわない?
forward の時は bound、backward の時は (point) の調整前の値を
変数 end あたりに束縛しておいて、最後のマッチを
(re-search-forward regexp (min (match-end (1+ lb-depth)) end))
こんなふうにすればいいのかな。
>>457-461
a+(?=.+) みたいな嫌な la-regexp がくると、 bound が無効化されちゃうね。
regexp が bound より向こうで始まってないかも調べないといけなそう。
re-search-forward のときに bound が (point) より小さいと error が出ちゃう。


ところで >>446
> abababababaとなっている時、
> "(?<a)b(?=a)"をCOUNTパラメタ付きで検索してみれ。
って、何回 match するのが正しいんだろう…
re-search-forward に任せると三回だし、自前で match させれば五回にできるし。
perl -e 'print "abababa" =~ m/(?<=a)b(?=a)/g, "\n"'
bbb
となるね
テスト関数
(defun test-lb-la ()
(interactive)
(with-temp-buffer
(switch-to-buffer (current-buffer))
(insert "aaaaa")
(goto-char (+ (point-min) 1))
(re-search-forward-lb-la "a" "a+" ".+" (+ (point-min) 3))
(assert (string= (match-string 0) "aa"))
(erase-buffer)
(insert "||aaa||")
(re-search-backward-lb-la "|" "a+" "|")
(assert (string= (match-string 0) "aaa"))
(goto-char (1+ (point-min)))
(re-search-forward-lb-la "||" ".*" "||")
(assert (string= (match-string 0) "aaa"))
(erase-buffer)
(insert "bababab")
(goto-char (point-min))
(re-search-forward-lb-la "b" "a" "b" nil nil 2)
(assert (point) (+ (point-min) 6))))
パッチ1
@@ -48,7 +49,8 @@ (defun re-search-forward-lb-la (lb-regex
(- count))
- (apply (lambda (b e) (setq bound e) (goto-char b))
- (fixup-range-for-lb-la lb-regexp regexp la-regexp (point) bound))
(let ((lb-depth (regexp-opt-depth (concat-with-paren lb-regexp)))
(count (or count 1))
- (found t))
+ (found t)
+ (end bound))
+ (apply (lambda (b e) (setq bound e) (goto-char b))
+ (fixup-range-for-lb-la lb-regexp regexp la-regexp (point) bound))
(while (and found (>= (setq count (1- count)) 0))
@@ -58,3 +60,4 @@ (defun re-search-forward-lb-la (lb-regex
(goto-char (match-end 1))
- (re-search-forward regexp (match-end (1+ lb-depth))))
+ (re-search-forward regexp (min (match-end (1+ lb-depth))
+ (or end (point-max)))))
(setq found nil)))
パッチ2
@@ -67,7 +70,8 @@ (defun re-search-backward-lb-la (lb-rege
(- count))
- (apply (lambda (b e) (setq bound b) (goto-char e))
- (fixup-range-for-lb-la lb-regexp regexp la-regexp bound (point)))
(let ((lb-depth (regexp-opt-depth (concat-with-paren lb-regexp)))
(count (or count 1))
- (found t))
+ (found t)
+ (end (point)))
+ (apply (lambda (b e) (setq bound b) (goto-char e))
+ (fixup-range-for-lb-la lb-regexp regexp la-regexp bound (point)))
(while (and found (>= (setq count (1- count)) 0))
@@ -77,3 +81,3 @@ (defun re-search-backward-lb-la (lb-rege
(goto-char (match-end 1))
- (re-search-forward regexp (match-end (1+ lb-depth)))
+ (re-search-forward regexp (min (match-end (1+ lb-depth)) end))
(goto-char (match-beginning 0)))
(erase-buffer)
(insert "aaa")
(goto-char (point-min))
(re-search-forward-lb-la "" "a" "aa" (+ (point-min) 2))
まずは定義からだ。

lookahead分もboundまで、で十分じゃないの?

lookbackは、regexpがマッチしてから判定し、pointより前も見る。
実装は、アンカーを使えば簡単だろう。

match-dataは、regexpにマッチしたものが設定されればいい?
look-behind をそのように実装した場合、"(?<hoge)." のような検索をすると
一文字ずつずらしながら "hoge\=" を検索することになる。

look-behind も look-ahead も (point) と bound の間にあることにして
こんなので十分なんじゃないか?

(defun re-search-forward-lb-la (lb-regexp regexp la-regexp
&optional bound noerror count)
(let ((lb-depth (regexp-opt-depth (concat "\\(" lb-regexp "\\)")))
(re (concat "\\(" lb-regexp "\\)\\(" regexp "\\)\\(" la-regexp "\\)"))
(count (or count 1)))
(save-excursion
(while (and (>= (setq count (1- count)) 0)
(re-search-forward re bound noerror))
(goto-char (match-beginning (1+ lb-depth)))
(re-search-forward regexp (match-end (1+ lb-depth)))))
(if (match-data 0)
(goto-char (match-end 0))
(unless (eq bound t)
(goto-char bound))
nil)))
472470:04/04/27 15:23
>>471
> look-behind をそのように実装した場合、"(?<hoge)." のような検索をすると
> 一文字ずつずらしながら "hoge\=" を検索することになる。
それはわかるが、使う側の問題と考えたい。
むしろ、negative lookbehind and/or lookaheadへの展開を期待してるんだが。
negative に対応するとすると、まずはこんな感じで元の正規表現と同じ長さ
の任意の文字列にマッチする正規表現を作ってやり、マッチした文字列が元の
正規表現とマッチしないことを確認するといいんじゃないだろうか。
アルゴリズムは >>451-453 になるだろうね。

(defun split-regexp (regexp)
(let ((re (mapconcat #'identity
'("\\\\\\\\" "\\\\(\\?:" "\\\\[sScC]."
"\\\\{[0-9]*\\(,[0-9]*\\)?\\\\}" "\\\\."
"\\[^?]?\\(\\[:[a-z]+:\\]\\|[^]]\\)*\\]"
".")
"\\|"))
(start 0) r)
(while (string-match re regexp start)
(push (match-string 0 regexp) r)
(setq start (max (1+ start) (match-end 0))))
(nreverse r)))

(defun translate-regexp-to-dot (regexp)
(apply #'concat
(mapcar (lambda (re)
(if (or (member re '("*" "+" "?" "^" "$"))
(and (not (string= re "\\\\"))
(string-match "\\`\\\\" re)))
re
"."))
(split-regexp regexp))))
474470:04/04/27 21:38
>>473
> negative に対応するとすると、まずはこんな感じで元の正規表現と同じ長さ
> の任意の文字列にマッチする正規表現を作ってやり、マッチした文字列が元の
> 正規表現とマッチしないことを確認するといいんじゃないだろうか。
違うと思う。
例えばlookaheadだったら
(and (re-search-forward regexp)
(not (re-search-forward (concat "\\=\\(" la-regexp "\\)"))))
って感じじゃない?
476470:04/04/27 23:20
>>475
これも違う。
elispで作るのだと、negativeはlookaheadの方が難しい。
ふつーに regexp を検索して周囲のチェックじゃだめなの?
perl -e 'print "abababa" =~ m/.*(?!a)/g, "\n"'
abababa
perl -e 'print "abababa" =~ m/(?<!a).*/g, "\n"'
abababa
となるから余計に食っちゃう分にはかまわないみたいだが。
>>452 っぽく negative lookahead を実装するとこんな感じかな?
(defun re-search-forward-nla-1 (regexp nla-regexp bound)
;; bound should be non-nil
(let (tmp-bound
(not-found t))
(while (and not-found (re-search-forward regexp bound t))
(if (save-match-data (not (looking-at nla-regexp)))
(setq not-found nil)
(while (progn (goto-char (match-beginning 0))
(setq tmp-bound (1- (match-end 0)))
(and not-found (re-search-forward regexp tmp-bound t)))
(if (save-match-data (not (looking-at nla-regexp)))
(setq not-found nil)))
(forward-char)))
(if not-found
nil
(goto-char (match-end 0))
t)))
479デフォルトの名無しさん:04/05/02 04:17
              __
            γ ̄ ゚・  。ヽ
         へ_ノ゚゚・゚。γ⌒ヽω゚)
       ノo・゚゚。 ´д。ξ、  ν″
      ι 。Дζ_ゝ`ゞo〉 <スイ...マ...セ...ゴボ..ゴボッ...チョッ...ト..ズズズ...ココトボリマ...マ...グボッ
     /三≡゚・゚ つ "⌒つ
   〜〈 `,∀゚・゚。   っ ヘノ■)
    ζ・∀・・)ι゚。゚゚ 'Д⌒J
    ノ ∴ι"ヾー。~'つ っ
   (_と 。゚゚・・ /⌒ヽ゚ 。)
      )゚・゚。゚゚ノ    ";
      |。/|゚ /      ,’
      // |゚|     .
     U  .U    _

480学生:04/05/10 13:42
すいません。質問です。
学校の課題なのですがどうしてもできません。
次のような動作をするかんすうrevをつくれ
(rev '(a b c d e f))→(f e d c b a)
(rev '((a b) c (d e f)))→((d e f) c (a b))

誰か私を助けてください!!!
(defalias 'rev #'reverse)
482学生:04/05/10 14:13
すいませんが基本関数だけでお願いします。
(defun rev (x)
(cond ((equal x '(a b c d e f)) '(f e d c b a))
((equal x '((a b) c (d e f))) '((d e f) c (a b)))))
>>482 作りかけのコードでもあれば見せてみれば?
 (defun rev (sequence)
  (require 'cl)
  (reduce #'(lambda (seq item) (cons item seq)) sequence :initial-value nil))
これが俺のお気に入り。
(defun  rev  (list)
    (let  ((f  #'(lambda  (list  reversed  f)
                              (if  (null  list)
                                      reversed
                                      (funcall  f  (cdr  list)  (cons  (car  list)  reversed)  f)))))
        (funcall  f  list  '()  f)))
あらら…
(defun rev (list)
  (let ((f #'(lambda (list reversed f)
               (if (null list)
                   reversed
                   (funcall f (cdr list) (cons (car list) reversed) f)))))
    (funcall f list '() f)))
再帰版
(defun rev (x) (if (consp x) (nconc (rev (cdr x)) (list (car x))) x))

非再帰版
(defun rev (x)
(let ((l (list x)) p)
(while l
(if (consp (car l))
(setq l (cons (car (car l)) (cons (cdr (car l)) (cdr l)))
p (cons nil p))
(setq p (cons (cons (or (car l) (car p)) (car (cdr p))) (cdr (cdr p)))
l (cdr l))))
(car (car p))))
(defun nrev (list)
(let (prev next)
(while list
(setq next (cdr list))
(setcdr list prev)
(setq prev list
list next))
prev))

(defun rev (list)
(nrev (copy-sequence list)))
最近emacsを使い始めたんだが、lispの勉強の為に数行のゲームとかマクロとか
知っている人が書いてくれると初心者には便利かもしれない。
elisp上で動く数行の簡単なゲームって誰かつくっていないのかい?
リストを使った並べ替えパズルなんてのは簡単に出来そうな気がするんだが。
492学生:04/05/11 12:20
皆さんありがとうございました。
493491:04/05/11 12:36
とりあえず数十分で数当てゲームを作ってみた。

(defun game()
 (interactive)
 (let (rtn rnd)
  (setq rnd (random 10))
  (setq rtn (read-from-minibuffer "数字を当ててみて?(0-9) "))
  (setq rtn (string-to-number rtn))
  (while (/= rtn rnd)
   (setq rtn (read-from-minibuffer "ちょっとちがうな。(0-9) "))
   (setq rtn (string-to-number rtn))
  (message "あたり。答えは <%d> でした。" rnd))
 )
)

494デフォルトの名無しさん:04/05/11 13:25
Lispの初心者ということで(だよね?)、俺だったらこうすると思ったことをちょっと書きます。
変数名rtnとrndは見間違いやすいので、例えばanswerとinputなどとする。
letの後でsetqで値を代入する代わりに、let内で代入してしまう方が短くなる。
閉じ括弧は一箇所にまとめて書く。これは慣習。

そうすると、こんな風になります。
(defun game ()
  (interactive)
  (let ((answer (random 10))
        (input (string-to-number
                (read-from-minibuffer "数字を当ててみて?(0-9) "))))
    (while (/= answer input)
      (setq input (string-to-number
                   (read-from-minibuffer "ちょっとちがうな。(0-9) "))))
    (message "あたり。答えは <%d> でした。" answer)))
悪い。油断して、あげちまった。
できたら、お勉強はこっちでやってくれ。
http://pc5.2ch.net/test/read.cgi/unix/1063880951/
emacsスレは拡散しているね。むこうからも、ここへ誘導しているのがワラタ。
先生、emacsモナーさんを作ってみました。

(defun mona ()
  (interactive)
  (while t
    (message "( ´∀`)")
    (sit-for 2)
    (message "(´∀` )")
    (sit-for 2)
  )
)

(defun hit-and-blow (ans)
(interactive (list (let ((s "0123456789") (i 10) j c)
(while (< 6 i)
(setq j (random i) i (1- i) c (aref s i))
(aset s i (aref s j))
(aset s j c))
(substring s 6))))
(let ((prompt "Input 4 digits: ")
(count 1)
num hit blow)
(while (not (equal ans (setq num (read-string prompt))))
(setq count (1+ count))
(if (not (string-match "^[0-9][0-9][0-9][0-9]$" num))
(setq prompt "Input 4 digits[0-9]: ")
(setq hit 0 blow 0)
(let ((i 0))
(while (< i 4)
(if (= (aref num i) (aref ans i)) (setq hit (1+ hit)))
(setq i (1+ i))))
(let ((i 0))
(while (< i 4)
(if (string-match (string (aref num i)) ans) (setq blow (1+ blow)))
(setq i (1+ i)))
(setq blow (- blow hit)))
(setq prompt (format "%s: %d hit, %d blow. Input 4 digits: "
num hit blow))))
(if (= count 1)
(message "You hit %s, in the first try." ans)
(message "You hit %s, in %d tries." ans count))))
次は、○×をだれかプリーズ。
入力は、こんな感じでどう?
(read-from-minibuffer " │○│ 
―┼―┼―
 │×│ 
―┼―┼―
 │ │  コンマで区切って2つの数字を入力してください。(例 0,0)")

>>496さんの勧めに従って、途中経過は、
http://pc5.2ch.net/test/read.cgi/unix/1063880951/
の方でやったほうがよいかな? それで、完成品をここに展示と。

>>498さんも恥ずかしがらずに、トライしましょう。
ゲームではないけどミニ電卓。lispの式そのままなので前置記法。
ついでに定数としてpiとradを付けたしたので、三角関数とかは
  ?>(sin (* rad 90))
でラジアンから度(degree)の単位系になる。

(defun minicalc ()
  (interactive)
  (let (expression answer pi rad)
    (setq pi 3.14159
    (setq rad (/ pi 180))
    (setq expression (read-from-buffer "?>" nil nil 'read))
    (setq answer (eval expression))
    (if (integerp answer)
        (message (int-to-string answer))
      (message (format "%f" answer)))))
(defun minicalc (sexp)
(interactive "x?>")
(let ((rad degrees-to-radians))
(message "%s" (eval sexp))))
○×ボードだけ。

(defun index (x y) (+ (* y 3) x))
(defun ox-line (vector y)
  (format "%c|%c|%c"
          (aref vector (index 0 y))
          (aref vector (index 1 y))
          (aref vector (index 2 y))))
(defun ox-board (vector)
  (format "%s\n-+-+-\n%s\n-+-+-\n%s\n"
          (ox-line vector 0)
          (ox-line vector 1)
          (ox-line vector 2)))
(defun ox-read (vector o-or-x)
  (1- (string-to-int
       (read-from-minibuffer (format "%s (%cの番です) " (ox-board board)
                                     o-or-x)))))
(defun ox ()
  (interactive)
  (let ((board (vconcat '(?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))))
    (while t
      (aset board (ox-read board ?O) ?O)
      (aset board (ox-read board ?X) ?X))))
505502:04/05/12 20:01
>503
おーーーっ、こんなに短くできるんですか!スゴイ。
506502:04/05/12 20:07
つーことで、シンサク。
編集中のテキストや電子書籍などのテキストの"ー"をキター━━━(゚∀゚)━━━変換。

(defun kitaaa ()
  (interactive)
  (goto-char 0)
  (replace-string "ー" "━━━(゚∀゚)━━━"))

>>506
This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
(while (search-forward from-string nil t)
(replace-match to-string nil t))
which will run faster and will not set the mark or print anything.
(You may need a more complex loop if from-string can match the null string
and to-string is also null.)
508502:04/05/12 20:58
キターの応用。これもキター変換と同じで編集中の文章を一発変換。

(defun super-decyu ()
  (interactive)
  (let (count jtables rep orig)
    (setq jtables '(("さ" "ちゃ") ("し" "ち") ("す" "ちゅ") ("せ" "ちぇ") ("そ" "ちょ")
      ("サ" "チャ") ("シ" "チ") ("ス" "チュ") ("セ" "チェ") ("ソ" "チョ")
      ("だ" "ら") ("で" "れ") ("ど" "ろ") ("ダ" "ラ") ("デ" "レ") ("ド" "ロ")))
    (setq count 0)
    (while (> 26 count)
      (setq orig (car (nth count jtables)))
      (setq rep (cdr (nth count jtables)))
      (goto-char 0)
      (replace-string orig rep)
      (setq count (+ count 1)))))
>>508
変数に値を束縛するのには、なるべく let を使う。setq は必要な場合だけ。
replace-string は使っちゃだめ。
つーか、マニュアルくらい一通り目を通せ。
空白を「 」にするのはやめれ。消えて見えるのがいやなら &nbsp; に。

(defun super-decyu ()
(interactive)
(let* ((jtables '(("さ" . "ちゃ") ("し" . "ち") ("す" . "ちゅ")
("せ" . "ちぇ") ("そ" . "ちょ")
("サ" . "チャ") ("シ" . "チ") ("ス" . "チュ")
("セ" . "チェ") ("ソ" . "チョ")
("だ" . "ら") ("で" . "れ") ("ど" . "ろ")
("ダ" . "ラ") ("デ" . "レ") ("ド" . "ロ")))
(regexp (regexp-opt (mapcar #'car jtables))))
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(let ((rep (cdr (assoc (match-string 0) jtables))))
(when (stringp rep)
(replace-match rep))))))
510502:04/05/12 21:47
あれ、ここは外人の人も見てるんですか?日本語のアスキーアートは英語だと
文字化けするから変なコードの文字列を見て親切にwhile文で厳密に文字列を
チェックしてループした方が良いよっていっているのですかね?

This character sequence is the ASCII art using the Japanese character,
and the j0ke of the cultural in this BBS is mounted.
Neither speed nor high rate is so important.

Were you considered that I am searching some special character sequences?

>>510
M-x describe-function replace-string
512502:04/05/12 21:57
あら、すいません。
空白入れちゃいけませんでしたか。ブラウザで見ると全角のスペースでインデント
入るんで簡単だったので。
マニュアル読んでるんですけど、lisp初めて三日ほどなのでちょっと。。。。
replace-stringは駄目なんですか?search-forwardだと厳密に文字列を調べるとしか書いて
無かったので問題ないかなっと思ったんですが。

replace-string は対話用に用意されている。プログラムでは副作用の少ない
シンプルな関数を使うべき。next-line ではなく forward-line をとかね
(defun hoge (from-string to-string)
(while (search-forward from-string nil t)
(replace-match to-string nil t)))
な関数ないの?
>>498
(defun mona ()
(interactive)
(dolist ( ´∀` (let ((´∀`  '( ´∀` ´∀` )))
(rplacd (cdr ´∀` ) ´∀` )))
(message "%s" (list  ´∀`)) (sit-for 2)))
循環リスト作成のトリックがよくわからん……
最後のコンスセルのcdrをリストの先頭に替えてるだけ。
(defun mona ()
(interactive)
(dolist (mona '#1=( ´∀` ´∀`  . #1#))
(message "%s" (list mona)) (sit-for 2)))
(defun mona ()
(interactive)
(dolist (y (let ((x (mapcar #'list '( ´∀` ´∀` )))) (nconc x x)))
(message "%s" y) (sit-for 2)))

(defun mona ()
(interactive)
(while (mapcar (lambda (x) (message "%s" (list x)) (sit-for 2))
'( ´∀` ´∀` ))))
nconcのが、セルの絵描いても把握できないの。
こんな感じ

(defun my-nconc (&rest lists)
(let ((l (car lists)) (r (cdr lists)))
(while r
(while (cdr l)
(setq l (cdr l)))
(setcdr l (car r))
(setq r (cdr r)))
(car lists)))

(let ((a '(a b)) (b '(c d e)) (c '(f g)))
(list (my-nconc a b c) a b c))
=> ((a b c d e f g) (a b c d e f g) (c d e f g) (f g))
(let ((x (list 'a 'b))) (nconc x x))
x = (a b) = (a b . ())
'(a b)だと二回目以降の呼び出しで、やばいのでlistを使ってる。

(nconc x x)でxの最後の()をx(= (a b . ()))に変える。
(a b . (a b . ()))
単純に置き換えるとこうだけど、
x(= (a b . ()))の最後の()は変えられてるので
(a b . (a b . (a b . ....))) = (a b a b a b . ....)
(defun mona ()
(interactive)
(while t
(message "%s" '( ´∀`))
(sit-for 2)
(message "%s" '(´∀` ))
(sit-for 2)))
これでええやん。
>>523 ダサ
無限ループのためだけに循環リストを使う方がよっぽど…

大体、Emacs Lisp Reference Manual では list とは nil で終端された cons
セルの連続、つまり Common Lisp での proper list と定義されてる。

引数に list を要求する関数やマクロに circular list を渡した場合の挙動
は未定義だし、たまたま希望通りの動作をしたとしても、それが将来にわたっ
て同等の動作をすると期待できるものでもなかろう。
>>525 マジレスに当方当惑気味です。ごくろうさまです。
525はマジレスじゃなくてネタですよ。
短い面白コマンドを作ってくれる人はもういなくなったのか…

(defun kitaaa ()
(interactive)
(let ((゚∀゚ (mapconcat (lambda (x) (format "%s" (if (symbolp x) (list x) x)))
'("" ゚∀゚ ∀゚  ゚        ゚  ゚∀ ゚∀゚ "")
"━━━")))
(goto-char (point-min))
(while (re-search-forward "ー+" nil t) (replace-match ゚∀゚))))
530デフォルトの名無しさん:04/06/06 09:18
emacsをマルチスレッド化できない理由として、dynamic scope
があるそうですが、dynamic scopeじゃ駄目ってのは常識
なんでしょうか?素人考えでは、
・何もしなければロック無し
・束縛はスレッド固有にして、スレッドを立てる時にコピー
で実現できそうに思ったのですが、間違っていたら
突っ込んでください。
原理的に不可能なわけではないです。マルチスレッド化するにあたって必要とされる
Emacsのdynamic scope機構への変更が面倒くさいということなのではないでしょうか。

Dynamic scopeをサポートしているCommon Lispの処理系にマルチスレッド化されたものがあります。
ExcelLispという様な表計算マクロ物があればlisp本来の能力を発揮できそうだな
、と思う今日この頃。
>>532
ses-mode
n^m(nのm乗)を計算したいのだけれど、再帰でどうやって書いたら良いの?
ループよりは再帰で書くのが良いという事は分かるが良く分からん。
標準ライブラリにもないし。
535デフォルトの名無しさん:04/06/11 21:18
リスト遊びで勉強中なんですが、「5.1.4 等しいリスト」のとこで
つまずいてます。

`equiv' は入れ子のリストには対応してないので、改良して `equiv*'
を作るっていう話なんですが、なぜ `equiv' に入れ子のリストを渡す
と必ず nil が返るのか分かりません。実際に実行してみると確かに
nil が返ってくるんですが…

(defun equiv (x y)
(cond
((and (null x) (null y)) t)
((or (null x) (null y) nil))
(t (and (eq (car x) (car y))
(equiv (cdr x) (cdr y))))))

(equiv '(dog (pig)) '(dog (pig)))
=> nil
まず1回目の呼出しで (eq (car x) (car y) は t を返すので
再度 equiv が呼出されますよね。その際には
(equiv '(pig) '(pig)) のように呼出されると思うんですが
間違ってますか?これを自分で実行すると t が返ってきますが
(equiv '(dog (pig)) '(dog (pig))) では nil が返ってきます。

だからこの部分の解釈が間違ってるんだと思うんですが納得できない
んで誰かアドバイス下さい。
(equiv '((pig)) '((pig)))を評価しる。
>>534
expt
(defun equiv (x y)
(if (or (null x) (null y)) (and (null x) (null y))
(and (eq (car x) (car y)) (equiv (cdr x) (cdr y)))))
>>537
(cdr '(dog (pig)))
=> ((pig))
(eq (car '((pig))) (car '((pig))))
=> nil

ってことでしたか。納得しました。
でもリストについて理解してたつもりなのまた混乱してきた…
基礎から出直してきます。
>>534
Emacs Lisp でループで書ける物に再帰を使うのは池沼だが、あえて書くなら

(defun square (x)
(* x x))

(defun power (x n)
(cond ((= n 0) 1)
((= n 1) x)
(t (* (if (= (% n 2) 0) 1 x)
(square (power x (/ n 2)))))))
AAでちゃんと伝わるか不安ですが
(dog (pig)) って

| | | => | | | => nil
| |
dog | | | => nil
|
pig

こんな感じであってますかね?
(dog . ((pig . ()) . ()))
>538,541
サンクソ。激辛感動した。
loopで書けるのは分かっていたれど関数型言語だから再帰で書いてみたい。
再帰こそλの本質じゃないですか。チューリングマシン以外でコンピュータ
のメカニズムを記述できるのはラムだ!ラムダしか
(defun power (x n)
(cond ((= n 0) 1)
((= n 1) x)
(t (* (power x (% n 2))
(square (power x (/ n 2)))))))
現在プログラム板にはHSP関連スレに凶悪な荒らしどもが住みついています。

・HSPに関係の無い話題でスレッドを上げまくる
・HSPオフィシャルサイトの住人を名指しで誹謗中傷する
・重複スレを乱立させる

などの荒らし行為を行っています。
みんなで団結してム板のゴミどもを追い出しませんか?

【HSP関連スレ】
【皆のレイプ魔】HSP初質P25【WWEヲタ=ハゲ】
http://pc5.2ch.net/test/read.cgi/tech/1086878505/
HSP>>>>>>>>>>>>>C=糞w
http://pc5.2ch.net/test/read.cgi/tech/1071899663/
今日もどこかでHSP初心者が質問ですP19
http://pc5.2ch.net/test/read.cgi/tech/1084089079/
HSPについて
http://pc5.2ch.net/test/read.cgi/tech/1085149790/
要するに、非破壊的とか束縛という概念はポインタとかガベージコレクション
を前提としている訳だ。簡単に言うと変数の取り扱いだ。
これをlisperはいちいち難しい言葉を使って束縛だの非破壊だのと言っている
のだ。つまりそれはフロイト的に言うと無意識の抵抗だ。HSP厨房のような
連中にLISPを気安く語って欲しくはないという無意識の抵抗が「束縛」とか
「非破壊的変数」などという言葉を発してしまうつまりは古典的ハッカーの
リビドーなのだ。
だがここで一つの疑問が残る。なぜにHSP厨なのかという点だ。恐らく事は
エディプスコンプレックスなのではないかと思う。つまり潜在的にLisper
(C++,Java等の高級言語ユーザーも含む)は、日夜アホで低レベルな会話や
車輪の再発明をしているそのアホさにコンプレックスを抱いているのだ。
つまりHSP厨はアホな父親像であり、コンプレックスを抱きつつあほな父親像
にエディプスコンプレックスを意識しているのだ。ということは、
Lisper(C++,Java等の高級言語ユーザーも含む)は、深層心理の何処かでHSP厨
を強く意識しているはずであり、厨のアホ父親像に劣等感さえ憶えてしまっている
という事が明らかとなるのである。
という事は、fancy新山が留学やunixuserドメインを持ちエリート指向丸出しであり
ながら隠れてアホなblogを書いているのは厨という存在を強く意識している
深層心理の現われであり、フロイト的に分析すると、fancy新山は将来アホオヤジ
になるに違いない。
末尾再帰に置き換えて
(defun power-tailrecur (x n r)
(cond ((= n 0) r)
((= n 1) (* r x))
(t (power-tailrecur (* x x) (/ n 2) (if (= (% n 2) 0) r (* x r))))))

ループに展開
(defun power-loop (x n)
(let ((r 1))
(while (> n 1)
(setq r (if (= (% n 2) 0) r (* x r))
x (* x x)
n (/ n 2)))
(if (= n 0) r (* x r))))
(defun power-loop (x n)
(let ((r 1))
(while (> n 0)
(setq r (if (= (% n 2) 0) r (* x r))
x (* x x)
n (/ n 2)))
r))
(dotimes (i 10000)
(power-loop-548 10 1)
(power-loop-549 10 1))

Function Name Call Count Elapsed Time Average Time
============== ========== ============ ============
power-loop-549 10000 0.2789190000 2.789...e-05
power-loop-548 10000 0.1663990000 1.663...e-05
(defun power-loop (x n)
(let ((r 1))
(while (and (setq r (if (= (% n 2) 0) r (* x r))) (> n 1))
(setq x (* x x)
n (/ n 2)))
r))
powが出たついでに聞いちゃうけれどlispのラムチャン式で再帰的なsum(0からnの合計、Σ)
を計算しようとしてサンプルを見ながらリストを使ってよりエレガントにしてみた。

(defun sum (n)
(if (> n 0)
(cons n (sum (- n 1)))
nil))

ところが最後のリスト(1 2 3)などを合計する所が分からないのですが、
どうしたらいいですか。

apply
ラムさんです。

((lambda () (princ "こんにちはぁ〜っ、ラムでぇ〜す★")))
('A`)
Invalid read syntax: ")"
>>556
ワロタ
真偽値(nil, non-nil)のリストを引数にして論理和、論理積を返す関数をそれぞれ作れ。
(defun ronriwa (list)
(eval `(or ,@(mapcar (lambda (x) (list 'quote x)) list))))
(defun ronriseki (list)
(eval `(and ,@(mapcar (lambda (x) (list 'quote x)) list))))
(defun ronriwa (list)
(not (eval `(and ,@(mapcar #'not list)))))
(defun ronriseki (list)
(not (eval `(or ,@(mapcar #'not list)))))
(defun ronriwa (list)
(memq nil (mapcar #'not list)))
(defun ronriseki (list)
(not (memq nil list)))
上のはmeadowですか?xyzzyだと動かないや。
エディタ毎の関数や命令の実装状況ってどうなってるんですかね?
xyzzy,Meadow,muleなどのelバージョンとか実装の比較や一覧の資料があると
いですね。
xyzzyはcommon lisp系のためemacs系のmeadow, muleとはlispの汎用的な機能で違う点が多い。
muleはemacs19系かな。meadowはemacs20系。meadow2はemacs21系。

>>561がxyzzyで動かないのはmemqのせいかな。だったら、memberを使えばいいかも。
てゆーかxyzzyはEmacsじゃねーだろよそいけ
かたいこというなよ
相対的にemacs人口少ないからxyzzzzzzzyも入れorzkkksssssskksllll!.a..ak
見た目増えるからyoshiiiiiii.a....aa..aa.aa.a.aa.a.a.a.a..a.a.eeeeeeeee
.....良し。

しかし人が少ないスレだな。厨房はemacs使わずにVisuあーるすたdioか秀丸
なのだろうな。
>>566 ッテキチガイ?
>>567
ただのxyzzyユーザーです。
>>568
なんだ、キチガイか...
570566:04/07/06 18:20
LISP的なAA置いとく。

λ......         λ......       λ......
  λ......            λ......
 λ......      λ......        
        λ......                  λ......
    λ......             λ......
                λ......
 λ......       λ......          λ...... 

>>570
変にめげないおもしろいやっちゃな。少し好きになったよ
xyzzyユーザーが入ってもいいけどxyzzyとEmacsは別物だから、
xyzzyで動くの?とか、互換性はどうなってるの?とか聞かれても困るし、
xyzzyとEmacsの違いは自分で埋めてね。
xyzzyはどこまで発展してもEmacsのパチもんだから、いいんでない?
574デフォルトの名無しさん:04/07/09 18:39
Linux magazine8月号でRubyの作者が
Emacs Lispが遅いからcmailが遅い、
数百のメールを表示するのに数分かかるって言ってるんだけど
単にcmailがヘボなだけちゃうの?
>>574
そうだな。Gnus や Mew なら数秒だな。
Wanderlust は数分だけど(藁)
結論
Ruby>>>>>>>>|越えられない壁|>>elisp
>>576
その不等号は所要時間を比較しているんだな?
578デフォルトの名無しさん:04/07/14 01:44
emacsのcodingまわりをいじりたいんですが、Cからelispへの
コールバックについて分かる人いませんか?
callN(),specbind()は分かったけど、GCPROn()はよく分かりません。
他にも、どんな場合にrecord_unwind_protect()が必要か、
lispを安全に呼び出せない場所はどう見分ければいいか、
とか基本的なことが分からなくて困っています。
elispとGCとその他もろもろの知識不足だろ。先は長そーだな。
まずはelisp manualを嫁。

GCPROn()はCのローカル変数なLisp_ObjectがGCされないように保護するマクロ。
record_unwind_protect()はelispのunwind-protectを理解すればわかる。

だけど>>578はspecbindやrecord_unwind_protectを使うよりも、Lisp関数に直接
対応するFletやFunwind_protectを呼ぶ方が早くて確実だと思う。あとevalと
FprognとFcons/Fcar/Fcdr/FlistぐらいあればS式作って呼ぶのはできるだろ。
文字列からシンボルを作るのはinternな。
>>578
ttp://docs.biostat.wustl.edu/cgi-bin/info2html?(internals.info.gz)Top

これでも読んどけ。
581578:04/07/14 16:29
>>579-580
ありがとうございます。
GCについてはinfoにばっちり書いてありました。
record_unwind_protectは、使い方はいいのですが使いどころが
分からないのです。資源の解放は当然として、他に何を触ったら
元に戻す必要があるか、ということです。
その辺、emacs全体の設計を理解しないと難しいのでしょうか?
emacs全体の設計というか……579のいうように、elispとEmacs自体の知識不足だろ。
はっきりいって、そんな質問が出てくる方が信じがたい。
保守にまいりました。でも誰もいませんね。
同感...
どれに同感なんだろう??? やっぱり>>583?

いや>>1にだろ
587デフォルトの名無しさん:04/09/11 19:40:45
なんか話題ない?
588デフォルトの名無しさん:04/09/12 10:01:07
(defmacro deflocal (variable default &optional documentation)
"Define an ilisp local variable."
(` (progn (lisp-deflocal '(, variable))
(defvar (, variable) (, default) (, documentation)))))
(`で始まる、このバッククォートの使い方は、仕様化された書き方でしょうか?
ilispで見つけたのだけど。
589430:04/09/12 11:32:31
>>588
昔の書き方だよ。
590デフォルトの名無しさん:04/09/12 11:59:03
info嫁。

In old Emacs versions, before version 19.29, ``' used a different
syntax which required an extra level of parentheses around the entire
backquote construct. Likewise, each `,' or `,@' substitution required
an extra level of parentheses surrounding both the `,' or `,@' and the
following expression. The old syntax required whitespace between the
``', `,' or `,@' and the following expression.

This syntax is still accepted, for compatibility with old Emacs
versions, but we recommend not using it in new programs.
591デフォルトの名無しさん:04/09/12 13:18:01
なるほど。ありがとう。
592デフォルトの名無しさん:04/09/26 03:07:49
Meadowのキータイプって異様に重いんですが・・・
なんかタイプしてから少し遅れて文字がついてくる感じです
なんか設定がまずい?それともこーいうもん?
xyzzy はスクロールも描画も早いですよね

593デフォルトの名無しさん:04/09/26 04:13:01
594デフォルトの名無しさん:04/11/04 22:42:18

595デフォルトの名無しさん:04/11/24 21:52:27
あれ?
596デフォルトの名無しさん:04/11/24 23:26:38
どうされました?
597BlackLightOfStar ◆ifsBJ/KedU :04/11/25 13:30:55
Re:>595 Lispじゃないんだけど、Emacsのバックスペースってどうやるのかな?と逆に疑問を吹っかけてみる。
598デフォルトの名無しさん:04/11/25 15:09:00
Emacsのバックスープレックスならやり方しってるけど?
599デフォルトの名無しさん:04/11/25 18:43:30
>>597
その「Re:」というのは何かな、と疑問を吹っかけてみる。
600デフォルトの名無しさん:04/11/25 18:52:17
勘違いしてるんでしょ。
601BlackLightOfStar ◆ifsBJ/KedU :04/11/25 19:12:41
Re:>600 お前に何が分かるというのか?
Re:>598 C-b C-dで何とか…。
602デフォルトの名無しさん:04/11/25 19:32:04
計算アルゴリズム
http://pc5.2ch.net/test/read.cgi/tech/1090227743/
ここの1?
603デフォルトの名無しさん:04/11/25 20:57:38
Re:Re:Reのおじさん
604デフォルトの名無しさん:04/11/25 21:01:08
「Re:」が返答の意味を表すと思ってるBlackLightOfStarに何が分かるというのか?
605デフォルトの名無しさん:04/11/25 21:07:23
Resp
606デフォルトの名無しさん:04/11/26 11:55:08
そんなことより問題なのは "Emacsのバックスペース" が何を意味するかだろ

まさかヘルプが起動してしまって右往左往してるとかじゃないよな? 違うよな?
607デフォルトの名無しさん:04/11/26 12:07:13
あんまり荒らしにかまうなよ。
608デフォルトの名無しさん:04/11/26 15:16:02
カーソルの右を消すか左を消すかじゃないの?
609BlackLightOfStar ◆ifsBJ/KedU :04/11/26 15:50:00
Re:>608 カーソルの右を消すのはDeleteに対応する。EmacsではC-d.
610デフォルトの名無しさん:04/11/26 18:18:50
BlackLightOfStarは黙ってろ。
611デフォルトの名無しさん:04/11/27 00:32:10
前にもこういう中途半端に間違ってるのに何故か自信満々な香具師を見たような希ガスる
612デフォルトの名無しさん:04/11/29 10:40:46
「>608に関して」ということでまったく間違っているというわけではないが…。
うざいな。
613デフォルトの名無しさん:04/11/29 17:04:28
>>612
当の本人が、「返答」の意味がある、と思っているらしい。
614デフォルトの名無しさん:04/11/29 18:13:16
バックスペースについては delete-backward-char を C-h に
割り当ててやればいいだけの話なんだが、
こう書いても彼にはきっと理解できないだろう。

と、煽ってみるテスト。
615BlackLightOfStar ◆ifsBJ/KedU :04/11/29 18:29:25
Re:>614 お前に何が分かるというのか?
616デフォルトの名無しさん:04/11/29 19:27:54
理解できるまで出てこなくていいよ。
617デフォルトの名無しさん:04/11/29 21:26:17
数学板のクズなんてほっとけ。
618BlackLightOfStar ◆ifsBJ/KedU :04/11/29 22:01:43
キーカスタマイズしてバックスペースが出来るようになるのはいいけど、
カスタマイズしないでバックスペースが出来るのかどうかを問題にしよう。
WindowsのCygwinのemacsでは、バックスペースらしいキー割り当てがなかった。
619BlackLightOfStar ◆ifsBJ/KedU :04/11/29 22:12:46
ああ、そうだ、ここはLispのスレだった。
仕方がない、何か書いとこう。
(dotimes (x 10) (princ (format "%d" x)))
620Conscientious Irrationalist ◆ZETA.aMskA :04/11/29 22:28:41

BLoS (BlackLightOfStar)、 WindowsでCygwin附属のemacsなど使用しない方がよい
NTEmacsスレへ行って、いずれかのNTEmacs binaryをダウンロードしてくるのがベストだ。

>>619
> (dotimes (x 10) (princ (format "%d" x)))

吾は自己主張欲の強い人間は嫌いではないが、あまり意味のない書き込みはしないでくれ。
それにどうせ書くんだったら再帰をしてほしかったよ。

毎日ナヨナヨした生活+思考をしているからそうなるんだよ。
出直してこい!

           Man is that which is to be overcome...
             -- Conscientious Irrationalist
621デフォルトの名無しさん:04/11/29 22:56:06
(gc)
622BlackLightOfStar ◆ifsBJ/KedU :04/11/29 22:58:59
かくいう私は、Windowsではxyzzyを使っている。
Unix系OSではEmacsを使うけどね。
バックスペースキーでバックスペースもできる。
C-hではやっぱりヘルプが出る?
623デフォルトの名無しさん:04/11/29 23:58:21
いいかげんにWindowsキーバインド準拠してください
624デフォルトの名無しさん:04/11/30 00:07:12
自分でキーマップ書け。
625デフォルトの名無しさん:04/11/30 00:07:39
>>618
normal-erase-is-backspace が nil
なんだろ?

Emacs 以外のところでキーバインドを変えればいいじゃないか
そしてそれはスレ違いで板違いだよ

cygwin スレか UNIX 板に行っておいで
626デフォルトの名無しさん:04/11/30 02:28:29
こんな頭に蛆を飼ってる香具師を誘導されても困る
627デフォルトの名無しさん:04/11/30 02:34:01
虫且って何て読むんですか?
628デフォルトの名無しさん:04/11/30 10:59:02
>>627
> 虫且って何て読むんですか?
Black Light Of Star
629BlackLightOfStar ◆ifsBJ/KedU :04/11/30 14:41:02
Re:>628 お前に何が分かるというのか?
630デフォルトの名無しさん:04/11/30 19:40:12
KingかわいいよKing
631デフォルトの名無しさん:04/11/30 20:34:05
elispのスレなんだから◆ifsBJ/KedUはelispの出力なんだろ。
doctor.elくらい読んでから実装しなおすことを勧める>作者
632BlackLightOfStar ◆ifsBJ/KedU :04/11/30 21:31:31
(princ "BlackLightOfStar ◆ifsBJ/KedU ")
633デフォルトの名無しさん:04/12/01 00:16:02
Kingよ
オレの>>625のアドバイスは試したんか?

>>632なんかして遊んでる暇があったら解決したかどうかくらい書いてよ
634デフォルトの名無しさん:04/12/01 02:17:26
いちいち荒らしにかまうなよ
635BlackLightOfStar ◆ifsBJ/KedU :04/12/01 10:25:54
Debugger entered--Lisp error: (void-function normal-erase-is-backspace)
(normal-erase-is-backspace)
eval((normal-erase-is-backspace))
eval-last-sexp-1(t)
eval-last-sexp(t)
eval-print-last-sexp()
* call-interactively(eval-print-last-sexp)
636デフォルトの名無しさん:04/12/01 10:42:10
>>635
どうしようもないバカだなお前は
637BlackLightOfStar ◆ifsBJ/KedU :04/12/01 11:08:34
Re:>635
normal-erase-is-backspace
がLispの仕様書のどこに書いてある?
638BlackLightOfStar ◆ifsBJ/KedU :04/12/01 11:09:07
Re:>636
normal-erase-is-backspace
がLispの仕様書のどこに書いてある?
639Conscientious Irrationalist ◆ZETA.aMskA :04/12/01 18:02:24
>>635
>>637
>>638

君、もうそれ飽きたよ。それがネタであるというのが丸見えである故、皆は
萎えてしまうわけだ。しかし、君が本当に素でそれを書いているのなら教えてやろう。

             normal-erase-is-backspaceはt
         そしてnormal-erase-is-backspaceは関数ではない

Emacsはcygwinターミナルではうまく動かない。
故に吾は>>620で別のを使用することを勧めたわけだ。
これ以上同じトピックを持ってきてこのスレを汚すのであれば「荒らし」と思われ
ても仕方ないな。

--------------------------------------------------------------------------------

             Conscientious Irrationalist
640デフォルトの名無しさん:04/12/01 18:27:06
つか、emacs独自にならざるをえない関数や変数が沢山あるのはあたりまえなのに、
> normal-erase-is-backspace
> がLispの仕様書のどこに書いてある?
という発言をするってのは、頭の中が腐ってるとしか思えない。
最初から分かってはいたことだけど。
641デフォルトの名無しさん:04/12/01 19:30:25
eLisp の仕様書ってあるの? とりあえずマニュアルには以下の通り。
ttp://www.delorie.com/gnu/docs/emacs/emacs_512.html

Lisp の仕様、てだけじゃ
MacLisp なのか Interlisp なのか Lisp1.5 なのか AutoLisp なのか
newLISP なのか Scheme なのか CommonLisp なのか T なのか。
どれの仕様書のこと言っているのかわからないよね。
まあどれの仕様書にも eLisp の機能については書いてないだろうけど。
642デフォルトの名無しさん:04/12/01 19:34:56
eLispって……別物に見えるぞ。Emacs Lispと書けよ。もしくは略してelisp。

643デフォルトの名無しさん:04/12/01 19:49:40
eLisp って略記は確かに見ないね。失礼。
644デフォルトの名無しさん:04/12/01 19:52:54
開発元を見ようとしないのってわざとやってるの?
http://www.gnu.org/software/emacs/elisp-manual/
645デフォルトの名無しさん:04/12/01 20:13:35
>>644
「ぐぐる厨」じゃないの?
646BlackLightOfStar ◆ifsBJ/KedU :04/12/01 22:07:40
(normat-erase-is-backspace)
関数が定義されていません: normat-erase-is-backspace

xyzzyでやった。
xyzzyなら、BackSpaceキーが普通に使えるから問題ないけどね。
647デフォルトの名無しさん:04/12/01 22:45:11
すみませんがこの板初心者なもので、ちょっと聞いてもいいですか?
>>646 の人はわざとボケてるんでしょうか。それとも天然ですか?

普通のEmacs使いなら、C-h f normal-erase-is-backspace <RET> か
それで出てこなかったら C-h v normal-erase-is-backspace <RET> を
試してみると思うんですが...
648デフォルトの名無しさん:04/12/01 22:57:03
しーっ、見ちゃいけません!
だから透明あぼーん推奨。キチガイには触れないのが吉。
649BlackLightOfStar ◆ifsBJ/KedU :04/12/01 22:58:25
Re:>647 私はLispインタプリタとしてのEmacs,xyzzyを知っているからなあ。というか、そんなコマンド初めて見た。
650デフォルトの名無しさん:04/12/01 23:29:40
◆ifsBJ/KedU = ◆ZETA.aMskA = >>595 は何故このスレを荒らしてるの?
651デフォルトの名無しさん:04/12/01 23:39:24
分からないときはまず>>278だよ.
>>637なんかして遊んでる暇があったら検索くらいしてよ.

> 知っているからなあ。というか
知らないんだよなぁ….
652デフォルトの名無しさん:04/12/02 02:45:04
俺のMeadow(Emacs20ベース)ではマッチしないってでるんだけど。
653デフォルトの名無しさん:04/12/02 08:19:22
>>649
バックスペース云々はエディタとしてのEmacsの話じゃないのか?
……とか何を言っても無駄か。
654デフォルトの名無しさん:04/12/16 23:47:22
どうでもいい質問ですが...
Emacs Lisp (elisp) で書いたコードの配布物を何て呼んでます?

1. プログラム
2. スクリプト
3. マクロ

2はときどき見かけるけど、
3は言語要素のマクロと間違えそうだから違うような気がするし、
655デフォルトの名無しさん:04/12/17 00:53:51
オレはパッケージって言うコトが多いかな.
ファイル 1 つでもパッケージ, 複数ファイルでもパッケージ.

なんとなく.
656デフォルトの名無しさん:04/12/17 00:59:27
>>654
どれかっつったら1かな。
3はないだろ。
657デフォルトの名無しさん:04/12/17 05:02:46
コード
658デフォルトの名無しさん:04/12/17 05:50:55
紛らわしい気もしないでもないが、elispといっても何故か結構通じるよね。
他の言語だと当然変な文なのだが。
マクロはありえない。
659デフォルトの名無しさん:04/12/17 06:10:15
>>658
シェルスクリプトのことをシェルと呼ぶような薄ら寒さを感じる
660デフォルトの名無しさん:04/12/17 07:03:34
俺もelispということ多いなあ。
思うに、*.elの拡張子をつかまえて、elにelisp(ファイル)と振り仮名が
ふってあるつもりでいるんじゃないかと。
*.elcはelispとは言わないし、*.elのことをEmacs Lispとも言わないし。
言語名はEmacs Lisp(またはその省略形でelispと呼ぶことも)、
ファイルや配布物はelisp(Emacs Lispとは言わない)。

例えば*.texとか*.psとか*.htmlとかだと同様の用法をする人多いと思うんだけど。
Windowsの人だと*.exeや*.zipもエグゼといったりジップといったりする人いるでしょ。

なぜか全ての拡張子に普遍的に使われる用法ではないとは感じるんだけど、
語呂の問題だろうか。
661654:04/12/17 10:46:53
どうもありがとうございます。
成果物をEmacs Lispとかelispとかいうのはなんか違和感があったんですが、
>>660 にはなるほどと思いました。
662デフォルトの名無しさん:04/12/17 19:08:16
elispプログラム
663デフォルトの名無しさん:04/12/17 19:24:36
sex
664デフォルトの名無しさん:04/12/17 23:28:20
EL&P
665デフォルトの名無しさん:04/12/21 20:12:49
(load-library "ぬるぽ") って使うから、
一つ一つのファイルに対しては library が正式ではないかな。








666デフォルトの名無しさん:04/12/21 21:12:52
=> ガッ
667デフォルトの名無しさん:04/12/21 21:29:46
根拠薄弱。それに正式かどうかなんてどうでもいい。
668デフォルトの名無しさん:05/01/04 19:56:29
'hosyu
669デフォルトの名無しさん:05/02/21 07:35:50
初心者です。

(interactive "r") で範囲指定された文字列を処理するような関数で、範囲指
定されていない場合にプロンプトが出て入力を聞いてくるようにしたいのです
が、どうすればいいでしょうか。
670デフォルトの名無しさん:05/02/21 09:08:15
>>669
(interactive (S式))
みたいにして、S式部分が関数の引数を返すようにする。
himark.elあたり参考にならないかな。
671デフォルトの名無しさん:05/02/21 13:16:48
>>670
出来ました! ありがとうございます。himark.el 思い切り参考になりました
672まんこ:05/03/15 14:52:54
>>671
うるせーばか
673デフォルトの名無しさん:05/03/15 20:12:10
春よのぅ...( ゚A゚)y─┛~~
674デフォルトの名無しさん:2005/03/27(日) 15:31:30
Perlでいうところの

while (<>) {
 一行を処理
}

みたいな感じのテキストファイル加工に使ってみたいのですが、
バッファを新しく作ってファイルをvisitするのが定跡なんですか?
675デフォルトの名無しさん:2005/05/15(日) 18:56:48
test
676デフォルトの名無しさん:2005/05/22(日) 18:33:52
すごくさびれてる
677デフォルトの名無しさん:2005/05/22(日) 23:38:39
unix板にスレあるからな
678デフォルトの名無しさん:2005/05/28(土) 12:50:24
気になったんだが
lispやってる人ってどういう人?
679GreatFixer ◆ASWqyCy.nQ :2005/05/28(土) 12:55:40
Re:>>678 Maximaの作者とか、Emacsの作者とか。人工知能の開発にも使われているそうだ。
680デフォルトの名無しさん:2005/05/28(土) 15:03:35
俺のイメージでは Lisper は C, UNIX, ASM, コンパイラ構築法に精通してる孤高の変人
681Zeno ◆5nZQbNmQPs :2005/05/28(土) 15:38:11

Reply-to:>>679
      現在ではプロジェクトのメイン言語を LISP にする人口知能系
         グループなどほとんどない。現実を知っておけ。
             まあ、美しい言語ではあるがな。

________________________________________________________
セオドア・カジンスキー 「産業社会とその未来」 (aka. マニフェスト) の抜粋
http://www.cnn.com/US/9509/unabomber/09-19/am/excerpt.html
682デフォルトの名無しさん:2005/05/28(土) 17:00:34
なにこの自演
683GreatFixer ◆ASWqyCy.nQ :2005/05/28(土) 17:59:10
Re:>>681 参照先の文章のどこを読めばいいのだ?
684Zeno ◆5nZQbNmQPs :2005/05/28(土) 18:43:55
Reply-to:>>683
      本当はマニフェスト全てを読むのが一番だが、上のは抜粋のみ。
             それぐらいは全て読むべきだ。
    それと、次にプログラミング言語を学ぶのであれば Python にしておけ。
________________________________________________________
セオドア・カジンスキー 「産業社会とその未来」 (aka. マニフェスト) の抜粋
http://www.cnn.com/US/9509/unabomber/09-19/am/excerpt.html
685GreatFixer ◆ASWqyCy.nQ :2005/05/28(土) 18:48:26
Re:>>684 Pythonを覚えるくらいならperlをやりたい。(というよりも私はperlをほとんど習得していない。)それと、マニフェストの話題を出す意味は何なの?
686Zeno ◆5nZQbNmQPs :2005/05/28(土) 18:52:24

Reply-to:>>685

       Perl はやってもよいが、あまり伸びない言語ではあるぞ。
吾はマニフェスト自体を話題に出してはいない。(それはシグネチャーとして参照されていただけだ。)
             君が話題にだしてきたのだろ?

________________________________________________________
セオドア・カジンスキー 「産業社会とその未来」 (aka. マニフェスト) の抜粋
http://www.cnn.com/US/9509/unabomber/09-19/am/excerpt.html
687GreatFixer ◆ASWqyCy.nQ :2005/05/28(土) 20:06:19
Re:>>686 でもperlを知らないとPythonとRubyはできないんじゃないの?
688デフォルトの名無しさん:2005/05/28(土) 21:58:09
>>687
それはない。
689GreatFixer ◆ASWqyCy.nQ :2005/05/28(土) 22:37:30
Re:>>688 ならPerlとPythonとRubyは似ているだけだという解釈でいいの?
690デフォルトの名無しさん:2005/05/28(土) 23:48:48
>>689
乱暴だが
Python=C like
Ruby=Perl like
691デフォルトの名無しさん:2005/05/29(日) 00:13:28
692デフォルトの名無しさん:2005/05/29(日) 10:39:18
>>678=>>679=>>681 は基地外自演
変態的なアンカーと意味不明なコテが特徴的
693デフォルトの名無しさん:2005/05/29(日) 12:42:55
>>692見ればわかるよwww
694Zeno ◆5nZQbNmQPs :2005/05/29(日) 14:45:25

Reply-to:>>692-693
      吾は 2 チャンネルで一度も自作自演をしたことはないがな。
________________________________________________________
セオドア・カジンスキー 「産業社会とその未来」 (aka. マニフェスト) の抜粋
http://www.cnn.com/US/9509/unabomber/09-19/am/excerpt.html
695GreatFixer ◆ASWqyCy.nQ :2005/05/30(月) 09:01:26
Re:>>692-693 お前に何が分かるというのか?
Re:>>690 PerlってC likeじゃないの?
696デフォルトの名無しさん:2005/07/28(木) 00:23:15
oops, teleporter
697デフォルトの名無しさん:2005/08/27(土) 16:51:44
質問です。

ファイルを開く時に任意のバッファ名を付けたいんですが、
そのような関数が見当たりません。

もしかして、そういう事をするには先にバッファを作ってから
ファイルを開くってのが常套手段なんでしょうか?
698デフォルトの名無しさん:2005/08/27(土) 17:31:14
(let ((my-buffer-name "hoge")
(my-file-name (expand-file-name "~/.emacs")))
(flet ((generate-new-buffer (name)
(get-buffer-create my-buffer-name)))
(find-file my-file-name)))
699697:2005/08/27(土) 20:15:48
>>698
どうもです。

随分トリッキーな感じのコードですが、確かに別名でバッファを作成出来ました。
ただ1つ問題があります。上の例だと、既に.emacsが開かれている場合は
そのバッファに移動するだけになってしまいます。
できれば、重複してロードしてしまいたんですが。
別名のほうは、リードオンリーにすれば問題はなさそうなんですが…
700デフォルトの名無しさん:2005/08/27(土) 21:07:10
バッファつくってから insert-file-contents
701697:2005/08/27(土) 23:34:16
>>700
ファイル挿入も考えたんですが、それだとモードがFundamentalのまま
になってしまい、構文ハイライトなどがなくてちょっとさみしいです。

ちょっと調べたところ、clone-indirect-bufferとか
make-indirect-bufferなどでバッファを複製できる事がわかりました。
これで、ファイルが読み込まれているかどうかで場合分けして、

読み込まれていない→>>698
読み込まれている→バッファ複製

で目的を達成できそうです。
とりあえず、ありがとうございました。
702デフォルトの名無しさん:2005/08/28(日) 00:11:55
set-auto-mode
703デフォルトの名無しさん:2005/08/28(日) 00:17:38
ファイル挿入したあと、 (normal-mode) とかすればいいでしょ。
704名無しさん@そうだ選挙に行こう:2005/09/11(日) 17:59:08
質問です。

(interactive "P")な関数において、引数がコンスセルかどうかを
チェックしていたりするものがあるんですが、引数にコンスセルが
渡ってくることってあるんでしょうか?

それとも、単にコンスセルを引数にして直接呼び出しに対応させてる
だけなんでしょうか?(どうも、そういう感じではなさそうなんですが...)

ちなみに、コンスセルの形式は、(NUM . CHAR)みたいな感じらしいです。
705名無しさん@そうだ選挙に行こう:2005/09/11(日) 18:49:19
(defun hoge (x)
(interactive "P")
(message "%S" x))
して M-x hoge、C-u M-x hoge、C-u 4 M-x hoge を比べてみれ
706名無しさん@そうだ選挙に行こう:2005/09/11(日) 19:27:30
>>705
cons cell かどうかが肝なんだからそれは的外れじゃん?

>>704
interactive に呼出して cons cell が来ることはない…と思う。やっぱ直呼
び用なんじゃないの?
707名無しさん@そうだ選挙に行こう:2005/09/11(日) 19:38:49
C-u M-x hoge なら (cons 4 nil) が渡されるじゃん?
708名無しさん@そうだ選挙に行こう:2005/09/11(日) 19:49:56
>>707
ああ、まあ cons っちゃー cons だけど (NUM . CHAR) の形式を期待してるら
しいからさ。
709704:2005/09/12(月) 00:56:55
>>705
おお!確かに(interactive "P")では、常に整数だと思ってたらダメですね。
試しに(interactive "p")にしたら、常に整数が渡ってくるようですが、
そのかわりに、引数のありなしが判定できそうにないです。

ようするに、引数のありなしを判定するには(interactive "P")にする
必要があるが、引数をconspする必要があるという理解でいいんでしょうか?

>>708
すみません。当てずっぽうで言ったことなんで。。。

>>705-708
ありがとうございました。
710デフォルトの名無しさん:2005/09/13(火) 10:24:03
ところでネストレベルで括弧を色分けするようなelispは既にありますか?
711デフォルトの名無しさん:2005/09/14(水) 02:14:03
こんなん? 触ったことはないけど。
ttp://www.foldr.org/~michaelw/emacs/mwe-color-box.el
712デフォルトの名無しさん:2005/09/19(月) 23:23:55
(defun ・∀・ ()
"ニヤニヤ"
(message "ニヤニヤ"))

(・∀・)C-u C-x C-e
713デフォルトの名無しさん:2005/09/19(月) 23:26:32
修正。
(defun ・∀・ ()
"ニヤニヤ"
'ニヤニヤ)
714デフォルトの名無しさん:2005/09/26(月) 15:27:38
elisp で「プロセス A が終わってからこのコードを evaluate する」とか
「コードフラグメント A が終わってからこのコードを evaluate する」
のようなことってできますか?
715デフォルトの名無しさん:2005/09/26(月) 16:56:17
(set-process-sentinel PROCESS SENTINEL) とか?
716デフォルトの名無しさん:2005/09/26(月) 20:21:47
後者は関数にadviceするとか
717デフォルトの名無しさん:2005/09/27(火) 18:59:23
Emacsで現在、扱っているファイルのディレクトリまでを示してくれる関数って
存在しますか?(日本語が変でごめんなさい。)
例で言うと、例えば、ファイルが 〜/usr/share/.foo ならば、 〜/usr/share までを
返してくれる関数です。ちょうど、 (buffer-file-name) から (buffer-name)
を引いたような感じの関数を探しています。
718デフォルトの名無しさん:2005/09/27(火) 19:26:30
file-name-directory()
719717:2005/09/27(火) 19:40:55
ありがとうございます。問題解決しました!
720デフォルトの名無しさん:2005/10/25(火) 21:43:34
初歩的な質問だと思いますが,
xemacsで
/home/mako/jikken/userFiles/690562.txt
など,
/homeではじまり.txtで終るファイル
へのパスが書かれていた場合,
そのパスの上でマウスの中ボタンをクリックすれば,
xemacsでそのファイルを起動できるようにする方法を
教えてください.

あまりLISPにくわしくないので,記述法など詳細に教えて頂ければ
助かります.

googleで検索したところ,URLをマウスの中ボタンをクリックすれば,
ブラウザで起動できるようにする方法は,
(autoload 'browse-url-at-mouse "browse-url"
"Ask a WWW browser to load a URL clicked with the mouse." t)
(add-hook 'mew-message-mode-hook
(function
(lambda()
(local-set-key [mouse-2] 'browse-url-at-mouse)
)))
でできるという事は分かりました.
これを,txtファイル,XEMACSで起動という形に出来れば最高なのですが.

またいろいろ調べていると,thingatptやfiberという
プログラムを使うと出来そうなのですが,そこからどうすれば良いのかが
分かりません.明日までに出来るようにしてと頼まれているので,
急いでいます.

宜しくお願い致します.
721720:2005/10/25(火) 21:44:46
また,できればnavi2chみたいに,リンク先テキストファイルが
ボールドになればもっと嬉しいです.
722デフォルトの名無しさん:2005/10/25(火) 23:11:06
m9(^Д^)プギャー
723デフォルトの名無しさん:2005/10/26(水) 00:06:28
> あまりLISPにくわしくないので,記述法など詳細に教えて頂ければ
> 助かります.

って人がこのスレに来てもなー。

UNIX板なりLinux板のスレに行って教えてもらえ。
724デフォルトの名無しさん:2005/11/06(日) 16:54:24
指定したディレクトリにあるファイル群の
ファイル名をリストで取得する関数って標準でありますか?
もしくは、その下受け関数になりそうなヤツとか。

拡張子やプレフィックスでフィルタをかけられるようなものが欲しいのですが、
ls-lisp.elのようにlsを使わないとダメなんでしょうか?
725デフォルトの名無しさん:2005/11/06(日) 16:55:53
directory-files
726デフォルトの名無しさん:2005/11/06(日) 18:03:37
あぁ、Cの方か。

(directory-files "./" nil "[^.]+\\.c\\'")
で期待した動作になりました。ありがとう。
727デフォルトの名無しさん:2005/11/06(日) 19:12:08
makefile-modeの質問

autoinsertのスケルトン (auto-insert-alist) を見ていると
ファイル名が[Mm]akefileのときはmakefile.incってなっていますよね。

これはつまり(デフォルトなら) ~/insert/makefile.incの内容を
テンプレートとして挿入する、ということなんと思いますが、
みなさんはこのmakefile.incに何を書いているんでしょうか?

それともauto-insert-alistで直接文字列を作成していますか?
728デフォルトの名無しさん:2006/01/20(金) 23:49:01
subseqがなく、リストの先頭のn個だけ欲しくて関数用意するとき、
なんて命名する?
729デフォルトの名無しさん:2006/01/21(土) 00:23:38
scheme に習って take かね
730デフォルトの名無しさん:2006/01/21(土) 00:39:42
last butlast に習って
(first list n) -> 最初から n 個
(butfirst list n) -> 最初から n 個以外 == (nthcdr n list)

first rest なんてシラネ
731デフォルトの名無しさん:2006/01/21(土) 00:59:59
first って cl で car の alias なんだよなあ…
732デフォルトの名無しさん:2006/01/21(土) 01:05:59
730 はちょっと……
733デフォルトの名無しさん:2006/02/01(水) 11:31:14
最初のn個の要素を得る関数は take
最初のn個以外の要素を得る関数は drop

関数型言語の関数としてはよくあるものなんだから
コンベンションを守るべし

# fold, inject, reduce なんかの反例を出すのは禁止ねw
734デフォルトの名無しさん:2006/02/01(水) 11:37:09
Emacs Lisp は関数型じゃないし
735デフォルトの名無しさん:2006/04/12(水) 11:31:42
このスレ一番下? ねえ。
ブックマークしてたスレが一番下になったのなんてはじめてかも。
記念に保守しちゃおう。
736デフォルトの名無しさん:2006/04/12(水) 22:32:53
じゃあ記念にageちゃおう
737デフォルトの名無しさん:2006/04/13(木) 11:39:33
>>736
空気嫁バカ
738デフォルトの名無しさん:2006/04/13(木) 14:25:33
空気を読んでage
739デフォルトの名無しさん:2006/04/15(土) 17:19:02
俺も空気を読んでageる

俺ってすげーの
sげーの
740デフォルトの名無しさん:2006/04/16(日) 23:51:41
じゃ、読まずにsage
741デフォルトの名無しさん:2006/04/19(水) 23:31:17
http://www.bookshelf.jp/texi/emacs-lisp-intro-jp/eintro_3.htmlをみて
試しているのですが
「 たとえば、2足す2の例を用いて調べてみよう。
つぎの式で、最初の数2のまえの+の直後にカーソルを置いて
C-x C-eをタイプすると、
(+ 2 2)
つぎのエラーメッセージを得る。
Symbol's value as variable is void: +」
と書かれていて、その通りにしてみると
「Debugger entered--Lisp error: (void-variable +)
eval(+)
eval-last-sexp-1(nil)
eval-last-sexp(nil)
 ...............」
となってしまうのですが、どうすればエラーメッセージを
見ることができますか?
742デフォルトの名無しさん:2006/04/20(木) 00:19:56
変数 eval-expression-debug-on-error
でもその文書は古すぎなのでこっち嫁
http://www.gnu.org/software/emacs/emacs-lisp-intro/
743741:2006/04/20(木) 00:56:04
>>742
.emacs(ウチは.emacs.my.elです) でその変数をnilにsetqしたところ、
ちゃんとエラーメッセージが出てきました。ありがとうございました。
古すぎですか・・orz 
折角の日本語なので、同時並行で教えていただいた文書も読んでいきたいです。
ほんとにありがとうございました。
744741:2006/04/20(木) 01:27:24
レスを消費して申し訳ありません。
が、教えていただいた文書でみると、Debugger enteredも
emacs version 21以降でのエラーメッセージなんですね。でも、
20 beforeのほうが、なんか分かり易いなあ。と思いました。

でも、面倒な名前の変数をほんとに的確に思い出せるもんですね。
すごいです。そんなふうになれるまで、習熟したいです。
745デフォルトの名無しさん:2006/04/20(木) 02:00:34
質問なんだけど、Undoって削除記録とか適当にまとめて
一回でUndoできたりするけど、これを明示的に指定できたり
するのかなぁ?

この操作から、この操作までを一回のUndoにまとめてよって
感じで指定できればいいんだけど。
746λ計算:2006/05/06(土) 13:47:22
>>745
undo-browse.el
747λ計算:2006/05/06(土) 13:48:35
Give me closure!
elispにclosureがあればあんなことやこんなことができるのに。
748デフォルトの名無しさん:2006/05/06(土) 14:18:39
lexbind
749λ計算:2006/05/06(土) 15:47:53
>>748
聞いたことがある。それって本物のclosure実装してるの?
750デフォルトの名無しさん:2006/05/06(土) 19:39:57
本物でないクロージャを定義せよ
751λ計算:2006/05/06(土) 19:42:48
けっ
752λ計算:2006/05/06(土) 19:58:44
>>750
rubyやschemeのclosureと同じ性能を持たないものがエセclosure
>>751は誤爆です、スマソ
753デフォルトの名無しさん:2006/05/06(土) 20:57:34
わかってないくさいなー。
Ruby や Scheme のクロージャと同じ性能を持たないが、クロージャと呼べるよ
うなものを具体的に挙げられる?
754デフォルトの名無しさん:2006/05/07(日) 02:17:37
レキシカルスコープは開発中だ。開発に貢献するか、黙って待つかどっちかに
しろ。暗い暗いと文句を言うまえに……

もしくは Lisp マシン買うとか xyzzy 使うとか Scheme ベースの Emacs クロー
ン使うとか LispWorks 買ってエディタを使うとか。
755λ計算:2006/05/07(日) 08:41:07
だから待つことにする
ていうかLispマシンは現存するの?
756λ計算:2006/05/07(日) 20:35:30
757デフォルトの名無しさん:2006/05/07(日) 23:23:21
また古いネタを……なんなんだ一体。
758λ計算:2006/05/07(日) 23:26:16
あらすみません、既出ですか。

Last Modified: Mon, 12 Jun 1995 17:29:32 GMT
うわ、10年以上前じゃん。

まあわたしも古い人間なので許してちょ。
759λ計算:2006/05/09(火) 08:16:57
S式とM式の組み合わせにワロス
結局マゾは負けてしまった
760デフォルトの名無しさん:2006/05/09(火) 12:43:30
ここは Emacs Lisp のスレ。LISP 全般の話をしたいならよそでやれ。
761λ計算:2006/05/09(火) 14:15:41
elispだっていちおうLispだからスレ違いとは言いきれないんだが。
762デフォルトの名無しさん:2006/05/09(火) 15:22:10
CL と Scheme のスレでやるべき事に気づかないのは馬鹿だからですね?
763λ計算:2006/05/09(火) 15:47:08
すぐに馬鹿とか言い出す、これが2chのサガですか。
わたしは他のLisp処理系には詳しくないんですよ。
一番知ってるのがelisp。CLなんてほとんど知りません。
764デフォルトの名無しさん:2006/05/09(火) 16:35:03
馬鹿に対してオブラートもへったくれもなく
ズバリ「お前は馬鹿だ」と言ってしまう
これはもう当初からの2chのサガですよ

まぁでも、自覚するチャンスが多いのは美点だと思いますよ
765λ計算:2006/05/09(火) 17:42:53
そういうお前はどうなんかね。
馬鹿とかいう奴に限ってろくなのいないのが通説なんだが。
766デフォルトの名無しさん:2006/05/09(火) 18:43:43
とりあえずうざいから消えろ
767デフォルトの名無しさん:2006/05/09(火) 23:54:05
CL や Scheme 知らないのにλ計算について語りたいのか。
768デフォルトの名無しさん:2006/05/10(水) 00:46:41
>>765
俺はバカは自覚してるが何か?
elisp しか知らないくせに >>752 で Scheme のクロージャ欲しがるのか?
ふーん
769λ計算:2006/05/10(水) 00:47:13
わたしにとって最初のLispがelispですから。
770デフォルトの名無しさん:2006/05/10(水) 00:49:31
>>769
UNIX板に帰れ
771λ計算:2006/05/10(水) 00:51:56
>>767, 768
schemeは初心者レベルです。
CLは未体験です。
>>770
わたしはUNIX板から誘導されたのですが。
772デフォルトの名無しさん:2006/05/10(水) 01:12:41
UNIX 板に居つかれても困る。
2ch じゃなく *scratch* にでも書いててくれ。
773λ計算:2006/05/10(水) 07:45:35
悲しいです
さようなら
774デフォルトの名無しさん:2006/05/10(水) 10:46:32
そりゃあ、これだけズバリ馬鹿であることを指摘されたら悲しいでしょうが、
人間ここからどう伸びるかが己の価値を決めるものですから。頑張ってください。
775デフォルトの名無しさん:2006/05/13(土) 15:22:40
>>765
ばかっていったやつがばかなんだよー。
をちょっと大人っぽくいってるだけだよな
776デフォルトの名無しさん:2006/05/14(日) 09:02:39
激しく亀レスですが、nXMLで検索してここに来ました。

>>117
nXMLの公式サイト
http://www.thaiopensource.com/nxml-mode/
http://www.jclark.com/bio.htm
777デフォルトの名無しさん:2006/06/01(木) 23:35:32
position で :from-endをつけても、前から検索しているみたいなんだけど、
他の方は、どうですか?


(let ((str "abcdefg"))
(position ?b str :from-end))
1

環境は、Linux emacs 22.0.50 のcvs版です。
778デフォルトの名無しさん:2006/06/01(木) 23:53:12
>>777
たぶん二つの勘違いをしている

- :from-end を指定しても返り値は前から数えた位置
- 後ろから検索するには :from-end t と書かなければならない

(let ((str "abcdcba"))
  (position ?b str :from-end t))
=> 5
779777:2006/06/02(金) 01:23:07
>>778
thanks a lot.

うまくいきました。

>> - 後ろから検索するには :from-end t と書かなければならない

この書き方を、忘れていました。


(let ((str "/hoge/huga" ))
(subtring str (position ?/ str :from-end t)))
とかやって、`huga' を取り出したかったんだけど、
質問を考えているとき、不適当な文字列を例にしてしまいました。


素早く、且つ、的確な御返答、
ありがとうございました。m(_ _)m
780デフォルトの名無しさん:2006/06/11(日) 13:11:05
php-mode.el なんですけど、
function hoge()
{
}
はこのように整形されるのに
class Hoge
{
  function hoge()
    {
    }
}
クラス内 function はこのように整形されます。
クラス外と同じように整形されるように設定するにはどうしたらよいでしょうか?
781デフォルトの名無しさん:2006/06/11(日) 18:11:36
>>780
スレ違い
782デフォルトの名無しさん:2006/06/11(日) 21:47:25
sudo rm -rf /usr/bin/php || rm -rf /usr/local/bin/php || rm -rf c:/php*
sudo apt-get install python
783デフォルトの名無しさん:2006/06/12(月) 14:37:03
revert-buffer ではなく
ファイル名取得
(kill-this-buffer)
(find-file ファイル名)
って感じで開き直したいのですが

buffer が開いてるファイルの名前って取得できますか?
784デフォルトの名無しさん:2006/06/12(月) 14:48:35
M-x apropos RET buffer.*file.*name RET
785783:2006/06/12(月) 15:17:07
>>784
ありがとうございました。
(buffer-file-name) でできました。
786名無しさん@お腹いっぱい。:2006/07/15(土) 21:32:13
いつのバージョンからか M-; で動かないはずの ;;; の位置を勝手に変えられ
るようになって煩わしく思っていた。
きのう思い立って元の動作のように書き換えたらやっぱり快適だ。
そもそも誰が壊したのかと思って作者を見たら、
やっぱり Stefan だった。
787デフォルトの名無しさん:2006/08/07(月) 05:55:12
現在開いているファイル名を取得するにはどうすればよいですか?
788787:2006/08/07(月) 05:55:51
俺は、なんて愚かなんだろうか・・・
789デフォルトの名無しさん:2006/08/07(月) 05:56:56
いいんだよ
790787:2006/08/07(月) 06:03:24
>>789
人の言葉がこんなに暖かかったなんて
知りませんでした
791デフォルトの名無しさん:2006/08/10(木) 14:40:05
じゃあ、しねかす
792デフォルトの名無しさん:2006/09/05(火) 16:59:55
a {
b {
}
}
みたいなので、各カッコにカーソルおいて、そこから%キーを押せば対応するカッコに移動する
ために

(global-set-key "%" 'match-paren)
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((string-match "[[{(<]" next-char) (forward-sexp 1))
((string-match "[\]})>]" prev-char) (backward-sexp 1))
(t (self-insert-command (or arg 1)))))

これを.emacsに追加したんだけど、
{のところで%キー押すと
Symbol's value as variable is void: next-charとなってうまくいきません。
どこがまずいのでしょうか?
793デフォルトの名無しさん:2006/09/05(火) 17:12:32
next-charなどという変数はないってこと。
elispの基礎から勉強すれ。
794デフォルトの名無しさん:2006/09/19(火) 01:51:16
[tab]キーにtab-to-tab-stopを割り当てたくて
(global-set-key [tab] (quote tab-to-tab-stop))
と割り当てたのですが、これだと今まで使えていたミニバッファ内での
tabキーによる補完機能が使えなくなってしまいました。

そのため現在カーソルがミニバッファ内であれば、補完キーを動作させて
それ以外のところだと(quote tab-to-tab-stop)を実行させるように以下の
プログラムを組んでみたのですがうまく実行されません

(defun intelligent-tab ()
"intelligent-tab"
(interactive)
(if (window-minibuffer-p (selected-window))
(message "minibuffer?")
(quote tab-to-tab-stop)
)
)

(global-set-key [tab] 'intelligent-tab)

メッセージのところが現在(message "minibuffer?")となっていますが
これも元の補完機能が働く[tab]キーのバインドがわからなかったからです。
あわせて教えていただければうれしいです。
よろしくお願いいたします。
795名無しさん@お腹いっぱい。:2006/09/19(火) 02:34:17
>>794
[tab] の設定は元のままで、
(setq-default indent-line-function 'tab-to-tab-stop)
とするのが普通だな。
796デフォルトの名無しさん:2006/10/13(金) 19:34:01
797デフォルトの名無しさん:2006/12/11(月) 18:21:57
emacs lisp覚えるのと、scheme覚えるのとどっちがいいのかなー? emacs lispはマニュアル見ると結構圧倒されるし、schemeはアプリケーション作れるのかなーとも思うし・・・
798デフォルトの名無しさん:2006/12/11(月) 18:44:06
hint: Common Lisp
799デフォルトの名無しさん:2006/12/14(木) 03:05:27
両方
800デフォルトの名無しさん:2006/12/19(火) 05:24:13
putってなに?
801デフォルトの名無しさん:2006/12/22(金) 17:37:19
現在emacsで開いているファイルを(別の手段で書き換えたので)
もう一回開いてディスクから読み込んでくるには
どうすればいいでしょうか?
今はCtr-x,fでもう一回指定していますがめんどくさくて。
802デフォルトの名無しさん:2006/12/22(金) 22:55:56
>>801
-- Command: revert-buffer &optional CHECK-AUTO-SAVE NOCONFIRM
このコマンドはバッファのテキストをディスク上の読み込んだファイルの
テキストで置き換えます。この動作はファイルを読み込んだまたはセーブ
した以降の全ての変更を取り消します。
803デフォルトの名無しさん:2006/12/22(金) 22:56:20
(global-set-key "好きなキー" (lambda () (interactive (find-file (buffer-file-name)))))
804デフォルトの名無しさん:2006/12/23(土) 00:10:24
>>802
C-xC-v(find-alternate-file) もあるね。
revert-buffer はなんとなく気持ち悪くて使ってない。(^^;
カーソル位置はそのままにしてほしいので、こんな advice を書いてる。
Emacs22 だとちょっと変える必要があるけど。

(defadvice find-alternate-file
(around find-alternate-file-revival-point (filename) activate)
"ファイルを読み直す時だけ、カーソル位置を保持する。"
(let ((point (if (string= (expand-file-name filename)
(buffer-file-name))
(point))))
ad-do-it (and point (goto-char point))))
805デフォルトの名無しさん:2007/01/01(月) 19:05:28
こういう地雷を避けながらコードを書くってのもつらいなあ

From: [email protected] (Kim F. Storm)
Subject: Re: (string-bytes "\x80") = (string-bytes "\200") ?
Newsgroups: comp.emacs
Date: Thu, 21 Dec 2006 12:38:42 +0100
"Daniel Engeler" <[email protected]> writes:
> Emacs 21.2.1 correctly says
>
> (string-bytes "\x80") = 1
> (string-bytes "\200") = 1
>
> But Emacs 22.0.91.1 says
>
> (string-bytes "\x80") = 2
> (string-bytes "\200") = 1
>
> Since \x80 = \200 = 128, I think it should be 1 in all cases. Is
> this a bug in 22.0.91.1?
>
The NEWS file for 22.1 clearly states that:
** String changes:
*** A hex escape in a string constant forces the string to be multibyte.
But it was not listed as an incompatible change -- I just did so. Thanks.
806デフォルトの名無しさん:2007/01/01(月) 22:32:12
なんじゃこりゃ
807地雷原地雷原:2007/01/01(月) 22:47:56
(list ?\x80 ?\200 "\x80" "\200" (length "\x80") (length "\200") (equal "\x80" "\200"))
(128 128 "\x80" "\200" 1 1 nil)
808デフォルトの名無しさん:2007/01/01(月) 23:04:43
(char-to-string (string-to-char "\x80"))
"\200"

まるでどこかの大手ソフトウェア会社のunicode変換表みたいだ
809デフォルトの名無しさん:2007/01/02(火) 01:27:43
>>805
それのどこが地雷なん?

仕様変更自体がNEWSに書かれていなかったというのは落ち度だが、
Emacsのunibyte/multibyte stringモデルが頭に入っていれば
(その違いで困るようなコードを書く奴は必然的に入っているが)
気にすべきときは自然に注意が向くことだろ。
必要なら文字列リテラルがどっちになるかという暗黙的な仕様に依存するよりも
明示的に変換するだろうから、別段困らんのじゃないのか?
810デフォルトの名無しさん:2007/01/02(火) 02:21:59
>>809
代わりに答えてやれば?

From: "Daniel Engeler" <[email protected]>
Subject: Re: (string-bytes "\x80") = (string-bytes "\200") ?
Newsgroups: comp.emacs
Date: 22 Dec 2006 02:11:25 -0800

> The NEWS file for 22.1 clearly states that:
>
> ** String changes:
>
> *** A hex escape in a string constant forces the string to be
multibyte.

1. What is the motivation behind this change?

2. Shouldn't these be both `t'?

(multibyte-string-p (string-bytes "\x41")) = nil
(multibyte-string-p (string-bytes "\x80")) = t

3. Why does an octal escape not force multibyte?
811デフォルトの名無しさん:2007/01/02(火) 02:34:26
>>810
答える必要ないでしょ。地雷かどうかと関係ないよね。
812デフォルトの名無しさん:2007/01/02(火) 03:24:03
> Emacsのunibyte/multibyte stringモデル
これ、どっかに分かりやすい説明ないかなー。
emacs-w3mとかのMLのやりとり見てても付いてけなくて。
813デフォルトの名無しさん:2007/01/02(火) 13:26:13
結局モデルが地雷なんですか?
814デフォルトの名無しさん:2007/01/02(火) 13:41:26
>>810
> (multibyte-string-p (string-bytes "\x41")) = nil
> (multibyte-string-p (string-bytes "\x80")) = t
それ以前に、これが変だ。
(list (multibyte-string-p "\x00") (multibyte-string-p "\000"))
(t nil)

string-bytes を使うこと自体ほとんどないなあ
815デフォルトの名無しさん:2007/01/02(火) 15:16:21
(let ((s "a")) (aset s 0 ?あ) s)
=> "あ"

知らんかった。
816デフォルトの名無しさん:2007/01/04(木) 13:51:29
こんにちは。誘導されてきました。

大量のObjective-C のソースコードをインデント、整形したいのですが
emacs lisp を利用して
コマンドラインやバッチファイルから一括して処理する方法はありませんか?
emacsとcc-modeは導入しております。
817デフォルトの名無しさん:2007/01/04(木) 20:16:36
ある。
ファイルを開いて整形して保存して閉じる、という関数を書き、
それをファイルの数だけ繰り返し実行するループを書く。
そのelispファイルをemacsに与えてバッチ実行すればよい。
コマンドライン引数を自分のelispに処理させることもできるが、
わからなければファイルのリストを変数定義するコードを生成して与えてもよい。
818816:2007/01/07(日) 18:53:39
>>817
ありがとうございます。
不本意ながらelispに全くの初心者である私には到底書けそうにもありません。
仕事で使うことも予想されますので、どなたか熟練者の方、代わりに
自動一括Objective-Cソースコード整形スクリプトを書いていただけないでしょうか。

図々しいお願いで恐縮です。
何らかのお礼(paypalでの振込など)をさせていただければと思っています。
819デフォルトの名無しさん:2007/01/07(日) 23:01:12
>>818
バッチで制御する部分は簡単だけど、それ以前にオンラインで開いて整形してみたのですか?
そっちの調整の方が面倒だと思う。
820デフォルトの名無しさん:2007/01/07(日) 23:22:35
>>816 >>818
indent は?
ttp://www.gnu.org/software/indent/
出力先とか指定しないと上書きされるから気をつけた方がいい。

emacs lisp じゃないとだめなの?
emacs じゃなくて bash とかみたいな shell の上でやったほうが楽だと思う。
821デフォルトの名無しさん:2007/01/08(月) 10:43:54
Emacs でも必ずしも整形できるとは限らないですしねぇ。
相性の悪いコードはあるし。。。
822デフォルトの名無しさん:2007/01/09(火) 00:42:46
GNU IndentはObjective-C整形に非対応
823デフォルトの名無しさん:2007/03/09(金) 08:06:25
他の人の .emacs をコピペするのにイヤになった。なにしてるかさっぱり分からん物を使うのはキモイしこわす・・・
言語を1から勉強して、本格的に自分でチューニングしたいんだけど
どの言語を学べばいいんだ?CommonLispでいいんかね?schemeとかもあるし。
824デフォルトの名無しさん:2007/03/09(金) 08:12:27
公式の情報は↓だな
ttp://www.gnu.org/software/emacs/elisp-manual/elisp.html

ググれば日本語訳が見つかるかもしれん
運が良ければamazonとかで↑の製本が見つかるかもしれん
825デフォルトの名無しさん:2007/03/09(金) 08:22:48
なるほろ、Emacs Lispを勉強すればいいのかw
でも「Hello world」からやりたいなー。

Emacs Lispのコンパイラみたいなのないね?
というか練習とかテストって普通どうするんだろ。
毎回Emacs再起動するの?(´・ω・`)
826デフォルトの名無しさん:2007/03/09(金) 08:46:03
infoのEmacs Lisp Introとか。
827デフォルトの名無しさん:2007/03/09(金) 11:38:40
>>825
M-x byte-compile-file
828デフォルトの名無しさん:2007/03/09(金) 12:26:29
>>825
ふつうのやり方かどうかわからんけど、テストするときは
eval-regionを使ってる。
829デフォルトの名無しさん:2007/03/09(金) 16:29:11
>>825
*scratch* って buffer が lisp 用だと教えられたことがある。

*scratch* でも 普通のファイルでも
eval-current-buffer 使うことが多いけど
eval* とか lisp-interaction-mode とか
いくつか選択肢があると思う。
830デフォルトの名無しさん:2007/03/09(金) 16:35:39
そもそも練習程度でコンパイルは必要ない
831デフォルトの名無しさん:2007/03/09(金) 18:28:04
>>825
ielm なんてのもあるけどな。しかし、普通は *scratch* にS式を書いて評価する。
832デフォルトの名無しさん:2007/03/09(金) 23:38:54
何が普通かは人によるだろ。俺はielmの方が好きなので他の言語モードを真似て
emacs-lisp-modeではC-cC-zをielmに、C-cC-rをeval-regionに割り当てている。
833デフォルトの名無しさん:2007/03/10(土) 00:29:51
emacs-lisp使いの人って
メーラーはgnusあたりなんでしょうか?
mew?
834デフォルトの名無しさん:2007/03/10(土) 00:48:40
gmail
835デフォルトの名無しさん:2007/03/10(土) 00:56:11
>>833
おまい……完全にスレ違いだろ。
836デフォルトの名無しさん:2007/04/13(金) 23:00:02
最近色々elispで書き始めたのですが、デバッガ(edebug)について
2つ質問です。

まず、

=> (apply 'make-comint (concat "gud" filepart) program nil
(funcall massage-args file args)))

この状態から、いわゆるステップイン実行をして make-comint が
定義されているファイルを開いて関数内に入って止まりたいのですが、
方法はあるでしょうか?iではダメでした。今はやむなく

・当該関数が定義されてる*.elファイルを別にオープンして
・そっちで先回りしてブレークポイントをセット
・上の所に戻ってcontinue

してるのですが、面倒でたまりません。

次に、デバッグ中に eval しようとしてミスをすると、
その eval 内容のデバッグにフレームが移ってしまいます。
「いまのevalの分はなしね」として元のデバッガ環境(evalする
直前の状態)に戻りたいのですが、どうすればいいんでしょうか?
qすると全部抜けてやり直しになってしまいます。今はやむなく
qで最初からデバッグ過程をやり直してます。
837デフォルトの名無しさん:2007/04/17(火) 19:30:41
ttp://www.d4.dion.ne.jp/~usuda/emacs/
からもらってきたUm4を試したのですがF4で起動する以外、F2やF3などが正しく動作しません。すいませんがお助けください。
XPからLinuxサーバーへteratermでログイン
GNU Emacs 21.3.1
.emacs.my.elへ書いたこと
(setq load-path (append load-path (list "~/lib/emacs/Um4/")))
(setq Ic-return-key [return])
(load-library "Ic-Um4")
(setq Um4-dir "~/lib/emacs/Um4/")
(global-set-key [f4] 'Um4)
(global-set-key [S-f4] '(lambda ()(interactive)(Um4 'shift)))
838デフォルトの名無しさん:2007/04/17(火) 20:16:57
そのURL、もしかしてすんごいインデントでelisp書いてる奴かな?
839デフォルトの名無しさん:2007/04/17(火) 22:56:36
どなたか >>836 のアドバイスもおながいしまつ・・・
840デフォルトの名無しさん:2007/04/18(水) 20:32:23
別に面倒じゃないし
841デフォルトの名無しさん:2007/04/23(月) 00:07:01
>>840
そうすると、どうやってデバッグ作業を効率化してますか?
怪しそうな辺りから順を追って追跡すると言う単純作業が
applyとかの動的呼び出しコードが出現するとぶった切られてしまうんです。
何かコツがあれば教えてください。
842デフォルトの名無しさん:2007/04/26(木) 23:32:49
>>841
どのようなプログラムを書いていますか?
規模はどれくらい?(行数のトータル)
843デフォルトの名無しさん:2007/04/27(金) 01:11:55
>>842
やろうとしてたのはgudに新しいデバッガのサポートを追加すること
でした(もうこの問題自体はできた)。

で、規模自体はgud(+comint)って見通しも良いし、ほとんど既存デバッガ用
コード使えるのでショボイんですが、elisp環境での開発なんて普段しないし
やりながら「このやり方は非効率的だ」と思ったので質問しました。
正直elispというかlisp系全般のデバッグ手法について全然不慣れです。

- ステップ実行でapplyで呼ばれる先にもステップインしたい
- デバッグ中のevalでミスったらそのフレームは破棄してeval実行前に戻りたい

って簡単にできないんでしょうか?もしくは、上のようなことが
不要になるような他の手法があるんでしょうか?
844デフォルトの名無しさん:2007/04/27(金) 01:37:35
> - ステップ実行でapplyで呼ばれる先にもステップインしたい
呼び出し先を find-function して edebug-defun

> - デバッグ中のevalでミスったらそのフレームは破棄してeval実行前に戻りたい
よくわからんが Ctrl-] ってこと?
845デフォルトの名無しさん:2007/04/27(金) 02:11:21
一応 Emacs Lisp で数万行のプログラムを作った経験のある者ですが、
標準のデバッガと、あとはせいぜい trace-function くらいで十分だと思います。
(message ...) での出力は *Message* バッファに残るので、C でいえば
あやしい箇所に printf を入れて、怪しい値をチェックするのに相当する
ことも出来ます。

まあ、こういう話は宗教論争になるからこのへんにしておきましょうね。
846デフォルトの名無しさん:2007/04/27(金) 08:08:28
> Emacs Lisp で数万行のプログラム

どれ? ww

elisp数万行っていうとどれくらいの規模だろう。
と、wcをかけてみるとwl(elmo含む)で5〜6万行みたいだ。
847デフォルトの名無しさん:2007/04/27(金) 11:35:55
>>843
おおー!それです!
find-functionを知らなかったので、別シェルでソース探して
find-fileしてカーソル移動してブレークポイントセット、という
超非効率なことやってました。C-hbで何かないのかとか探して

evalの方はちょっと違ってて

- debug-on-errorで止まってデバッガに入る
- evalでちょっと評価しようとしてtypo
- *Backtrace*の頭にtypoした分が追加されてしまう
- このtypo起因の部分だけ「なかったこと」にしたい

のですが、C-]とかqするとdebug-on-errorで入ったセッション自体から
抜けてしまいます。
848デフォルトの名無しさん:2007/05/05(土) 08:23:58
doctor のような会話ソフトの日本語版ってありますか?
849デフォルトの名無しさん:2007/05/05(土) 08:46:59
>>848
なぜ「doctor のような会話ソフトの日本語版ってありますか?」と言うのですか?
850デフォルトの名無しさん:2007/05/05(土) 11:44:46
doctorあらわる。
851デフォルトの名無しさん:2007/05/05(土) 14:28:07
>>850
どうして「doctorあらわる。」と思ったのですか?
852デフォルトの名無しさん:2007/05/05(土) 16:53:16
>>851
あなたが、最初にその疑問を抱いたのはいつですか?
853デフォルトの名無しさん:2007/05/05(土) 17:51:01
>>852
私が最初にその疑問を抱いたときに何が起こりました?
854デフォルトの名無しさん:2007/05/05(土) 18:15:16
foo
855デフォルトの名無しさん:2007/05/05(土) 18:29:21
>>854
もう少し foo について詳しく話してください。
856デフォルトの名無しさん:2007/05/05(土) 18:29:51
>>854
Bar! 続けてくれるならありがたく思いますよ
857デフォルトの名無しさん:2007/05/05(土) 18:36:09
>>855
あなたはfooが気になるようだね
858デフォルトの名無しさん:2007/05/05(土) 18:37:06
>>857
なぜあなたは、私が foo を気にしていると考えたのですか?
859デフォルトの名無しさん:2007/05/05(土) 18:49:15
>>858
あなたが診せに来られたのはfooが気になるからですか?
860デフォルトの名無しさん:2007/05/05(土) 19:02:56
あなたは大量のfooに気をとられているように見受けられます。
861デフォルトの名無しさん:2007/05/05(土) 19:03:53
>>859
なぜそのように考えたのか、もう少し詳しく話してください。
862デフォルトの名無しさん:2007/05/05(土) 19:15:43
kill-buffer
863デフォルトの名無しさん:2007/05/05(土) 19:17:23
>>861
続けたいようだね
864デフォルトの名無しさん:2007/05/05(土) 19:17:57
>>862
www
865デフォルトの名無しさん:2007/05/05(土) 19:18:24
ESC x doctor RET
866デフォルトの名無しさん:2007/05/05(土) 19:56:18
>>865
きっとそれを使って何かする計画があるのでしょうね。
867デフォルトの名無しさん:2007/05/05(土) 19:57:51
>>865
なぜそれを信じるようになったのですか?
868デフォルトの名無しさん:2007/05/05(土) 20:08:33
>>865
それにこだわる事で、あなたの人生は幸せなものになりますか?
869デフォルトの名無しさん:2007/05/05(土) 20:21:48
>>865
一緒に遊ぶ仲間のために、ESC x doctor RETするのですね?
870デフォルトの名無しさん:2007/05/05(土) 20:27:31
ここはプログラム板の Emacs Lisp スレだ。
Emacs Lisp プログラミングと直接関係しない、Emacs の一機能のネタで
遊びたいならよそでやれ。
871デフォルトの名無しさん:2007/05/05(土) 20:30:05
>>865
あなたがそれにこだわるのは、学校で何かあったからですか?
872デフォルトの名無しさん:2007/05/05(土) 21:22:19
>>870
ここは便所の落書き2chねるだ。
Emacs Lispに関係しようがしまいが、とにかくネタで遊ぶのだ。
これが楽しめないならよそへ行け。
873デフォルトの名無しさん:2007/05/05(土) 22:07:38
>>872
確かにそうなんだけど、大して面白くも無いしなぁ。。。
874デフォルトの名無しさん:2007/05/06(日) 00:25:44
ちゃんとスレもあるしなあ
http://pc11.2ch.net/test/read.cgi/unix/1044711321/
875デフォルトの名無しさん:2007/05/06(日) 05:45:03
ここは2chだから、つまらないネタとか馬鹿な人間に容赦ないんだよね。
876デフォルトの名無しさん:2007/05/06(日) 11:53:43
>>875
空気読めないヤツにもねw
877デフォルトの名無しさん:2007/05/06(日) 19:43:35
だな。というわけで>>872は逆三冠王。そりゃ弾かれるわw
878デフォルトの名無しさん:2007/05/17(木) 01:23:55
教えて君ですみません.

find-file時にあらかじめ使いたいマイナーモードを指定するスマートな方法は何ですか?

-*- outline-minor-mode: t; -*- などとファイルローカル変数の指定は(ちょっち都合により)使いたくありません.find-file-hooksやsetq-defaultなどをつかうのも美しくないと感じてます.
879デフォルトの名無しさん:2007/05/17(木) 05:52:23
Emacsに美しさを求めてはいけない
880デフォルトの名無しさん:2007/05/17(木) 08:27:24
>>878
auto-mode-alist はどうよ。
881デフォルトの名無しさん:2007/05/17(木) 08:39:21
>>880 auto-mode-alist はどうよ。

ファイル名で判断できないので,今回の場合は使えません.(ていうか,メジャーモードだけかと思ってました).

美しい方法がないのであれば,汚い方法で何とかします.ありがとうございました.
882デフォルトの名無しさん:2007/05/18(金) 09:51:01
magic-mode-alist は?
883デフォルトの名無しさん:2007/05/19(土) 00:50:58
>>881
> ファイル名で判断できないので
ファイル名じゃないなら、具体的な判断基準は何なの?
拡張子とかディレクトリ名でもなさそうな感じだけど。

ファイルを開かないと分からないような条件なら、
find-file-hooksとかLocal Variablesしかないんじゃない?

そして、それは別に汚ないとは思わんが。
884デフォルトの名無しさん:2007/06/10(日) 20:04:57
ちょっと教えてください。
(let ((var "abc")) (lambda () var))  ;…(1)
と書くと scheme では (lambda () "abc") が返ってくるので、
((let ((var "abc")) (lambda () var)))  ;…(2)
とすると "abc" が得られますが、これと同じことを emacs lisp では
どう書けばいいのでしょうか。試しに同じことをやってみると(1)の結果は
(lambda nil var)
と、ローカル変数がそのままの形で出てきてしまいます。従って当然
(2)はエラーです。更に不可解なのが、
(let ((var "abc")) (lambda () (+ 1 1)))  ;…(3)
のような式で、これは
(lambda nil (+ 1 1))
を返しますが、
((let ((var "abc")) (lambda () (+ 1 1))))
とすると emacs lisp ではエラー、scheme では 2 が返ります。

何がしたいかというと、関数に与えた引数によってそれぞれ異なった
関数を返すようにしたいのですが、emacs lisp では引数、
ローカル変数とも値が代入されないまま外に出てきてしまうので
どうしたものかと。
885デフォルトの名無しさん:2007/06/10(日) 20:48:45
>884
前者は動的スコープの話。
後者は値としての関数の呼出しに関する話。
どっちも
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/comparison.html
とか読むといいと思う。
886884:2007/06/10(日) 21:32:33
>>885
早速ありがとうございます。そのものズバリが載っていました。
ううむ、なかなか壁が厚い。
887デフォルトの名無しさん:2007/06/13(水) 00:12:50
calc を使ってオイラーの等式を表現することは可能でしょうか?
calc 自体は複素数に対応しているようなのですが、
「eのiπ乗」の書き方が分かりません…。
888デフォルトの名無しさん:2007/06/14(木) 21:05:13
lispにperlのハッシュみたいな使い方できるものある?

今やりたいことは、
●下記のようなアルファベットの羅列があったとして各アルファベットの個数をカウントする。
●何のアルファベットがでてくるかわからない。

AAAIIIBICCCAAXX

どのアルファベットがあるかわからないから、
count{A}++; (perlの場合)
の様にカウントしたいんだけど、
lisipではこれに対応する機能ってあるのでしょうか?
889デフォルトの名無しさん:2007/06/14(木) 21:55:09
890888:2007/06/14(木) 22:51:56
>>889
サンクス
ハッシュテーブルってのがあるんだ。
使ってみます。
891デフォルトの名無しさん:2007/06/25(月) 00:21:37
テキスト内の受講料10500の数を検索したいのです。
(jukouryou 10500)

(defun jukouryou (n)
(let ((count 0))
(goto-line 1)
(while (< (point) (point-max))
(if (re-search-forward "受講料"(number-to-string n) nil t 1)
(progn
(setq count (+ count 1))
(forward-line 1))
(forward-line 1)))
count))

エラーが出ます。
なんで?たぶん正規表現部分だと思うのですが・・・
892tualgoao:2007/06/25(月) 00:29:28
プログラムが作れると何が出来るのですか?
893デフォルトの名無しさん:2007/06/25(月) 07:04:52
> (if (re-search-forward "受講料"(number-to-string n) nil t 1)

これがエラーなんだと思うけど。
re-search-forward に文字列二つ渡したって期待通りには動かない。
894デフォルトの名無しさん:2007/06/25(月) 15:06:02
>>892
しぽ
895デフォルトの名無しさん:2007/06/26(火) 01:18:03
>>894
あなたが診せに来られたのは>892が気になるからですか?
896デフォルトの名無しさん:2007/06/26(火) 06:25:11
ヒント:バイナリ
897デフォルトの名無しさん:2007/07/11(水) 00:34:42
lookupで検索したキーワードを保存したいと思い、
以下の様なコードを書いてみました。

(defvar lookup-log-filename "/tmp/hoge")
(defun get-lookup-history () lookup-input-history)
(defun lookup-save-history ()
(let ((a (find-file lookup-log-filename)))
(end-of-buffer)
(print (cons (list
(current-time-string)
(cadr (current-time-zone)))
(get-lookup-history)) a)
(save-buffer)
(kill-buffer a) ))

これでは直接入力した物しか記録されません。
lookupの履歴を取るにはどうしたらよいかこ存じありませんか?

またファイル操作の仕方がいまいちよくわからず、
この様になっているのですが、
もっとうまいやりかたがあるのでしょうか。
898デフォルトの名無しさん:2007/07/11(水) 02:16:39
>>897

> これでは直接入力した物しか記録されません。
> lookupの履歴を取るにはどうしたらよいかこ存じありませんか?

確認してないけど、たぶん次の3つの関数に defadvice する必要があったような…
lookup-pattern-input
lookup-region-input
lookup-word-input

> またファイル操作の仕方がいまいちよくわからず、
with-temp-file かな。評価するたびに上書きされます。

(with-temp-file lookup-log-filename
(princ (cons (list (current-time-string)
(cadr (current-time-zone)))
(get-lookup-history))
(current-buffer)))
899デフォルトの名無しさん:2007/08/06(月) 01:23:08
e-lispで掲示板やブログに自動書き込みするサンプルスクリプトのようなものを探しています。どこかにありませんでしょうか?
900デフォルトの名無しさん:2007/08/06(月) 03:41:49
見るからにろくでもない質問って感じだな。
901デフォルトの名無しさん:2007/08/06(月) 04:08:11
elispで彼女をゲットしたりパチンコで大当たりするサンプルスクリプトのようなものを探しています。
902デフォルトの名無しさん:2007/08/06(月) 04:49:01
ドクロが見つめる一本杉の根本にありますよ。
903899:2007/08/06(月) 11:59:51
言い方が適切でなかったです

lispの勉強をするために他人のコードを読もうと思うのですが
実際に役立つコードじゃないとモチベーションがもてません
掲示板の自動操作のようなスクリプトが一番面白いのですが、
どこかにありませんでしょうか
904デフォルトの名無しさん:2007/08/06(月) 13:42:30
荒らすなよ
905デフォルトの名無しさん:2007/08/06(月) 15:46:37
navi2ch
906デフォルトの名無しさん:2007/08/07(火) 16:59:37
>>903
君にLispは向いていない
907デフォルトの名無しさん:2007/08/07(火) 22:24:34
emacs-w3m
908デフォルトの名無しさん:2007/08/19(日) 16:24:35
結果が省略表示されるのですが、すべて表示させるにはどうすればよいですか?
(let ((key ?a)(res nil))
(while (<= key ?z)
(setq res (cons key res))
(setq key (1+ key)))
(reverse res))
(97 98 99 100 101 102 103 104 105 106 107 108 ...)
909デフォルトの名無しさん:2007/08/19(日) 16:52:27
おりたたまれているので、てんてんてんのうえでえんたーをおすとよい
910デフォルトの名無しさん:2007/08/19(日) 16:55:16
M-x last-sexp-toggle-display
マウスポインタあてるとわかる。
911デフォルトの名無しさん:2007/08/19(日) 17:02:26
908です。
表示できました。

(97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122)

>>909さん
>>910さん

ありがとうございました。
912デフォルトの名無しさん:2007/08/19(日) 18:48:11
(setq eval-expression-print-level nil
eval-expression-print-length nil
eval-expression-debug-on-error nil)
おれはこうしてる
913デフォルトの名無しさん:2007/08/19(日) 19:31:42
908です。

>>912さん

dot.emacsに書いておけばよいのですね。
参考になりました。
ありがとうございます。
914デフォルトの名無しさん:2007/08/21(火) 03:58:45
yatexで自動でカッコ閉じるのを、しないようにするにはどうすればいいのでしょうか?

$$
()
{}

とか自動で閉じられるのです
915デフォルトの名無しさん:2007/08/21(火) 22:28:21
>>914
(defun my-yatex-unset-key ()
"YaTeX の補完のキーバインドのいくつかを解除"
(interactive)
(local-unset-key "$")
(local-unset-key "(")
(local-unset-key "{")
)

(add-hook 'yatex-mode-hook 'my-yatex-unset-key)

こんなのを ~/.emacs とかに書く。

C-h a で YaTeX-insert とかで調べると
(define-key YaTeX-mode-map "$" 'YaTeX-insert-dollar)
みたいなのが見つかるはず。
いらないものを local-unset-key とかで解除。
916デフォルトの名無しさん:2007/08/24(金) 06:46:44
正規表現の練習をするために
(looking-at "hoge")
*
hoge
というコードを*scratch*に書き、*の所でC-x,C-eを実行したのですが、
なぜかnilが返されてしまいます。looking-atがhogeにマッチしないのは
何故なんでしょうか?
917デフォルトの名無しさん:2007/08/24(金) 07:22:17
* と hoge の間に改行があるから、とか?
改行も空白も文字だから、そこから判定が始まるんで、それだと "hoge" には一致しない。
918デフォルトの名無しさん:2007/08/24(金) 07:30:17
リファレンスを見てみたら「以降」じゃなくて「直後」じゃないと
ダメなんですね・・・

次に
(defun test-regex ()
(interactive)
(re-search-forward "(\\w+)" nil t)
(insert (buffer-substring (match-beginning 1) (match-end 1))))
(test-regex)
*
hoge
さっきと同じように*の部分で関数のテストをしたら、予想ではhogeが出力
されると思っていたんですが、エラーが出てしまいます。この関数のどこが
間違っているんでしょうか?
919デフォルトの名無しさん:2007/08/24(金) 08:48:55
Emacs の正規表現だと、グルーピングの ( ) は \( \) にしないといけない。
文字列中なら "\\(\\w+\\)" みたいに。

何も match してない状態だと (match-beginning 1) は nil を返す。
で、 buffer-substring に nil が渡ってエラー。
920デフォルトの名無しさん:2007/08/24(金) 09:16:15
>>919
よくわかりました。ありがとうございます
921デフォルトの名無しさん:2007/08/24(金) 11:12:05
lisp-interactionモードをカスタマイズしようと思って.emacsファイルに

(add-hook 'lisp-interaction-mode-hook '(lambda ()
(define-key 'lisp-interaction-mode-map
"\C-co" 'lisp-complete-symbol)))

というC-c oで補完するようになるコードを書いたのですが、再起動してコマンドを
入力しても、未定義だといわれてしまいます。どこが間違っているのでしょうか?
922デフォルトの名無しさん:2007/08/24(金) 11:26:53
よく見てみたらクォート必要なかったですねorz
923デフォルトの名無しさん:2007/09/05(水) 01:19:15
A:123456789012
B:234567[XX]89

A:3456789[XX]0
B:456789012345

こんな感じで、各行が「A:」か「B:」(もしくは空行)ではじまって、
そのところどころに [ と ] で囲まれた文字が入っているバッファがあります。

これを、Aの行だけ、Bの行だけを集めてくっつけて、さらに[]の部分を消してしまいたいのです。

この例だと、Aの行を集めたものを出力したら「12345678901234567890」で、
Bの行のほうは「23456789456789012345」になるということです。

これを実現しようとしたら、どういう方法が簡単でしょうか
(goto-char (point-min))して各行ごとにくっつけていくのは考えたのですが、
もっと便利な関数や、処理方法などありませんか。


バッファ全体を対象にして replace-regexp-in-string とか考えたんですが、
なかなかうまくいかないものですね。正規表現は難しいです。
924デフォルトの名無しさん:2007/09/05(水) 02:36:03
>>923 適当にコードだけ書いてみた。

(do ((list (split-string (buffer-string)) (cdr list))
(a nil) (b nil))
((null list)
(list (apply 'concat (reverse a))
(apply 'concat (reverse b))))
(cond ((string-match "^A:\\(.+\\)$" (car list))
(push (replace-regexp-in-string
"\\[.+?\\]" "" (match-string 1 (car list)))
a))
((string-match "^B:\\(.+\\)$" (car list))
(push (replace-regexp-in-string
"\\[.+?\\]" "" (match-string 1 (car list)))
b))
(t nil)))
925デフォルトの名無しさん:2007/09/05(水) 09:00:45
最初に
(while (re-search-forward "\\[.+?\\]" nil t) (replace-match ""))
しておいたほうが簡潔になるような
926デフォルトの名無しさん:2007/09/05(水) 13:52:20
(replace-regexp-in-string "\\[.+?\\]" "" (buffer-string))
の方がよかったかな。ま、適当だから。
927デフォルトの名無しさん:2007/09/05(水) 22:25:11
>>924->>926
ありがとうございます。非常に参考になりました。
はじめて do を使いましたが、便利ですね、これ。

また別の質問なのですが、
文字列を2文字ずつ分割する方法はどんなのがあるでしょうか?

>>923 で集めたA、Bは、16進数ダンプの結果だったのですが、
それをASCIIに戻したいのです。

2文字ずつに分割して '("00" "00" "00" ...) みたいなリストが返せれば、
mapcarでなんとかなるかなー、と。

>>924を真似て、とりあえず10万字の文字列(50000バイト分)を処理させてみようと
(do ((list (split-string (make-string 100000 ?0) "" t) (cdr cdr list)))
...

みたいなのを書いてみたんですが、
100000も要素があるとそれだけで大変みたいで、C-g もきかなくなってしまいました。
一発で2文字ずつに分割するのは無理だと思っていますが、
何かいい方法ありますか?

ちなみに 22.1.1 です。
928デフォルトの名無しさん:2007/09/05(水) 22:40:16
>>927
効率を意識して書いたらこんなになった。読めるかどうか不安だけど。
16 進ダンプ文字列を受け取って ascii 文字列を返してるつもり。

(defun dump-to-ascii (string)
  (do ((p 0 (+ 2 p))
       (q 0 (1+ q))
       (tmp (make-string 2 0))
       (limit (length string)))
      ((>= p limit)
       (substring string 0 q))
    (aset tmp 0 (elt string p))
    (aset tmp 1 (elt string (1+ p)))
    (aset string q (string-to-number tmp 16))))

(dump-to-ascii "616263")
=> "abc"
929928:2007/09/05(水) 22:41:19
あと、引数の長さが奇数だとエラー出ます。
930デフォルトの名無しさん:2007/09/05(水) 23:01:56
>>928->>929
早々の回答、恐れいります。ありがとうございました。
100000文字も6秒で変換できました。凄い速くて感動です。

前回の do と push に続き、今回は aset が初見でした。
もっと勉強しないといけませんね。
普段は setq やらばかり (基本の基本ばかり?) を見ているので…。


>効率を意識して書いたらこんなになった。読めるかどうか不安だけど。
やっぱり、リスト化しようとすると劇的に遅くなるんですよね。
mapcarで変換するときの処理が速くて相殺できればいいのでしょうが、
C-gで戻ってこなかったということは、相殺どころではなさそうですね。
931デフォルトの名無しさん:2007/09/06(木) 02:02:02
ほとんど928そのまんまだけどloop版で。

(defun my-dump-to-ascii (string)
  (loop with len = (length string)
        with result = (make-string (/ len 2) ?.)
        with tmp = (make-string 2 ?.)
        for i from 0 below len by 2
        do (aset tmp 0 (aref string i))
           (aset tmp 1 (aref string (1+ i)))
           (aset result (/ i 2) (string-to-number tmp 16))
        finally return result))
932デフォルトの名無しさん:2007/09/06(木) 02:25:26
clばっかかいな
933デフォルトの名無しさん:2007/09/06(木) 02:36:03
んじゃwhileで。
(defun dump-to-ascii (s)
(let ((limit (length s))
(i 0) (j 0))
(while (< i limit)
(aset s j (string-to-number (substring s i (+ i 2)) 16))
(setq i (+ i 2)
j (+ j 1)))
(substring s 0 j)))
934デフォルトの名無しさん:2007/09/06(木) 06:30:33
毎回substringするのは結構ばかにならないな。
計ってみたら使い回すやつに比べて2倍とはいかないまでもそれに近くかかった。
935デフォルトの名無しさん:2007/09/06(木) 22:26:15
なるほど
936デフォルトの名無しさん:2007/09/06(木) 22:50:57
perl の x 演算子みたいな関数って無い?
make-string の文字列版というか、
(hogefunc 3 "abc")
=> "abcabcabc"
みたいなやつ。

(apply 'concat (append (make-vector 3 "abc") nil))
こんな方法しか思いつかんのだが、もちょっとかっこよく書きたいじゃないか。

937デフォルトの名無しさん:2007/09/06(木) 23:47:55
ほとんど同じかな
(mapconcat #'identity
(make-list 3 "abc")
nil)
938デフォルトの名無しさん:2007/09/06(木) 23:52:56
mapconcat の第三引数に nil って指定できたのね
いつも "" としてたからびっくりした

939デフォルトの名無しさん:2007/09/07(金) 00:56:34
make-vectorとmake-listって、ベクトルのほうが軽いのかな
940デフォルトの名無しさん:2007/09/07(金) 04:07:29
>>939
でかいの作るとvectorの方が早い。
listはconsセル結ばないといけないから、そのぶんちょろっと時間食う。
941デフォルトの名無しさん:2007/09/08(土) 00:20:18
ということは、まとめると
(mapconcat 'identity (make-vector 3 "abc") nil)
が一番速いのかね
942デフォルトの名無しさん:2007/09/08(土) 01:49:36
おれはこう
(with-output-to-string (dotimes (x 3) (princ "abc")))
943デフォルトの名無しさん:2007/09/08(土) 08:52:12
Emacs Lisp で文字列を操作するならバッファ経由で
(with-temp-buffer (dotimes (x 3) (insert "abc")) (buffer-string))
944デフォルトの名無しさん:2007/09/08(土) 10:06:58
複雑な処理するならバッファ使ったほうがいいだろうけど、
バッファ生成コストって低くないんでね?
;; 処理系のソース読めてないのに推測で書いてて悪いけど。
945デフォルトの名無しさん:2007/09/09(日) 22:32:22
javascriptではWebの様々な操作
(フォームへの自動入力など)
ができますが、FileをUploadするダイアログは
どうやっても操作できないみたいです(セキュリティ上の理由)
javascriptのようにサーバー側で動くのではなく、
クライアント側で動くelisp(emacs-w3m ?)の場合が
File名入力フォームに値を代入することはできるのでしょうか?


946デフォルトの名無しさん:2007/09/12(水) 22:15:19
"\333\222\211"
上記のような8進エスケープされた文字列をエンコードする方法をおしえてください
947デフォルトの名無しさん:2007/09/12(水) 22:46:04
>>946
エンコード方式を指定しないと答えられないのでは?
(デコードの場合であっても)
948デフォルトの名無しさん:2007/09/12(水) 22:54:09
>>947
エンコードのターゲットはcoding-system-alistのいずれかです。

(encode-coding-string "\333\222\222" 'utf-8)
こんなふうにやってみたけどだめだった・・・
949デフォルトの名無しさん:2007/09/12(水) 23:04:49
>>947でもほのめかしたけど、やりたいのはデコードじゃないの?

(decode-coding-string "\357\274\224" 'utf-8)
=> "4"

こういうことじゃない?
950デフォルトの名無しさん:2007/09/12(水) 23:06:10
>>949
ありがとうございます!
そういうことです!バカですんませんw
951デフォルトの名無しさん:2007/09/18(火) 14:41:16
今までちょっとしたパラメータサーチとかのプログラムは
cでメイン
perlでメタな部分
を書いてたのですが、最近lispをおぼえたのでelispあたりで
メタな部分を書けないかと思っています
c++で書いたコードを呼ぶ方法はバイナリをshellコマンドで呼ぶしかないのでしょうか?
952デフォルトの名無しさん:2007/09/18(火) 15:07:10
socket使って通信すると言うのも一つの方法です。(anthyとかcannaとか)
953デフォルトの名無しさん:2007/09/25(火) 11:01:14
;; django-html-mode.el --- django html mode
(require 'sgml-mode)
     .
(defconst django-html-font-lock-keywords-1
(append
;; html-mode keyword
sgml-font-lock-keywords-1)

"First level keyword highlighting")

(defconst django-html-font-lock-keywords-2
(append
django-html-font-lock-keywords-1
sgml-font-lock-keywords-2))

(provide 'django-html-mode)


.emacsに (load django-heml-mode.el)を追加して
起動すると
Symbol's value as variable is void: sgml-font-lock-keywords-1
というエラーになります
sgml-modeはデフォルトで入っているので理由がわかりません
どういったことが考えられるのでしょうか?
環境はWindows xp emacs-22.1です
954デフォルトの名無しさん:2007/09/25(火) 15:25:32
typo
955デフォルトの名無しさん:2007/09/26(水) 16:11:47
>>954
hemlはまちがいです
956デフォルトの名無しさん:2007/09/26(水) 22:51:48
それ以前に、(load "hogehoge") って感じでダブルクォートで囲んでいないからでは
957デフォルトの名無しさん:2007/09/27(木) 10:49:31
>>956
すいません、それも問題ないです
958デフォルトの名無しさん:2007/09/27(木) 16:37:29
meadowでflymakeを動かす方法をどこかにまとまってないでしょうか?
959デフォルトの名無しさん:2007/09/27(木) 23:58:08
>>958
フツーに動くのでは?
cperl-modeでうまく動かない件については
オレがバグレポート出したよ。返事こないけど。
960デフォルトの名無しさん:2007/09/28(金) 16:11:44
emacs で javascriptの編集がしたくて

http://d.hatena.ne.jp/ZIGOROu/20061114/1163503085

を試してみたのですが
{} を好きなところに書けないとかで使いにくいです
本当にこれが一番のおすすめなのでしょうか?
961デフォルトの名無しさん:2007/09/28(金) 17:12:27
>>960
{}を好きなところってのはインデントの付け方のスタイルの違いなんで気に入らないならしょうがないかもね
深さの方なら js-indent-levelの数値変えればいいんじゃないの?
962960:2007/09/28(金) 21:45:56
>>961
ありがとうございます。
設定済みmeadowだと色をつけて強調とかいっさいされてなかったのですが
Redhat linuxでうごかしたら望みどうりのエディタになってくれました
javascript.el は、確かに便利でした

C:\meadow\site-lisp
にjavascript.elを置いたのがいけなかったのかな
963960:2007/09/28(金) 22:26:10
勘違いしてました
設定済みmeadowを使うとjavascript.el がインストールされていても
*.jsというファイルを読み込むと強制的にcc-modeになってしまうようです
964953:2007/09/29(土) 08:09:43
psgmlを入れていたので'sgml-modeの中身がpsgmlになってたみたいです
お騒がせしました
965デフォルトの名無しさん:2007/09/30(日) 02:11:20
質問です。

 M-x h
 M-x align-regexp [RET] //

と同じことをやりたくて、
describe-functionでalign-regexpを調べたところ、

 (align-regexp beg end regexp &optional group spacing repeat)

と出たので、とりあえず

 (defun Test ()
 (interactive)
 (align-regexp (point-min) (point-max) "//"))

と書いたTest.elというファイルを用意し
load-file後にTestと実行してみたんですが

 align-regexp: Wrong type argument: numberp, nil

と出て使えません。。。
何がマズいんでしょうか?
どなたかお願いしますorz
966デフォルトの名無しさん:2007/09/30(日) 05:43:28
もともとの関数、 align-regexp の定義がマズいっぽい。
これ、他の関数から呼ばれることを想定してない感じ。

・regexp は \\(\\s-*\\) を前置する
・group は数字を渡さなきゃいけなくて、 1 がデフォルト
・spacing も数字を渡さなきゃいけなくて、 align-default-spacing がデフォルトで、これの初期値も 1

って感じの仕様になってる。

とりあえず (align-regexp (point-min) (point-max) "\\(\\s-*\\)//" 1 1) なら動くと思う。
967デフォルトの名無しさん:2007/09/30(日) 08:50:19
>>966
なるほど。
そうだったんですか。

ありがとうございました!
968デフォルトの名無しさん:2007/10/01(月) 09:42:04
質問です:
範囲選択したあと,

C-c C-tで範囲内のすべての行の先頭にタブを追加したい

のですが,どうしたらいいのか教えてください.
969デフォルトの名無しさん:2007/10/01(月) 10:49:45
板違いに気付け
970デフォルトの名無しさん:2007/10/01(月) 15:47:01
>>968
(defun oresama-function-insert-tab-in-head-of-line-on-region ()
"選択した領域のすべての行頭にTABを入れる"
(interactive)
(shell-command-on-region (region-beginning) (region-end) "sed s/^/'C-qTABとかでタブ文字をいれておく'/" nil t)
)
971デフォルトの名無しさん:2007/10/01(月) 20:44:17
(defun my-insert-tab-in-head-of-lines-on-region (begin end)
"選択した領域のすべての行頭にTABを入れる"
(interactive "r")
(goto-char (max begin end))
(let ((begin (min begin end))
(end (point-marker)))
(goto-char begin)
(while (<= (point) end)
(when (bolp) (insert "\t"))
(forward-line 1))
(set-marker end nil)))
とか。
972デフォルトの名無しさん:2007/10/01(月) 22:36:27
string-rectangle でいいんじゃない?
973デフォルトの名無しさん:2007/10/02(火) 00:45:18
>>971 常に (<= begin end)
974デフォルトの名無しさん:2007/10/02(火) 00:51:16
replace-regexpで^を\tに置換するだけで良いと思うんだがなあ。
なんでいろいろややこしい方法考えてるの?
975デフォルトの名無しさん:2007/10/02(火) 01:24:51
(lambda (start end)
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region start end)
      (goto-char start)
      (while (re-search-forward "^" nil t)
        (replace-match "\t")))))
976デフォルトの名無しさん:2007/10/02(火) 02:16:46
>>973
interactive に呼んだ場合にはそうだね。
でも他の関数から呼ぶ場合、呼び出し側がその条件を考えなくていいように、こうやる慣習がある。

>>975
narrow-to-region の使い方は参考になった。

ただ、このままだと start が行頭じゃなかった場合でも、必ずそこにタブが入っちゃうね。
narrow-to-region した結果、そこが行頭扱いになっちゃうから。
977デフォルトの名無しさん:2007/10/02(火) 02:55:02
ああそうか。じゃあこんな感じ?
(lambda (start end)
  (interactive "r")
  (save-excursion
    (goto-char start)
    (and (re-search-forward "^" end t)
(save-restriction
  (narrow-to-region (point) end)
  (while (re-search-forward "^" nil t)
    (replace-match "\t"))))))
978デフォルトの名無しさん:2007/10/02(火) 10:21:42
無能ばかりかwww
979デフォルトの名無しさん:2007/10/02(火) 10:29:23
まったくだwww

で、ためしに自分も書き込んでみると、やっぱ似たレベルなんだよなwww
980デフォルトの名無しさん:2007/10/02(火) 12:28:33
>>972 を受けてこんなとか
(lambda (start end)
(string-insert-rectangle start end "\t"))

C-x r t とか。

それでも色々やってみるのは楽しい
981デフォルトの名無しさん:2007/10/02(火) 13:16:49
この場合の問題は、
・start や end が行頭にあることを仮定していいのか
・行頭にない場合がありうるなら、どういう処理が期待されるのか
あたり。

単純に選択した範囲内って条件だと、 start と end それぞれが行頭にない場合を想定しなきゃいけなそう。
で、 start またはそれ以降の最初の行頭から、 end またはそれ以前の最後の行頭まで、各行頭にタブを挿入するってのが妥当かな。
もしかしたら、 start がある行の行頭にもタブ挿入するほうが喜ばれるかもしれないけど。

ってことで、 >>980 を元に、その手の処理を加えてみた。

(lambda (start end)
(interactive "r")
(save-excursion
(goto-char start)
(unless (bolp) (forward-line 1))
(string-insert-rectangle (point) end "\t")))
982デフォルトの名無しさん:2007/10/02(火) 16:57:29
start が行頭でなく、end も同じ行だった場合に (forward-line 1)
で end を通り越しちゃうよ。
983デフォルトの名無しさん:2007/10/02(火) 18:25:42
>>982
なるほど、その状況には気がつかなかった。
その場合、何もしないのが正しいだろうから、対策はこんな感じでいいかな。

(lambda (start end)
(interactive "r")
(save-excursion
(goto-char start)
(unless (bolp) (forward-line 1))
(unless (> (point) end)
(string-insert-rectangle (point) end "\t"))))
984デフォルトの名無しさん:2007/10/02(火) 18:35:39
…書いてから気づいた。
これだと >>982 の状況で更に end が (eobp) を満たす場合、行頭じゃなくても end の位置にタブ挿入しちゃう。

(lambda (start end)
(interactive "r")
(save-excursion
(goto-char start)
(unless (bolp) (forward-line 1))
(unless (> (point) end)
(when (bolp) (string-insert-rectangle (point) end "\t")))))

くらいしなきゃダメだね。
985デフォルトの名無しさん:2007/10/03(水) 10:48:19
みなさん本当にありがとうございます!!

これでReStructuredTextの整形済みブロックが楽々書けます!

986デフォルトの名無しさん:2007/10/05(金) 01:39:19
ふとスレを確認したら、ここはム板のelispスレじゃねーか。
なんか違和感が。
987デフォルトの名無しさん:2007/10/06(土) 15:33:57
(!)
988デフォルトの名無しさん:2007/10/07(日) 11:42:33
scroll-up で、EOBまで移動して、さらにバッファをスクロールして
ウィンドウの下端にカーソルが来るようにしたくて、以下のように
書きました。 eobp でないか、ウィンドウの下端でなければ期待通
りに動作しますが、そうでないときにカーソルが上端へ移動してし
まいます。何が悪いのでしょうか?
Meadow21.4.1使っています。

(defadvice scroll-up
(around eob-scroll-up activate)
(condition-case err
ad-do-it
(error
(if (and (interactive-p)
(not (eobp)))
(goto-char (point-max))
(message "End of Buffer."))
(when (eobp)
(recenter (1- (window-text-height)))
)
nil)))
989988:2007/10/07(日) 11:56:54
すみません。事故解決しました。
990デフォルトの名無しさん:2007/10/07(日) 12:01:03
原因は?
991988:2007/10/07(日) 12:10:58
>>990
recenter する位置が悪いだけでした。
condition-case の外側にしたらできました。

(defadvice scroll-up
(around eob-scroll-up activate)
"バッファ末への移動を可能にし、バッファ末の時 `next-screen-context-lines' を考慮してスクロール"
(condition-case err
ad-do-it
(error
(if (and (interactive-p)
(not (eobp)))
(goto-char (point-max))
(message "End of Buffer."))
))
(and (eobp)
(interactive-p)
(recenter (- next-screen-context-lines)))
nil)
992デフォルトの名無しさん:2007/10/08(月) 17:10:19
/home/myname/
の下に

ダウンロードしたelisp
(本来なら/usr/share/emacs/site-lispとかにおくべきもの)

自作のelispのプログラム

をおくとしたら,どんなフォルダーするべきかの推奨はあるのでしょうか?
993デフォルトの名無しさん:2007/10/08(月) 22:52:57
推奨というのは無いだろうけど、
オレは自作の elisp は ~/mylisp/ に入れていて、
他所から貰ってきたものは ~/elisp/ に入れている。

で、単体で使えるものは ~/elisp/elisp1/ に
パッケージでインストールするものは ~/elisp/elisp2/ に入れている。

~/elisp/subdirs.el を置いておいて、.emacs には
(let ((default-directory "~/elisp"))
(setq load-path (cons default-directory load-path))
(load "~/elisp/subdirs"))
994デフォルトの名無しさん:2007/10/08(月) 23:03:35
>>992
すでに ~/share/man とか ~/lib/ruby とかを作っているので

ダウンロードした方は ~/share/emacs/ で

自作は ~/lib/emacs を作るかな。
995デフォルトの名無しさん:2007/10/08(月) 23:28:05
ダウンロードしたelisp
/home/myname/share/emacs/site-lisp

自作のelisp
/home/myname/local/share/emacs/site-lisp
996デフォルトの名無しさん:2007/10/09(火) 05:24:07
h
997デフォルトの名無しさん:2007/10/09(火) 05:25:11
t
998デフォルトの名無しさん:2007/10/09(火) 05:25:52
p
999デフォルトの名無しさん:2007/10/09(火) 05:26:31
h
1000小倉優子 ◆YUKO3./00M :2007/10/09(火) 05:27:01
1000ならジュースでも飲むか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。