Emacs Lisp 2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG少数派による互助を中心に、初心者の相談も気が向けば受け付けます。
単なる 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/
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004前スレ988
NGNG(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))
0005前スレ988
NGNG(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))))
0006前スレ988
NGNG(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))))
0007デフォルトの名無しさん
NGNGこれは多分必要だろうね。
ついでに subrで定義されてるけど clで再定義されちゃう関数対策も。
0008デフォルトの名無しさん
NGNGでしょう。漏れもさりげなくロードされてたみいだしもういいや。2ch で必死にl を
排除しても使ってるパッケージがロードしてちゃぁねぇ。ぶっちゃけランタイムにロー
ドされてても実害ないんだろ?
0009デフォルトの名無しさん
NGNG例えば、emacs20 で mapc は cl 関数として
(mapc CL-FUNC CL-SEQ &rest CL-REST)
と定義されていた。emacs21 になって built-in になったんだけど、
(mapc FUNCTION SEQUENCE)
と、一つしかシーケンスを受けとらなくなった。NEWS には新規にmapc が実装
されたとは書いてあるけど、cl ユーザーへの notice は何も無し。ランタイ
ムで cl を要求するコードは推奨してないのだから、そういったコードへの配
慮は必要無いってことみたい。
00108
NGNG知らない間にロードされてんの。アンロードとかできないんでしょ?
使ってる elisp を全部チェックして cl 使ってるやつを排除するのマンドクサ。
激しく致命的な問題があるなら考えるけどさぁ…。
0011デフォルトの名無しさん
NGNG(require 'loadhist)
(file-dependents (feature-file 'cl))
これでわかるよ。
0013デフォルトの名無しさん
NGNGcolor-theme を外して…げっ!eieio とか外しちゃ話になんねぇ…。つーか…これって、
コンパイル時に使ってるだけの奴もひっかかってない??やっぱ手動チェックかなぁ…。
0014デフォルトの名無しさん
NGNGcl ロードしていいよ。もう cl 使うな原理主義者の文句は甘受する。
つーか、(require 'cl) するだけじゃねーか?俺関数が乱立するよか
よっぽどマシだろ。
0015デフォルトの名無しさん
NGNGtuareg, eieio, ecb, haskell-mode, ilisp, python-mode
speedbar とかかな。sml-mode や navi2ch や Mule-UCS の一部にも
eval-when に囲まれてない (require 'cl) があるな。でもコンパイル
して使う分には問題ないの?つーか、そこまでして cl は避けなきゃいけないの?
0016デフォルトの名無しさん
NGNGそもそも、なんで elisp にはパッケージ管理等の名前空間管理システムがないの?
そもそも、なんで elisp は dynamic bind なの?
0017デフォルトの名無しさん
NGNG言動を見てると、Emacs Lisp はあくまでもエディタ拡張用言語であり、
本格的なプログラミングには別の言語を使って欲しいような感じ。
0019デフォルトの名無しさん
NGNGか、cl なんかロードしちまってもいいんじゃねーの?と flim とかで苦しんだ漏れは思うわけだが。
ま、病的に cl を恐れてるんじゃなければ、かまわんだろ。そんなことより
もっと elisp 話しようよ。
0020デフォルトの名無しさん
NGNGそだね。じゃあ、どうでもいいネタをひとつ。こういうマクロ作ってみた。
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)
0021デフォルトの名無しさん
NGNG# たとえ eval-when-compileとかしてなくっても、だ。
clな関数な話題は、なるべく lispスレを利用していただきたい。
0022デフォルトの名無しさん
NGNGmake-symbol はそれでいいけど、
< `(let ((,tmp-alist alist))
> `(let ((,tmp-alist ,alist))
0023デフォルトの名無しさん
NGNG> clな関数な話題は、
今の話題は cl な関数自身ではなく、cl がもたらす弊害について。
つまり、このスレ以上に適切なスレはない。
おまいが舞う構わないは全く関係無い。
0024デフォルトの名無しさん
NGNGcl って elisp で書かれた elisp 用のライブラリだよね?
0025デフォルトの名無しさん
NGNGcl の弊害って今まででた奴は A. 標準関数を拡張しちゃう、B. 俺関数とあたる、
C. 将来の非互換の可能性、くらいか? B. C. はあらゆるライブラリに共通だと
思うが、A. はいかんともしがたいな。我慢できねー香具師は我慢ならんだろう。
mapc なんかも Common Lisp というリファレンスがあるだけわりと互換性の
ある変更で済んでマシな部類だっと思うけどねぇ。
0026デフォルトの名無しさん
NGNGinfo ではバッティングは避けるようなこと書いてあったけど。
0027デフォルトの名無しさん
NGNGemacs がこの先どれくらい進化するのか知らんけど、
こういうどろくさい部分は残り続けるな。
つーかすでに妥協のかたまりみたいなもんで、
本当にクリーンなもの使いたいなら hemlock とか使うしか。
0028デフォルトの名無しさん
NGNGうおっと、たまたま変数名が同じで動いてただけか。
しかし、なかなか話題が変らんな... 2ch であーだこーだ言っても仕方無かろうに。
0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNG(mapcar (lambda (z) (cons x z)) y))
こんな関数どっかにある?
0031デフォルトの名無しさん
NGNGあるとしたら、どんな名前になると思う?
0032デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNGわざわざ別関数にするほど汎用性があるとは到底思えないのだが
0035デフォルトの名無しさん
NGNGlambdaの中で使ってたのでlambdaを減らして見やすくしようかと。
0036デフォルトの名無しさん
NGNG(loop for z in y collect (cons x z))
と書けば?と思ったが、
(mapcar (lambda (x z) (cons x z)) y)
こっちとタイプ数が変わらない事に気づいた。だめじゃん loop …
ま、こんなの適当に名前つけとけばいいんじゃないの?
0037デフォルトの名無しさん
NGNG0038デフォルトの名無しさん
NGNG展開されるんだから 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 だけは勘弁な。
0039デフォルトの名無しさん
NGNG0040デフォルトの名無しさん
NGNG少数派による互助を中心に、初心者の相談も気が向けば受け付けます。
単なる 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/
0041デフォルトの名無しさん
NGNG時々現れるから変な事になるんだろ?
ま、elispと関係なく scheme的なコード披露したがる奴も
たいていセットなんだけど。
なんで自分達の巣におさまってないのかねぇ。
0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
NGNGドキュメント読んでも分かりません。
具体的に、どういう時に有効なのでしょうか?
0045デフォルトの名無しさん
NGNGてゆーか人に聞く前にgrepくらいしろぃ。
標準添付のelispでも結構使われてるじゃねーか。
0046デフォルトの名無しさん
NGNG41 の思う elisp なスタイルってどんなのよ?
0047デフォルトの名無しさん
NGNG(codition-case 'hoge
(progn (エラーを無視したいコード))
(error nil))
とか書かなきゃならないの?マンドクサ…。
0048デフォルトの名無しさん
NGNGgrepぐらいしてるよ〜。あちこちで見かけるけどサパーリ分からなくて
悲しい思いしてるのに、無下に切り捨てないでくれよ。
0049デフォルトの名無しさん
NGNG同じような意見は何度も出てるんだけど、わざとループさせようとしてるの?
0050デフォルトの名無しさん
NGNG激しくしつこいから、無しでやっていってるのかな〜とおもって。(condition-case ...)
で長くなったらダルくない? 漏れは ignore-errors とかは使うほうが良いと思うし、
どーせ cl 使うなら便利な機能の話は有難い。しかし、本当に使ってはいけないなら
使うのを止めてもいい(別に愛着があるわけじゃないし)。 ロードしたくない人むけに
eval-when-compile でコンパイル時に使うようにすりゃいいだけの話ではないの?
0051デフォルトの名無しさん
NGNG1 - cl をランタイムにロードするのが我慢ならない人が居ます。
2 - 普通に (require 'cl) と書くと,そのプログラムをロードしたときに cl がロードされてしまいます。
3 - したがって cl を使うときは (eval-when-compile ...) で囲んでコンパイル時に評価しておきます。
すると,そのプログラムをロードしても cl はランタイムにはロードされません。cl を使うときは
eval-when-compile で囲むのが御行儀が良いとされています。eval-when-compile はこーゆう時に有効なのです。
え、コンパイルしないでロードしたら? その場合は普通に require されてしまうの
で、elisp コードをむやみに評価しないように気をつかいましょう。下手をすると
cl がロードされてしまいます。
# 気にしない人は全然気にしないからこの手の話は荒れるんだよな…。
0052デフォルトの名無しさん
NGNG(require 'cl)して利用してるパッケージも多いし、
俺もここで書かれるまで clのとは知らなかった。
このスレで clウザがられてるのは、
elisp(emacs上で動かしたい)コードの一部として
loop なり mapcon なりが出てるのでなく、
それを使う事自体が目的に見えるというか、全面に出てきすぎてて
拒否反応起こす人がいるとか?
あと各種パッケージでも利用頻度低い clの関数は
馴染みがないわけだし。
# incfあたり、そろそろ解禁日も近い感じがするが。
0053デフォルトの名無しさん
NGNG× eval-when-compile
○ eval-and-compile
;; eval-when-compile は自明っしょ。
0054デフォルトの名無しさん
NGNG評価されない。あるフォームをバイトコンパイル時にも確実に評価したい場合、
eval-and-compile で囲む。
foo.el:
(eval-and-compile
(message "hoge")
(sit-for 1))
bar.el:
(message "hoge")
(sit-for 1)
をバイトコンパイルしてみると違いがわかる。
0055デフォルトの名無しさん
NGNG(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))))))
0056デフォルトの名無しさん
NGNG未出の各マクロについてこれは便利だから…てやってったらループじゃん。
これまでに cl マクロ自体の有用性を否定してる人はほとんどいないから、
個別のマクロ挙げていっても意味ないわけ。
>>52 が書いてるように、cl で書くこと自体が目的のようなレスが目立ったり、
cl から発展して Common Lisp 自体の議論 (loop マクロの是非等) を延々と
続けられたりしたので、cl マクロを使ったコードを *このスレに書く* のが
嫌われてる。
0057デフォルトの名無しさん
NGNGつーか、emacs 用コードを lisp スレに貼られてもなぁ…。
elisp の話は elisp スレのが相応しいような…。
0058デフォルトの名無しさん
NGNG前スレ後半あたりとか、別にemacs用コードじゃない clなコードが
ちょっと多めだったよ。あのあたりからじゃん、clネタのループって。
0059デフォルトの名無しさん
NGNG書き直して loop に引導を渡してやれ!俺は while に展開されるなら、まぁ、
いいかなぁという気がしている。elisp らしいスタイルとやらをビシっと見せてくれ。
0060デフォルトの名無しさん
NGNG0061デフォルトの名無しさん
NGNG0062デフォルトの名無しさん
NGNG(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)))))
0063デフォルトの名無しさん
NGNGの方がいいか。
0064デフォルトの名無しさん
NGNGさすがに loop よりビルトインの mapcar や mapconcat のが速いですね。いや〜勉強になります。
elisp だと効率が大事なところは組み込みの map 系を使うのが最速ですかね?
ところでこーゆうときは mapconcat のセパレータは "" と nil のどっちがいいんでしょう?
0065デフォルトの名無しさん
NGNG反復より C レベルの反復のが速いのは当然。再帰は…Scheme 化を待て。
0066デフォルトの名無しさん
NGNG三つとも利用してるコードって結構沢山あると思うんだけど、
もしもし scheme化されたら、そーいうのってどうするの?
0067デフォルトの名無しさん
NGNG0068デフォルトの名無しさん
NGNG複数に分けた方がいいような一つの関数が
必然性もなく長々続くことがあるので、
なんでこんな書き方するんだろうなーと思ってたが、
多数の人間で長い間開発してると、他の人への配慮もあって、
なかなか無闇に関数を整理できなくなってくるからかもと
思い始めた。
0069デフォルトの名無しさん
NGNGhttp://www.gnu.org/software/guile/docs/guile-ref/Symbol-Props.html
elisp からの変換用に、シンボルには関数スロットやプロパティスロットも
用意されてるよ。後はトランスレータの仕事。
0070デフォルトの名無しさん
NGNG0071デフォルトの名無しさん
NGNGがんがったけど、あきらめたのかと思ってたんだけど。
emacs21互換のguile-emacsは無いよね。
0072デフォルトの名無しさん
NGNGhttp://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年後くらいか。
0073デフォルトの名無しさん
NGNG0074デフォルトの名無しさん
NGNGおごちゃんに弟子入りしてバリバリのコボラになってしまった。;_;
なんでリスパがコボルに。
0075デフォルトの名無しさん
NGNGlookupの開発は誰か引きついでるの?
0076デフォルトの名無しさん
NGNG相当の変人だと思っていたが、そこまで変人とは
0077デフォルトの名無しさん
NGNG0078デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNG0080デフォルトの名無しさん
NGNGのこのこ戻ってきて、また放り出したのも有名
0081デフォルトの名無しさん
NGNG0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNG(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 キボン。
0085デフォルトの名無しさん
NGNG(foo `(lambda () (,function))))
0086デフォルトの名無しさん
NGNG(foo function))
0087デフォルトの名無しさん
NGNGそれだと function じゃなくて cons を渡してることになる。
動作は同じだけどバイトコンパイルされない。
>>86
84 は単純化してる。実際はもっと複雑な処理をする高階関数からもっと複雑
な処理をする高階関数を読んでるので、その指摘は的外れ。
0088デフォルトの名無しさん
NGNG(foo (byte-compile `(lambda () (,function)))))
0089デフォルトの名無しさん
NGNGbyte-compile がコンパイルする引数は lambda。car が 'lambda のリストではない。
実際にそれで動くということと、そう書いていいかということは違う。
0090デフォルトの名無しさん
NGNGlambdaってのはどういう意味なの?
0091デフォルトの名無しさん
NGNGlambda
<サイエンス‐単位・計測>
微小な体積を表すのに用いてきた単位で、一マイクロリットル、すなわち一〇億分の一立方メートルに
当たる。
0092デフォルトの名無しさん
NGNG0093デフォルトの名無しさん
NGNG仮引数の名前にプレフィックスをつけとく。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#cl-elisp-memo-lambda
前スレでも同じ話題がでてた。
0094デフォルトの名無しさん
NGNG嵌ったふりをしているに一票。
# いや、参考になったけど。
0095デフォルトの名無しさん
NGNGドキュメントが英語なら gnu.emacs.sources でいいだろうけど。
0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNGとりあえずこのあたりはどうか。日本とは言えないかもしれないけど
0098デフォルトの名無しさん
NGNG> * 日本人制作 Elisp の公開場所の提供、
ここは良さそうだね。
http://www.emacswiki.org/elisp/index.html
elispパッケージの一覧もあるし。
各パッケージの先頭一行目に書かれている説明が日本語に翻訳されていると、
英語が苦手な人が選ぶときにいいとおもう。
;;; a-menu.el --- create a menu from a specified directory
これを
;;; a-menu.el --- 指定したディレクトリからメニューを生成する。
として一覧になっているといいなと。
あっ、俺がやればいいのか。
0099デフォルトの名無しさん
NGNGM-x とか M-:でヒストリ使えるようにする elispとか誰か作ってくれないかな。
多分どこかのアーカイブに埋もれてそうな気もするが。
0100デフォルトの名無しさん
NGNGNemacs Lisp と GNU Emacs Lisp の違いを一行で述べよ。
俺の超能力によると、Nemacs lisp = GNU Emacs19 Lisp + 日本語処理関連。
0101デフォルトの名無しさん
NGNGgoogleでちょろっと調べた感じでは、
Nemacs lisp = GNU Emacs18 Lisp + 日本語処理関連
みたいですね。
私はelispパッケージを開発するときは最低限度として、GNU Emacsの最新版と
XEmacsの最新版で動くように気をつかっているけど、さすがにNemacsまでは
手がまわらないという気持ちです。
■ このスレッドは過去ログ倉庫に格納されています