のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,815人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

    元スレEmacs part 26

    emacs スレッド一覧へ / emacs とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    201 : 名無しさん@お腹 - 2008/08/20(水) 12:33:12 (+58,+30,-16)
    うへそれは気付かなかった
    にわか丸出しだなお恥しい
    202 : 名無しさん@お腹 - 2008/08/20(水) 17:37:48 (+43,-30,-91)
    Warning: `mapcar' called for effect; use `mapc' or `dolist' instead

    このwarningが非常にうざいんだけど、どうにかならないだろうか?
    そもそも、 どうして mapcar は推奨されていないんだろう?

    mapcar と mapc は動作も違うし、混乱の元になるような気がしないでもない。
    203 : 名無しさん@お腹 - 2008/08/20(水) 17:43:26 (+57,+29,-18)
    戻す値の分メモリが確保されてそれが無駄になるからとか?
    204 : 名無しさん@お腹 - 2008/08/20(水) 18:12:53 (+3,-30,-122)
    個人的に戻り値に変化を加えることが目的の場合、 mapc は適切じゃないから、
    そういったケースに対してまで mapc を推奨するのは完全に場違いだと思う。
    簡単な例だとこれ:

    (mapcar (lambda (e) (1+ e)) '(1 2 3 4 5))
    => (2 3 4 5 6)

    (mapc (lambda (e) (1+ e)) '(1 2 3 4 5))
    => (1 2 3 4 5)
    205 : 名無しさん@お腹 - 2008/08/20(水) 18:30:37 (-1,-29,-22)
    別に mapcar が非推奨なんてことはない。
    >>202 の警告は、 mapcar の返り値を使ってる様子がないから、代わりに dolist や mapc を推奨してるだけ。
    206 : 名無しさん@お腹 - 2008/08/20(水) 18:34:24 (+57,+29,-5)
    マップクって響きがかっこわるいから使いたくない。
    207 : 名無しさん@お腹 - 2008/08/20(水) 19:25:03 (+68,+29,-84)
    >>202
    ・mapcarは新しいリストを生成するので、副作用のために適用する場合、戻り値を作るのがムダ
    ・その理由から、変換の場合はmapcar、副作用のために適用するにはmapcという慣習ができている。これに従うことで書く側の意図を示唆できるし、また読む側もそれを期待するので慣習を無視した利用は混乱の元。
    208 : 名無しさん@お腹 - 2008/08/20(水) 19:50:50 (-6,-29,+0)
    [参考になる+7]
    209 : 名無しさん@お腹 - 2008/08/20(水) 20:00:07 (+3,-30,-203)
    R5RS schemeのcutもどき
    (defmacro foo:cut (&rest args)
    (loop with arity = (count '<> args)
    with ret-args = (loop for x from 0 below arity
    collect (intern (concat "foo:cut-arg" (number-to-string x))))
    with ret = (list 'lambda ret-args)
    with form
    for x in args
    if (eq '<> x)
    collect (pop ret-args) into form
    else
    collect (cond
    ((and (consp x) (eq 'quote (car x)) (functionp (cadr x))) (cadr x))
    (t x)) into form
    finally (return (append ret (list form)))))
    (apply (foo:cut '+ 1 <> <>) '(1 2)) ; => 4
    あとこれに引数がマクロ展開できる式なら展開するものを組込めば一応使えるものになるだろうと思う
    そんなものどこで使うのとか以外の突っ込み希望んう
    210 : 名無しさん@お腹 - 2008/08/20(水) 21:13:49 (-3,-26,-10)
    ム板のelispスレでやれ
    211 : 名無しさん@お腹 - 2008/08/20(水) 21:19:41 (+7,-15,-11)
    loopマクロ凄いな
    212 : 名無しさん@お腹 - 2008/08/20(水) 21:24:03 (+0,-29,-7)
    ansi-termで日本語manが化ける
    何とかならんか
    213 : 名無しさん@お腹 - 2008/08/20(水) 22:47:14 (-1,-29,+0)
    Haskell Emacs って可能性ないのかな。
    214 : 名無しさん@お腹 - 2008/08/21(木) 01:20:42 (-7,-29,+0)
    >>212
    つwoman
    215 : 名無しさん@お腹 - 2008/08/21(木) 16:28:33 (+12,-10,-3)
    俺、EmacsでOS作るよ。
    216 : 名無しさん@お腹 - 2008/08/21(木) 17:20:44 (+36,+18,+1)
    頑張って!
    217 : 名無しさん@お腹 - 2008/08/21(木) 17:36:26 (+3,-30,-47)
    末尾再帰をループに展開してくれるプリプロセッサが欲しい
    というか新しいEmacsの実装の方が欲しい
    shared object使用可、lexical scope、準拠度が高いcommon lispほげほげ
    218 : 名無しさん@お腹 - 2008/08/21(木) 18:20:37 (+51,+28,+0)
    素晴らしいね! 頑張って!!
    219 : 名無しさん@お腹 - 2008/08/21(木) 18:31:17 (+52,+29,-14)
    俺が死ぬまでには完成させるよ多分
    220 : 名無しさん@お腹 - 2008/08/21(木) 23:25:20 (-6,-29,-14)
    byte-ope.el楽しす
    221 : 名無しさん@お腹 - 2008/08/21(木) 23:56:58 (+57,+29,-6)
    どんなに楽しいのかと思って捜してみるとだな
    http://www.google.com/search?num=50&hl=ja&q=byte-ope.el&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja
    気になる…。
    222 : 名無しさん@お腹 - 2008/08/22(金) 10:55:47 (+2,-29,-35)
    変数sが「空文字列じゃない」か判定する時に、

    (not (equal "" s))

    って書くのがダサい気がするんだけど、もっと綺麗な書き方ない?
    223 : 名無しさん@お腹 - 2008/08/22(金) 11:10:42 (-1,-29,-25)
    >>222
    if, unless を使い分けるとか出来るだけ not を使わない。

    変数sを自分のプログラムで定義してるなら、使い方にもよるが
    空文字列をnilとして扱うようにする。ぐらいしかない。
    224 : 名無しさん@お腹 - 2008/08/22(金) 11:14:43 (+4,-30,-20)
    (defsubst empty-string-p (str)
    (not (equal "" str)))
    って定義しchinaよ
    225 : 名無しさん@お腹 - 2008/08/22(金) 11:20:15 (+57,+29,-41)
    それぐらい標準でありそうなのにね。

    自分のElispならマナー的に関数名の頭にElisp名つけるから、長さは変わらなそうだ。
    初見分かりにくいし。
    226 : 名無しさん@お腹 - 2008/08/22(金) 11:57:19 (-1,-29,-23)
    s が文字列という前提なら
    (< 0 (length s))
    とか?
    227 : 名無しさん@お腹 - 2008/08/22(金) 12:12:50 (+3,-29,-33)
    やっぱそういう関数はビルトインではないのね。
    >>224 みたく自分で定義するしかないっぽい。 ところで、
    (not (equal "" s))

    (< 0 (length s))
    はやっぱり、前者の方が処理速度は早いよね?
    228 : 名無しさん@お腹 - 2008/08/22(金) 13:52:43 (+7,-30,-88)
    (if [condition] [then] [else]...)

    で condition と then の文が同じ時って多くない?
    バッファ・ウィンドウ・プロセスとか作ろうとする時って
    既に存在してたらその型の値を返し、無かったらnilみたいな関数が多いから。
    let とかでまとめてやろうとすると
    [condition] と [then] の二重表記もモヤっとするよな。
    ラップ関数作るのは簡単だけど、unless, when プラス through ぐらいは欲しかった。
    229 : 名無しさん@お腹 - 2008/08/22(金) 13:56:49 (+5,-29,-21)
    unless あるじゃん。

    >>228
    > で condition と then の文が同じ時って多くない?
    具体的にどういうコード?
    230 : 名無しさん@お腹 - 2008/08/22(金) 14:00:25 (-2,-30,-48)
    (if [cond] [cond] [else]) == (or [cond] [else])
    じゃないっけ
    231 : 名無しさん@お腹 - 2008/08/22(金) 14:04:58 (+30,+12,-2)
    え?
    232 : 名無しさん@お腹 - 2008/08/22(金) 14:11:02 (+4,-29,-17)
    そもそもなんで
    (if [cond] [cond] [else])
    なんて書くのかわからん。
    233 : 名無しさん@お腹 - 2008/08/22(金) 14:37:50 (+3,-30,-197)
    同じっていうより
    conditionを評価して得られたものをthenで使う場合は割とあるかも

    (when (get-foo)
    (process-foo (get-foo)))

    こういうの
    onlispで_をconditionを評価して得られたものに束縛するみたいなマクロがあったから
    あれを使えばいいんだろうか
    programming gaucheで紹介されてた例のようにkeyword使って
    (if-bound [cond] [then] &optional [else] :bound _temp)
    みたいに束縛されるシンボルも指定できるようにするとか

    こういう場合は関数よりマクロですよ
    234 : 名無しさん@お腹 - 2008/08/22(金) 14:43:01 (-2,-30,-66)
    (or (zerop (length str)) ...)
    とか使う。

    システム標準 (conventionでもいい) で "" を表す定数 (NUL とか?) があれ
    ば、そっちを使いたい。
    235 : 名無しさん@お腹 - 2008/08/22(金) 15:08:58 (+3,-30,-83)
    >>229, >>232

    (let ((process-name "a-process")
    (process (if (get-process process-name)
    (get-process process-name)
    (start-process process-name "*TEST BUFFER*"))))
    みたいな感じ。
    でも or を使うというのは盲点だった。

    (let ((process-name "a-process")
    (process (or (get-process process-name)
    (start-process process-name "*TEST BUFFER*"))))

    でいいのか。230あたまいいな。
    236 : 名無しさん@お腹 - 2008/08/22(金) 15:09:51 (+57,+29,+0)
    インデントくずれたけどきにしないでくれ
    237 : 名無しさん@お腹 - 2008/08/22(金) 15:13:31 (+57,+29,-8)
    それ let じゃダメじゃね?

    or 使う例はよくある。
    たまには人のも読んでみ。
    238 : 名無しさん@お腹 - 2008/08/22(金) 15:15:04 (-1,-29,-17)
    let* だな。しかも start-process の引数間違ってるし。

    釣ってこよう。
    239 : 名無しさん@お腹 - 2008/08/22(金) 15:32:42 (-1,-29,-6)
    orってnon-nilだったformの値返すのか。
    すっかりnil/tなもんだとばっかり思ってた。
    240 : 名無しさん@お腹 - 2008/08/22(金) 15:34:24 (+41,-30,-186)
    あった、コードの読者がOnLispを読んだことがあるという前提ならlet使うより見やすいかも
    もちろん適当なプレフィックスを付けた方がいいけど
    (defmacro aif (test-form then-form &optional else-form)
    `(let ((it ,test-form))
    (if it ,then-form ,else-form)))
    ;; 例
    (aif (current-buffer) (buffer-name it))

    あと""の検出なら(zerop (string-bytes s))というのもある
    equal使うよりは速いはず(equalはstringを比較する場合string-bytesのルーチンを使ってる)
    リストを辿らんから多分length使うのよりも速い
    実際は殆ど違いは無いけど
    241 : 名無しさん@お腹 - 2008/08/22(金) 15:44:26 (+56,+29,+0)
    >>240
    これもおいしいな。
    242 : 名無しさん@お腹 - 2008/08/22(金) 16:47:08 (+17,-22,-49)
    >>240
    > リストを辿らんから多分length使うのよりも速い
    > 実際は殆ど違いは無いけど
    どう見ても length の方が速そうだが?
    243 : 名無しさん@お腹 - 2008/08/22(金) 17:13:06 (+39,-29,-67)
    >>242
    ソースは軽くしか見てないけど(Cよくわかりません><)、それぞれの実装が
    string-bytesは実質Lisp_String構造体のポインタ経由で長さを保持する組み込み型メンバを返してるだけ
    lengthはループ回してて、ループ毎にポインタを参照してる
    それなら前者の方が速くなるのは予想できない?
    間違ってたら指摘頼む
    244 : 名無しさん@お腹 - 2008/08/22(金) 17:35:00 (+63,+29,-3)
    >>243
    俺の見ているソースとは全然違うようだ
    245 : 名無しさん@お腹 - 2008/08/22(金) 18:06:08 (+36,-30,-146)
    ごめんなさい俺の方が間違いでした

    見直したらlengthの方が速いようでした
    どちらもSBYTESマクロを使っているんですが
    型を確認するときにstring-bytesはCHECK_STRINGを使って(これは内部でstringpの呼び出しがある)のに対し
    lengthはSTRINGPマクロ(キャストしたものにビットマスクかけてで型情報を取得し定数と比較するだけ)
    を使っているという違いがありますね

    嘘情報すんませんでした
    246 : 名無しさん@お腹 - 2008/08/22(金) 18:10:16 (+57,+29,-21)
    そんなに落ち込むな。

    それでも僕らはEmacsを使いつづける。違うかね?
    247 : 名無しさん@お腹 - 2008/08/22(金) 18:24:00 (-6,-29,+0)
    [感動した+3]
    248 : 名無しさん@お腹 - 2008/08/22(金) 18:27:08 (+62,+29,+0)
    >>245
    もっとよく見た方がいいぞ
    249 : 名無しさん@お腹 - 2008/08/22(金) 19:01:33 (+31,-29,-57)
    defsubst の適切な使い場所って、C++ の inline 関数で定義すべきところ?
    具体形に defun ではできて defsubst では定義できない関数ってある?
    250 : 名無しさん@お腹 - 2008/08/22(金) 19:16:41 (+18,-29,-65)
    バイトコードから直接呼び出される関数(length)か、
    Ffuncall経由で呼び出される関数(string-bytes)かの違いの方がよっぽど効いてくると思うが。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について