[表示 : 全て 最新50 1-99 101- 201- 301- 2ch.scのread.cgiへ]
Update time : 11/15 23:17 / Filesize : 88 KB / Number-of Response : 306
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

【GNU】Emacs Lisp 【Elisp】



1 名前:デフォルトの名無しさん mailto:sage [2013/10/20(日) 07:50:56.93 .net]
Emacs Lispのスレです。

- GNU Emacs Lisp Reference Manual
www.gnu.org/software/emacs/manual/elisp.html
- An Introduction to Programming in Emacs Lisp
www.gnu.org/software/emacs/manual/eintr.html
- Emacs Wiki の "EmacsLisp"
www.emacswiki.org/cgi-bin/wiki/EmacsLisp
- GNU Emacs
www.gnu.org/software/emacs/emacs.html

116 名前:デフォルトの名無しさん mailto:sage [2014/03/27(木) 00:13:29.55 ID:/J3FM59H.net]
>>114
python だけじゃなく ruby とか lua でも拡張出来るよ
ただしコンパイル時に if_python とか if_lua とか組み込まないとだめだけど
オリジナルの Vim scriptは海外ではウケが悪いんだとさ

117 名前:デフォルトの名無しさん mailto:sage [2014/03/27(木) 02:09:44.05 ID:FdT+1cD1.net]
24.4から (< a b c …) できるって。

118 名前:デフォルトの名無しさん mailto:sage [2014/03/27(木) 13:12:09.80 ID:rnycJJoD.net]
今までできなかったのかよ

119 名前:デフォルトの名無しさん mailto:sage [2014/03/27(木) 13:16:52.73 ID:qdz8LPjI.net]
定義すれば済むことだな

120 名前:デフォルトの名無しさん mailto:sage [2014/03/27(木) 21:55:07.06 ID:4xfA40Vl.net]
>>116
すげぇ!
Sublime Textなんていらなかったんや!

121 名前:デフォルトの名無しさん mailto:sage [2014/04/03(木) 22:08:59.03 ID:PIEAAVmi.net]
>>119
vimmerはエディタの拡張のために、好きな言語を「選択」できる。
しかし、lisperはエディタの拡張のために、好きに言語を「拡張」できる。

122 名前:デフォルトの名無しさん mailto:sage [2014/04/03(木) 22:37:18.61 ID:DQUVbJjr.net]
そういう意味ではリーダーマクロのない elisp はいまいち

123 名前:デフォルトの名無しさん mailto:sage [2014/04/03(木) 22:44:26.98 ID:PIEAAVmi.net]
>>122
Emacs Lisp にリーダーマクロを実装してみた
dev.ariel-networks.com/Members/matsuyama/implement-emacs-lisp-reader-macro/

124 名前:デフォルトの名無しさん mailto:sage [2014/04/25(金) 08:03:24.78 ID:xiFjVo8G.net]
Latexのコードの特殊文字(?)を取り除いて文字だけにしたい
例えば

This figure ¥ref{fig:some} show someone.

This figure 321 show someone.
に変換したい
どんな正規表現置換すればいいでしょうか



125 名前:デフォルトの名無しさん mailto:sage [2014/04/29(火) 06:14:21.54 ID:hZWbnKFL.net]
パッケージが使えるようになってから
ライブラリ関係が整理されてきたね
www.wilfred.me.uk/blog/2013/03/31/essential-elisp-libraries/

126 名前:デフォルトの名無しさん mailto:sage [2014/05/05(月) 22:14:00.15 ID:rH4KCYSG.net]
>>124
321はどっから出てきた?

127 名前:デフォルトの名無しさん mailto:sage [2014/05/08(木) 04:12:16.26 ID:gIosECTp.net]
あああ

128 名前:デフォルトの名無しさん mailto:sage [2014/05/08(木) 20:38:27.07 ID:APfGLDmZ.net]
あああじゃねえよ321は決め打ち?

129 名前:デフォルトの名無しさん [2014/05/29(木) 22:57:32.74 ID:lRFHqZI8.net]
iii

130 名前:みつを mailto:sage [2014/06/04(水) 19:55:43.06 ID:1mti/jFC.net]
>>129
iiiじゃねえよ。決め打ちね。
ちいさいことからこつこつやっていくしかないよなぁ
(replace-regexp-in-string "[\\]ref\{.*\}" "321" "This figure \\ref{fig:some} show someone.")

そもそも\refを先に\\refにしないとイカンかもな。\rになってまうもんなぁ

131 名前:みつを mailto:sage [2014/06/04(水) 19:57:17.25 ID:1mti/jFC.net]
>>125
パッケージってMELPAとかいうやつ?
ずっと横ばいだな。これは普及するのか
www.modulecounts.com/

132 名前:デフォルトの名無しさん mailto:sage [2014/06/04(水) 21:16:48.17 ID:40jNRALG.net]
むしろそれが今の Emacs の成長率みたいなもんなんじゃないのかな

133 名前:デフォルトの名無しさん mailto:sage [2014/06/13(金) 21:28:22.09 ID:9IC9OAVr.net]
あああ
iii
uuu

134 名前:デフォルトの名無しさん [2014/09/10(水) 14:59:47.34 ID:TJ7Vp+Yk.net]
最近なんか話題ある?



135 名前:デフォルトの名無しさん mailto:sage [2014/09/10(水) 23:18:57.46 ID:7cU3np3J.net]
きちさんが元気になった。

136 名前:デフォルトの名無しさん mailto:sage [2014/09/12(金) 06:48:41.92 ID:pwXLQ7qz.net]
カーソル位置の単語または選択範囲の文字をisearcの検索対象にする
nicolas-petton.fr/blog/isearch-thing.html

137 名前:デフォルトの名無しさん [2014/09/13(土) 00:21:10.93 ID:3yBdenhy.net]
>>135
どんなふうに?

138 名前:デフォルトの名無しさん [2014/10/12(日) 21:42:50.50 ID:QLTYsLQy.net]
Ymacs

139 名前:デフォルトの名無しさん mailto:sage [2014/10/16(木) 00:29:06.56 ID:9sgE7fDV.net]
windows の emacs で find-name-dired をやりたかったんだけど、cmd の find は挙動が違うし、外部から find.exe をもってくるのも難しいしということで、elisp で find-name-dired っぽいものを自作した。

それは、条件に合致したものを cons で繋げていく原始的なものだったんだけど、その後、「リストよりもベクトルの方が参照が速い」ことや、mapcar 関数の存在を知って、自作 find を書き換えた。

修正の結果、find に要する時間は長くなってしまった。
その後、remove-if なる関数があることをしって、先のコードの mapcar を remove-if にすげ替えた。
結果さらに遅くなった。

やっぱりコンスセル単位で操作していくのが一番速いのですか?

140 名前:デフォルトの名無しさん mailto:sage [2014/10/16(木) 09:04:05.88 ID:ML6o1wZC.net]
> やっぱりコンスセル単位で操作していくのが一番速いのですか?

ベクトルは参照は早いけど追加操作は遅い。リストはその逆と思っておけばいい。
ケースバイケースだからソース公開するといいよ。

141 名前:デフォルトの名無しさん mailto:sage [2014/10/16(木) 09:56:15.97 ID:9sgE7fDV.net]
>>140
ありがとうございます。まず、最初に作ったコードです。最後の reverse は無意味でした。

;; M-x myfind

(defvar myfind-ffile-map (make-sparse-keymap))
(define-key myfind-ffile-map [return]
(lambda ()
(interactive)
(find-file (buffer-substring
(line-beginning-position)
(line-end-position)))))
(define-key myfind-ffile-map "\C-m"
(lambda ()
(interactive)
(find-file (buffer-substring
(line-beginning-position)
(line-end-position)))))
(define-key myfind-ffile-map "f"
(lambda ()
(interactive)
(find-file (buffer-substring
(line-beginning-position)
(line-end-position)))))
(define-key myfind-ffile-map "v"
(lambda ()
(interactive)
(view-file (buffer-substring
(line-beginning-position)
(line-end-position)))))

;; 続きます

142 名前:デフォルトの名無しさん mailto:sage [2014/10/16(木) 10:00:45.11 ID:9sgE7fDV.net]
(defun myfind (dir pattern)
"find by elisp"
(interactive
"DDirectory: \nspattern: ")
;; define variable
(let ((case-fold-search t)
(myfind-temp (sort (myfind-store-files dir pattern)
'string<)))
;; make buffer
(let ((temp-buffer-show-function 'switch-to-buffer))
(with-output-to-temp-buffer "*Myfind*"
(set-buffer "*Myfind*")
(font-lock-mode 0)
(setq buffer-read-only nil)
(princ (format "%d matches for \"%s\" in dir: %s\n"
(length myfind-temp) pattern dir))
(dolist (temp myfind-temp)
(princ (concat "\n" temp))
(goto-char (1- (point-max)))
(put-text-property
(line-beginning-position)
(line-end-position) 'face 'underline)
(put-text-property
(line-beginning-position)
(line-end-position) 'keymap myfind-ffile-map)
(when (file-directory-p temp)
(put-text-property
(line-beginning-position)
(line-end-position) 'face 'link))
(goto-char (point-max)))
(view-mode t)))))

143 名前:デフォルトの名無しさん mailto:sage [2014/10/16(木) 10:06:43.79 ID:9sgE7fDV.net]
(defun myfind-dir (input-list input-dir-box)
(let (dir-box)
(dolist (x input-list)
(when (file-directory-p x)
(unless (equal "." (substring x -1))
(if dir-box
(setq dir-box (cons x dir-box))
(setq dir-box (cons x input-dir-box))))))
(if dir-box
(setq dir-box (reverse dir-box))
input-dir-box)))
(defun myfind-store (input-list input-store-box pattern)
(let ((store-box)
(case-fold-search t))
(dolist (x input-list)
(unless (equal "." (substring x -1))
(when (string-match pattern (file-name-nondirectory x))
(if store-box
(setq store-box (cons x store-box))
(setq store-box (cons x input-store-box))))))
(if store-box
store-box input-store-box)))
(defun myfind-store-files (dir pattern)
(let ((tmp-files (directory-files dir t)))
(let ((dir-box (reverse (myfind-dir tmp-files nil))) (store-box (myfind-store tmp-files nil pattern)) (dir-temp-box))
(while (> (length dir-box) 0)
(setq dir-temp-box ())
(dolist (x dir-box)
(setq store-box (myfind-store (directory-files x t) store-box pattern))
(setq dir-temp-box (myfind-dir (directory-files x t) dir-temp-box)))
(setq dir-box (reverse dir-temp-box)))
(reverse store-box))))

144 名前:デフォルトの名無しさん mailto:sage [2014/10/16(木) 10:11:33.46 ID:9sgE7fDV.net]
連投すみません。どこか外部にアップして、url を貼るべきでした。以上に対して、新しいコードでは、上記の関数 myfind-dir, myfind-store, myfind-store-files を以下に差し替えました。

(defun myfind-store-files (dir pattern)
(let* ((tmp-files (directory-files dir t))
(dir-box)
(dir-store)
(store-box (vconcat tmp-files))
(i 0))
(setq dir-box (remove-if '(lambda (x)
(or (not (file-directory-p x))
(equal "." (substring x -1))))
(vconcat tmp-files)))
(while (> (length dir-box) 0)
(while (< i (length dir-box))
(setq store-box (vconcat store-box (directory-files
(aref dir-box i) t)))
(setq dir-store (vconcat
dir-store
(remove-if
'(lambda (x)
(or (not (file-directory-p x))
(equal "." (substring x -1))))
(vconcat (directory-files (aref dir-box i) t)))))
(setq i (1+ i)))
(setq i 0)
(setq dir-box dir-store)
(setq dir-store nil))
(append (remove-if '(lambda (x)
(or (equal "." (substring x -1))
(not (string-match
pattern (file-name-nondirectory x)))))
(delete nil store-box)) nil)))



145 名前:デフォルトの名無しさん mailto:sage [2014/10/16(木) 10:26:10.93 ID:ML6o1wZC.net]
いや、github とかにだね。。

146 名前:デフォルトの名無しさん mailto:sage [2014/10/16(木) 10:42:49.66 ID:ML6o1wZC.net]
vconcat して新しいベクトルをいっぱい生成してるけど、それぐらいならリス
トをそのまま使った方がましだろうね。走査する速度が速くなるよりもベクト
ルを生成するコストの方が高い気はする。

それから mapcar は C の関数だからベクトルでもリストでも気にするほどのパ
フォーマンスの違いはない。elisp でパフォーマンスを気にしてプログラミン
グするときは C で書いてあるか否かも意識するとよいね。

(let ((vec (make-vector 1000 nil)))
(benchmark 100
`(mapcar 'identity vec)))

(let ((lis (make-list 1000 nil)))
(benchmark 100
`(mapcar 'identity lis)))

ざっと見る限りひたすらプログラミング初心者なのでとりあえずパフォーマン
スなんか気にしないで「リスト」を使って富豪的にどんどん書いてく方がいい
よ。

147 名前:ID:9sgE7fDV mailto:sage [2014/10/16(木) 11:15:16.59 ID:DN4MHL3l.net]
>>146
コメントありがとうございます。
なるほど、パフォーマンスはかわらないのか。

elisp でいろいろ作ってみて、プログラミングを学んでいきたいと思います。
スレを汚してしまい、すみません。

148 名前:ID:9sgE7fDV mailto:sage [2014/10/28(火) 15:57:32.52 ID:XuuTzEP8.net]
elisp による find を書き直しました。

https://gist.github.com/anonymous/e0d440b0be2ab4106390

M-x efind
で、ディレクトリとパターンをいれると、
指定したディレクトリ以下にあるファイルもしくはディレクトリのうち、
パターンにマッチするものを列挙します。

下線がひいてあるところは、enter を押すとリンクできます。

「ここは普通こう書くよ」など、コメントをいただけないでしょうか。

149 名前:デフォルトの名無しさん mailto:sage [2014/10/28(火) 16:53:12.91 ID:BaOL+HSr.net]
>>148
普通のdiredじゃ駄目な理由がわからん

150 名前:デフォルトの名無しさん mailto:sage [2014/10/28(火) 20:47:19.78 ID:ABQvesFS.net]
>>149
外部の find を呼ぶ find-name-dired などが、windows ではデフォルトでは使えないので作りました。

あれ、もしかして使えるのかも。もう少し調べてみます。

151 名前:デフォルトの名無しさん mailto:sage [2014/10/30(木) 22:47:05.96 ID:ZUGQOqFu.net]
久々に来たけどなんかもりあがってるね。

152 名前:デフォルトの名無しさん [2014/11/16(日) 21:37:23.05 ID:ifD0nPmW.net]
>>148
君、すごうぃーね〜

153 名前:名無しさん@お腹いっぱい。 mailto:sage [2014/11/16(日) 23:28:59.20 ID:moSkozbZ.net]
無駄多し、バグありの find-lisp-find-dired ってのが大昔からあるよ

154 名前:ID:9sgE7fDV mailto:sage [2014/11/19(水) 11:27:44.63 ID:De3REAga.net]
>>153
!!
ありがとうございます。
ソースコードをみて書き方を学びます。



155 名前:デフォルトの名無しさん mailto:sage [2014/11/23(日) 11:20:51.79 ID:3HkxdKNj.net]
LispとPrologやれば
Cでの再帰プログラムが得意になる

156 名前:デフォルトの名無しさん mailto:sage [2014/11/24(月) 06:26:03.94 ID:eOmEBZPc.net]
べつに
lisp/prologの経験と
再帰の得手不得手は無関係だと思う

157 名前:デフォルトの名無しさん [2015/01/11(日) 18:20:45.19 ID:NEH94HBN.net]
なんか話題ない?

158 名前:デフォルトの名無しさん mailto:sage [2015/01/13(火) 10:50:02.39 ID:NDLkVK0s.net]
マイナーモードの作成について、こちらが意図しないアクション (とくに keyboard-quit) をされたら、そのマイナーモードを抜けるようにしたいんだけど、どうすればいいですか?

できれば pre-command-hook や post-command-hook は使いたくないです。

159 名前:デフォルトの名無しさん mailto:sage [2015/01/13(火) 15:38:25.07 ID:8CwIIHPp.net]
>>158
> マイナーモードを抜ける

の意味がわからない。

minor-mode のコマンドを途中でやめて元のキーシーケンスに戻るってことなら
auto-complete.el の ac-fallback-command あたりを見るとよろしかろう。

160 名前:デフォルトの名無しさん mailto:sage [2015/01/13(火) 16:45:00.86 ID:NDLkVK0s.net]
>>159
コメントありがとうございます。
ご提示いただいたソースを読みたいと思います。

ちなみに、

(add-hook ’post-command-hook ’(lambda () (when hoge-mode (hoge-mode -1))))

のような処理を意図しております。

161 名前:デフォルトの名無しさん mailto:sage [2015/01/13(火) 17:30:12.89 ID:8CwIIHPp.net]
>>160
> (add-hook ’post-command-hook ’(lambda () (when hoge-mode (hoge-mode -1))))

それなら auto-complete.el の例は関係ないかな…
post-command-hook 使うか timer で意図しないコマンドを監視するかしかないのではなかろうか。

何やろうとしてるか分からないから余計なことかもしれないけど、
minor-mode を使うという発想をやめるのも解に繋がるかもしれないよ。

162 名前:デフォルトの名無しさん mailto:sage [2015/01/13(火) 17:45:35.15 ID:NDLkVK0s.net]
>>161
ありがとうございます。
minor-mode を使うなら、あまり選択肢がないのですね。

> minor-mode を使わない
なるほど!なんとなく、とりあえずでマイナーモードを利用していたのですが、使わないという発想も大事なのですね。

163 名前:デフォルトの名無しさん mailto:sage [2015/01/13(火) 18:03:40.40 ID:Wsh3Ajof.net]
そのものずばり何をしたいか書いちゃった方がいい気もする

164 名前:デフォルトの名無しさん mailto:sage [2015/01/13(火) 19:16:25.85 ID:NDLkVK0s.net]
はい、ありがとうございます。

自分用に ace-jump を拡張してます。
勉強のため、通常の ace-jump 部分も最初から作っております。

今回は、hoge-jump というマイナーモードを定義しておりました。
マイナーモードという形を選択した理由は、なんとなくなのですが、他に、マイナーモードを抜ける時点に hook をかけたいという理由があります。

具体的には、hoge-jump によってバッファに付加したオーバーレイを、hoge-jump の去り際にリムーブしております。

(ただ、本家の ace-jump もマイナーモードを使ってないのですね。
本家のほうをもっと検討したいと思います)。



165 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 10:12:31.67 ID:IkrGJUzn.net]
ace-jumpで

1. (ace-jump-char-mode) 実行
2. Query char を mini-bufferから選択
3. a-Zの選択

の2の作業を省いて、

1. (ace-jump-char-selected-mode "A") みたいなの作って実行
2. a-Zの選択

のように。単語を指定した状態で実行したいのですが、
やり方が分からず。

わかる方いらっしゃいますか?

166 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 15:43:11.36 ID:mj45QIEF.net]
>>165
ace-jump 使ってないからコメントしづらいけど
数日経ってこの調子だとすごく低いレベルで推移もしていないように見える。(まるで成長していない)

何をしようとしてどうだめだったのか書きたまえ。

ソースを見る限りだと ace-jump-char-mode の引数に目的の char を渡すだけ
にも思える。

(ace-jump-char-mode ?A)

167 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 20:04:09.96 ID:dLLfAZ37.net]
>>166
ちょっとまて、165 は私で別人ですよ。

168 名前:168 mailto:sage [2015/01/17(土) 20:58:25.28 ID:654N0mRZ.net]
私のほうは、結局マイナーモードを使うにしろ使わないにしろ、keyboard-quit のタイミングを知るには post-command-hook に任意の hook をかけるしかないな、との考えに至りました。

なので、マイナーモードを使用し、それに入るタイミングと出るタイミングで add-hook と remove-hook をおこなうよう設定する予定です。

169 名前:166 mailto:sage [2015/01/19(月) 06:23:29.23 ID:q+OlVYly.net]
>>166
>>167

混乱させてすいません。。
asiiで書けと書いてありました。

170 名前:デフォルトの名無しさん mailto:sage [2015/01/19(月) 13:52:05.04 ID:9dIDW3L4.net]
>>169
s/asii/ascii/

ascii がどうとかはきっと本質的な問題じゃないよ。
基本的なことが理解できてない感じがするけど、
理解しようとする意欲が感じられない。0 点。

171 名前:デフォルトの名無しさん [2015/01/19(月) 14:00:29.29 ID:KroxEeJe.net]
釣り質問としては85点くらい

172 名前:168 mailto:sage [2015/01/20(火) 12:57:47.26 ID:TBaNt/xg.net]
>>158
これ、unwind-protect でできるんですね。

173 名前:デフォルトの名無しさん mailto:sage [2015/01/20(火) 20:54:08.37 ID:boIocfqk.net]
(condition-case err
(keyboard-quit)
(quit
(message "My Quit! %s" err)))

(condition-case err
(keyboard-quit)
(error
(message "Not Quit")))

174 名前:デフォルトの名無しさん mailto:sage [2015/01/21(水) 07:37:45.06 ID:ydgtfCH8.net]
アッシー



175 名前:デフォルトの名無しさん mailto:sage [2015/01/23(金) 00:28:52.51 ID:A+ui+mzv.net]
symbolp()は'symと:symの両方tを返すけど
:symこれのみ真を返す述語あったっけ?

176 名前:デフォルトの名無しさん mailto:sage [2015/01/23(金) 00:38:40.51 ID:KyQRIuOJ.net]
keywordp

177 名前:デフォルトの名無しさん [2015/01/23(金) 02:16:59.21 ID:+QZK+ImI.net]
>>175
keywordp

178 名前:デフォルトの名無しさん mailto:sage [2015/01/23(金) 13:03:20.01 ID:A+ui+mzv.net]
>>176,178
キーワードか
プロパティでさがしてた、ありがと

179 名前:デフォルトの名無しさん [2015/01/24(土) 13:37:32.69 ID:rWwk77U6.net]
どういたしまして

180 名前:デフォルトの名無しさん [2015/03/02(月) 23:35:21.61 ID:b1MuukTF.net]
swift-modeどこかに落ちてませんか?

181 名前:デフォルトの名無しさん mailto:sage [2015/03/03(火) 00:02:29.53 ID:3dr1cPx7.net]
検索したら一瞬で出てくるが

182 名前:デフォルトの名無しさん mailto:sage [2015/03/17(火) 15:43:40.52 ID:oOjriwkf.net]
if とか and って special form だとおもうんだけれど、これ無しの普通の関数のみで条件によって実行するしないを含むようなプログラムって書ける?
haskell みたいに、遅延評価を行えば可能らしいけれど。

聞く場所間違ってたらすまん

183 名前:デフォルトの名無しさん mailto:sage [2015/03/17(火) 16:21:51.69 ID:StR3CX22.net]
>>182
リストとして渡して内部でeval すりゃいいんでないの。
(defun xwhen (pred body)
(when pred (eval body))

184 名前:デフォルトの名無しさん mailto:sage [2015/03/17(火) 19:52:02.87 ID:u03+oswx.net]
特殊形式は無理じゃね



185 名前:デフォルトの名無しさん mailto:sage [2015/03/18(水) 00:49:30.65 ID:smUcV4wp.net]
関数だと引数は全部実行というか評価されてしまうが、
マクロでなんとでもなる
(defmacro myif (pred good bad)
(list 'if pred good bad))
もしくは略記法として
(defmacro myif (pred good bad)
`(if ,pred ,good ,bad))
とすると、
(myif t (insert "ok") (insert "ng"))
と書ける。こうやってS式を返すような関数と同様にmyifを「マクロとして」定義すると、
(myif ...)というフォームはまず最初に「展開」されてから実行される。ここだと
(if t (insert "ok") (insert "ng")) と最初から書いてあったのと同じことになって、
nbの部分は実行されないという寸法。これはつまらない例だが。

もうちょっと面白い例だと、
(defmacro awhen (pred &rest body)
`(let ((it ,pred))
(when it
,@body)))
とすると条件式の結果を本体(body)の中でitとして使えるとか
(awhen "hogehoge" (message it))

special formとマクロの違いは組み込みかどうかぐらい。
こんな感じで色々制御構文を作ったり、遅延評価のを実装したりもできるが、
あんまり濫用すると自分でもわからなくなってくる諸刃の剣

長文御免

186 名前:183 mailto:sage [2015/03/18(水) 01:01:43.13 ID:nZSu0bqF.net]
>>183
when は確かに special form ではなく、マクロなのですが、内部では cond を使っていて、私の望むものではありませんでした。条件があいまいで済みませんでした。

>>184
感覚的には無理なように感じていたのですが、当方あまり lisp や関数型言語に対して俯瞰がなく確証が持てなかったため質問したものでした。

>御二方
理解が深まりました。
ありがとうございます。

187 名前:デフォルトの名無しさん mailto:sage [2015/03/18(水) 01:09:21.60 ID:dNB2wbku.net]
special form を使わずに if 実装って elisp では可能なんだろか…
macro 使ったとしても結局 if 的なことするためには置き換え先で special form 使うことになるよね。

188 名前:183 mailto:sage [2015/03/18(水) 01:19:26.33 ID:nZSu0bqF.net]
ID 変わってるかもですが 183 です。

>>185
内部的に特殊形式を利用しているので、申し訳なくも私がもともと期待していたものとは違うのですが、
特殊形式であっても独自拡張可能というのは面白いですね。

私は主に Python や C/C++ の世界に住んでいるので、例えば条件付トレースなど、
可能であれば条件式によって引数を評価せずに処理をしたいときにあきらめてしまうことがあります。
(書かなくてもわかるかとも思いますが) Python の例で言えばこんな感じです。
def conditional_trace(ctrl, msg):
  if ctrl: print msg
  return
conditional_trace(True, heavy_message_generate())

そもそも Python の世界なんて、コストは大して気にしない場合が多いのですが、
貧乏性でして。あと heavy_message_generate に副作用があったりすると困ります。
こういう意味では C/C++ のプリプロセッサのほうが自由度が高いですね。言語の外にあるだけあって。

条件後出しで申し訳ないです。でも、macro の威力がわかってとても良かったです。ありがとうございます。

ちなみに、when もマクロであって、マクロの展開では評価されないことに依存したものですね。
基礎的な機能であっても、special form をたくさん作るよりはマクロで構文糖衣するということで、これも面白いです。

189 名前:183 mailto:sage [2015/03/18(水) 01:50:01.10 ID:nZSu0bqF.net]
>>187
そうそう。それです。教えていただいた結果、私の疑問もそれになりました。

true, false ではなく、car, (lambda (x) (car (cdr x))) を渡すことになりますが、
macro を遅延評価代わりに使って、分岐っぽいものが実現できるようです。

(defmacro cdrif (idx good bad)
(funcall idx (list good bad)))
(cdrif car (insert "ok") (insert "ng"))
ok
(cdrif (lambda (x) (car (cdr x))) (insert "ok") (insert "ng"))
ng

あとは、任意の(真偽)値から car, (lambda (x) (car (cdr x))) に変換できれば、
elisp で if を自作できることになるんですかねぇ。
ちょっと自信が無いですが。

190 名前:183 mailto:sage [2015/03/18(水) 02:28:36.05 ID:nZSu0bqF.net]
(defmacro cdrifx (bool good bad)
(funcall
(car
(cdr
(assq bool (list '(t car) '(nil (lambda (x) (car (cdr x))))))))
(list good bad)))
cdrifx
(cdrifx t (insert "ok") (insert "ng"))
ok
(cdrifx nil (insert "ok") (insert "ng"))
ng

assq を使ってしまえば出来ました。(assq は C built-in function.)
仮に lisp のみで assq を実装すると if が必要になるかもしれませんが、
概念的には単なる写像というか単純なマッピング関数なのでありなのかなぁ。

チラ裏になってしまい申し訳ない。

191 名前:デフォルトの名無しさん mailto:sage [2015/03/18(水) 03:39:54.16 ID:smUcV4wp.net]
symbol-property-listでの力技を作ってしまおうかと思ったら先を越されてた。

>>188
もとの疑問を離れてその目的ならということだけど、
単純にその重い処理を関数として渡してしまうのがいいのでは。
よくthunkと言われる方法。

(defun conditional-trace (x thunk)
(when x (funcall thunk))
としておいて
(conditional-trace t (lambda () (heavy-message-generate))
とか
(conditional-trace t #'heavy-message-generate)
とか。

そのpythonの例でも同様に
def conditional_trace(ctrl, func):
  if ctrl: print func()
  return
conditional_trace(True, lambda:heavy_message_generate())
conditional_trace(True, heavy_message_generate)

遅延評価する言語も中身はこういう感じの実装だったと思う。

C/C++は関数が第一級データ型じゃないので相当面倒になるが、
頑張ればできるはず…(最近のC++にはラムダ式入ったみたいだけど)。

C/C++のプロプロセッサだと動的に条件を変えたくなったら困らない?
デバッグオプション付きで走らせた時だけトレースが欲しいとかもできなく
なっちゃうし。
あとちょっと複雑なことやろうとすると急速に黒魔術化するイメージがある。

192 名前:デフォルトの名無しさん mailto:sage [2015/03/18(水) 07:20:53.23 ID:dNB2wbku.net]
>>190
はーなるほど。assq で判定させるとは考えつかなかった。
おもしろいねえこれ。

193 名前:デフォルトの名無しさん mailto:sage [2015/03/18(水) 07:23:49.75 ID:dNB2wbku.net]
最低限組み込みで実装しなきゃいけない部分はどこまでで
あとはその組み合わせで自己記述可能になるとかは lisp の教科書読めばわかるのかな。

194 名前:デフォルトの名無しさん mailto:sage [2015/03/18(水) 11:07:05.14 ID:mAuMOca0.net]
純Lisp(pure Lisp)ってのだとcond使わざるを得なくなるから特殊形式は使わざるを得ないんじゃないかな



195 名前:183 mailto:sage [2015/03/18(水) 12:55:18.82 ID:nZSu0bqF.net]
>>191
もし、面倒でなければ「symbol-property-listでの力技」っていうのも見てみたいです。

thunk の例示ありがとうございます。python でも高階関数を使わないわけではなく、
lambda で評価を遅延させるようなことも時々はやるのですが、
必要に応じて関数の引数で使うという発想は無かったです。私にとって新しい概念です。
新しい言語を勉強すると、元の言語でも世界が広がる良い例ですね。楽しいです。

C/C++ ですが、最近の C では、可変引数マクロが使えるので、
#define TRACE(cond,...) if(cond){ printf(__VA_ARGS__); }
とすることで、引数を制御構造に組替えられます。
codepad.org/uX2WaTqT

この実現の仕方は elisp での defmacro に近いですね。

C++ の lambda も上手く例が作れれば後程。

196 名前:183 mailto:sage [2015/03/18(水) 12:56:45.43 ID:nZSu0bqF.net]
>>192
あんまり lisp っぽくないですかね。
Python など、他のパラダイムが強い言語で関数チックに
書こうとすると、写像できるような要素は便利なので良く使います。

ちなみに、JavaScript でよくあるような bool 化 idiom である !! を援用して、
自前 if は最終的に以下のようになりました。

(defmacro macroif (any-symbol good bad)
(funcall
(car
(cdr
(assq (null (null any-symbol)) (list '(t car) '(nil (lambda (x) (car (cdr x))))))))
(list good bad)))

(cdrifx t (insert "ok") (insert "ng"))
ok
(cdrifx () (insert "ok") (insert "ng"))
ng
(cdrifx (list 1 2 3) (insert "ok") (insert "ng"))
ok


>>194
lisp は関数指向でも書けるけれど、そもそもマルチパラダイムなのが、
その規定の時点から現れているように思えます。
最小要素とするのに、macro による制御構造の書換えと
一箇所で特殊な振舞いをするという cond どっちが最小かと言えば cond のが小さそうです。

197 名前:デフォルトの名無しさん mailto:sage [2015/03/19(木) 10:18:55.55 ID:KVeBWceY.net]
>>195
力技というほどのものでもなかった
(put t 'cdrif-value #'car)
(put nil 'cdrif-value #'cadr)
(defun convert (x)
(get x 'cdrif-value))
(defmacro my-if (idx good bad)
(funcall (convert idx) (list good bad)))

いや、本当はさらに
(put nil 'convert-value t)
(defun to-t-or-nil (x)
(not (ignore-errors (get x 'convert-value))))
(defun convert (x)
(get (to-t-or-nil x) 'cdrif-value))
とかいう力業っぽいことを考えてたんだけども、
ignore-errors が反則だったと気づいた。
こっちの反則版だとnil以外のどんな値を渡しても
ちゃんとt扱いされるという利点はあるけど…


C/C++プリプロセッサ、そういうことか。条件付きコンパイルを想像していた。
#define DEBUG(level) if(level>=verbosity){printf(_VA_ARGS_);}
みたいなことは一回やったことがある。
完全に文字列として変形するからlevelのところに関数呼び出しのコンマがあると
変なことになるという罠があるが、こういう用途だと大丈夫だしね。

自由度という点では何も考えずに言語全体を使えるlispマクロは特異に高いと思う。
elispじゃなくてcommon lispになっちゃうがland of lispとか読むと楽しいかもしれない。

198 名前:デフォルトの名無しさん mailto:sage [2015/03/19(木) 10:42:33.11 ID:QynmxxEd.net]
>>197
なるほど、こっちはプロパティを写像に使うのか
いろいろ考えつくもんだなぁ

199 名前:183 mailto:sage [2015/03/20(金) 03:19:22.81 ID:x0oqiRHZ.net]
>>197 ありがとうございます。取り急ぎお礼を申し上げ乙。

200 名前:デフォルトの名無しさん mailto:sage [2015/05/26(火) 11:33:21.52 ID:dBigamDw.net]
setqと同等の機能を実現する関数は定義できますか

201 名前:デフォルトの名無しさん mailto:sage [2015/05/26(火) 13:54:08.02 ID:M2tYWf9M.net]
set と マクロ使えばできるんじゃない

202 名前:デフォルトの名無しさん [2015/08/29(土) 07:44:55.47 ID:vrZb3qx4.net]
なんかネタないの?

203 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 11:38:36.28 ID:cVkBtg3P.net]
ついに俺のチンコが黒光りしてきた話はどうだ?

204 名前:デフォルトの名無しさん [2015/08/29(土) 13:38:04.80 ID:vrZb3qx4.net]
>>203
却下



205 名前:デフォルトの名無しさん mailto:sage [2015/08/30(日) 05:58:46.12 ID:dCMQNVLK.net]
>>203
どうやったら黒光りするの?

206 名前:デフォルトの名無しさん mailto:sage [2015/08/30(日) 06:03:17.10 ID:CnOlY9Pq.net]
図書館で毎日ナンパして地下食堂のトイレでマン汁まみれで腰動かすんだよぉ

207 名前:デフォルトの名無しさん [2015/10/10(土) 12:55:20.49 ID:yXubKPZg.net]
なんか話題ないの?

208 名前:デフォルトの名無しさん mailto:sage [2015/10/12(月) 15:20:18.76 ID:pxYHqVTj.net]
API対応した2chリーダ誰か作んないかな?

209 名前:デフォルトの名無しさん mailto:sage [2015/10/31(土) 20:36:12.30 ID:YZFloUqY.net]
ない

210 名前:デフォルトの名無しさん mailto:sage [2015/11/01(日) 00:32:17.94 ID:seZhoDUW.net]
>>208
作ろっか?

211 名前:デフォルトの名無しさん [2015/11/15(日) 09:25:10.66 ID:Bf2qkjUe.net]
>>210
おねがいします

212 名前:デフォルトの名無しさん [2015/11/19(木) 21:57:45.42 ID:NWoSZj2q.net]
>>211
よしわかった

213 名前:デフォルトの名無しさん mailto:sage [2016/03/05(土) 00:21:51.81 ID:KaW6Box3.net]
>>212
いえーい

214 名前:デフォルトの名無しさん mailto:sage [2016/04/18(月) 00:14:54.95 ID:rfz/B1KY.net]
いーまっくすはじめようとしたらしょしんしゃはこれやっとけのところでえらーになったのでもうねます



215 名前:デフォルトの名無しさん [2016/09/10(土) 01:53:11.20 ID:LstVZLgo.net]
初心者です
以下の文を電話で伝える場合、どのように話せばよいか教えて下さい。

(assq bool (list '(t car) '(nil (lambda (x) (car (cdr x))))))))

例:
かっこ始まり、えいえすえすくー ぶーーと かっこ始まり・・・・・・・・

みたいな感じでお願いしまつ

216 名前:デフォルトの名無しさん [2016/09/10(土) 01:56:10.66 ID:LstVZLgo.net]
すみません。前の質問の補足ですが、なんで電話で伝えるかなのですが、
有料サポートで、おぺれーたーのお姉さまから、エラーのでる行を読み上げて下さいと言われたのですが、答えられない事があって、こんどこそ上手く説明しようとおもっています。






[ 続きを読む ] / [ 携帯版 ]

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

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