【GNU】Emacs Lisp 【Elisp】

2014/04/03(木) 22:37:18.61ID:DQUVbJjr
そういう意味ではリーダーマクロのない elisp はいまいち
2014/04/03(木) 22:44:26.98ID:PIEAAVmi
>>122
Emacs Lisp にリーダーマクロを実装してみた
http://dev.ariel-networks.com/Members/matsuyama/implement-emacs-lisp-reader-macro/
2014/04/20(日) 18:24:46.84ID:RjB2Ff6v
>>123
おお、なんか凄そうだな
勉強すすんだら、それ勉強させてもらいます
来年かなあ
2014/04/25(金) 08:03:24.78ID:xiFjVo8G
Latexのコードの特殊文字(?)を取り除いて文字だけにしたい
例えば

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

This figure 321 show someone.
に変換したい
どんな正規表現置換すればいいでしょうか
2014/04/29(火) 06:14:21.54ID:hZWbnKFL
パッケージが使えるようになってから
ライブラリ関係が整理されてきたね
http://www.wilfred.me.uk/blog/2013/03/31/essential-elisp-libraries/
2014/05/05(月) 22:14:00.15ID:rH4KCYSG
>>125
321はどっから出てきた?
2014/05/08(木) 04:12:16.26ID:gIosECTp
あああ
2014/05/08(木) 20:38:27.07ID:APfGLDmZ
あああじゃねえよ321は決め打ち?
130デフォルトの名無しさん
垢版 |
2014/05/29(木) 22:57:32.74ID:lRFHqZI8
iii
131みつを
垢版 |
2014/06/04(水) 19:55:43.06ID:1mti/jFC
>>130
iiiじゃねえよ。決め打ちね。
ちいさいことからこつこつやっていくしかないよなぁ
(replace-regexp-in-string "[\\]ref\{.*\}" "321" "This figure \\ref{fig:some} show someone.")

そもそも\refを先に\\refにしないとイカンかもな。\rになってまうもんなぁ
132みつを
垢版 |
2014/06/04(水) 19:57:17.25ID:1mti/jFC
>>126
パッケージってMELPAとかいうやつ?
ずっと横ばいだな。これは普及するのか
http://www.modulecounts.com/
2014/06/04(水) 21:16:48.17ID:40jNRALG
むしろそれが今の Emacs の成長率みたいなもんなんじゃないのかな
2014/06/13(金) 21:28:22.09ID:9IC9OAVr
あああ
iii
uuu
135デフォルトの名無しさん
垢版 |
2014/09/10(水) 14:59:47.34ID:TJ7Vp+Yk
最近なんか話題ある?
2014/09/10(水) 23:18:57.46ID:7cU3np3J
きちさんが元気になった。
2014/09/12(金) 06:48:41.92ID:pwXLQ7qz
カーソル位置の単語または選択範囲の文字をisearcの検索対象にする
http://nicolas-petton.fr/blog/isearch-thing.html
138デフォルトの名無しさん
垢版 |
2014/09/13(土) 00:21:10.93ID:3yBdenhy
>>136
どんなふうに?
139デフォルトの名無しさん
垢版 |
2014/10/12(日) 21:42:50.50ID:QLTYsLQy
Ymacs
2014/10/16(木) 00:29:06.56ID:9sgE7fDV
windows の emacs で find-name-dired をやりたかったんだけど、cmd の find は挙動が違うし、外部から find.exe をもってくるのも難しいしということで、elisp で find-name-dired っぽいものを自作した。

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

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

やっぱりコンスセル単位で操作していくのが一番速いのですか?
2014/10/16(木) 09:04:05.88ID:ML6o1wZC
> やっぱりコンスセル単位で操作していくのが一番速いのですか?

ベクトルは参照は早いけど追加操作は遅い。リストはその逆と思っておけばいい。
ケースバイケースだからソース公開するといいよ。
2014/10/16(木) 09:56:15.97ID:9sgE7fDV
>>141
ありがとうございます。まず、最初に作ったコードです。最後の 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)))))

;; 続きます
2014/10/16(木) 10:00:45.11ID:9sgE7fDV
(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)))))
2014/10/16(木) 10:06:43.79ID:9sgE7fDV
(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))))
2014/10/16(木) 10:11:33.46ID:9sgE7fDV
連投すみません。どこか外部にアップして、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)))
2014/10/16(木) 10:26:10.93ID:ML6o1wZC
いや、github とかにだね。。
2014/10/16(木) 10:42:49.66ID:ML6o1wZC
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)))

ざっと見る限りひたすらプログラミング初心者なのでとりあえずパフォーマン
スなんか気にしないで「リスト」を使って富豪的にどんどん書いてく方がいい
よ。
148ID:9sgE7fDV
垢版 |
2014/10/16(木) 11:15:16.59ID:DN4MHL3l
>>147
コメントありがとうございます。
なるほど、パフォーマンスはかわらないのか。

elisp でいろいろ作ってみて、プログラミングを学んでいきたいと思います。
スレを汚してしまい、すみません。
149ID:9sgE7fDV
垢版 |
2014/10/28(火) 15:57:32.52ID:XuuTzEP8
elisp による find を書き直しました。

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

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

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

「ここは普通こう書くよ」など、コメントをいただけないでしょうか。
2014/10/28(火) 16:53:12.91ID:BaOL+HSr
>>149
普通のdiredじゃ駄目な理由がわからん
2014/10/28(火) 20:47:19.78ID:ABQvesFS
>>150
外部の find を呼ぶ find-name-dired などが、windows ではデフォルトでは使えないので作りました。

あれ、もしかして使えるのかも。もう少し調べてみます。
2014/10/30(木) 22:47:05.96ID:ZUGQOqFu
久々に来たけどなんかもりあがってるね。
153デフォルトの名無しさん
垢版 |
2014/11/16(日) 21:37:23.05ID:ifD0nPmW
>>149
君、すごうぃーね〜
2014/11/16(日) 23:28:59.20ID:moSkozbZ
無駄多し、バグありの find-lisp-find-dired ってのが大昔からあるよ
155ID:9sgE7fDV
垢版 |
2014/11/19(水) 11:27:44.63ID:De3REAga
>>154
!!
ありがとうございます。
ソースコードをみて書き方を学びます。
2014/11/23(日) 11:20:51.79ID:3HkxdKNj
LispとPrologやれば
Cでの再帰プログラムが得意になる
2014/11/24(月) 06:26:03.94ID:eOmEBZPc
べつに
lisp/prologの経験と
再帰の得手不得手は無関係だと思う
158デフォルトの名無しさん
垢版 |
2015/01/11(日) 18:20:45.19ID:NEH94HBN
なんか話題ない?
2015/01/13(火) 10:50:02.39ID:NDLkVK0s
マイナーモードの作成について、こちらが意図しないアクション (とくに keyboard-quit) をされたら、そのマイナーモードを抜けるようにしたいんだけど、どうすればいいですか?

できれば pre-command-hook や post-command-hook は使いたくないです。
2015/01/13(火) 15:38:25.07ID:8CwIIHPp
>>159
> マイナーモードを抜ける

の意味がわからない。

minor-mode のコマンドを途中でやめて元のキーシーケンスに戻るってことなら
auto-complete.el の ac-fallback-command あたりを見るとよろしかろう。
2015/01/13(火) 16:45:00.86ID:NDLkVK0s
>>160
コメントありがとうございます。
ご提示いただいたソースを読みたいと思います。

ちなみに、

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

のような処理を意図しております。
2015/01/13(火) 17:30:12.89ID:8CwIIHPp
>>161
> (add-hook ’post-command-hook ’(lambda () (when hoge-mode (hoge-mode -1))))

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

何やろうとしてるか分からないから余計なことかもしれないけど、
minor-mode を使うという発想をやめるのも解に繋がるかもしれないよ。
2015/01/13(火) 17:45:35.15ID:NDLkVK0s
>>162
ありがとうございます。
minor-mode を使うなら、あまり選択肢がないのですね。

> minor-mode を使わない
なるほど!なんとなく、とりあえずでマイナーモードを利用していたのですが、使わないという発想も大事なのですね。
2015/01/13(火) 18:03:40.40ID:Wsh3Ajof
そのものずばり何をしたいか書いちゃった方がいい気もする
2015/01/13(火) 19:16:25.85ID:NDLkVK0s
はい、ありがとうございます。

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

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

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

(ただ、本家の ace-jump もマイナーモードを使ってないのですね。
本家のほうをもっと検討したいと思います)。
2015/01/17(土) 10:12:31.67ID:IkrGJUzn
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の選択

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

わかる方いらっしゃいますか?
2015/01/17(土) 15:43:11.36ID:mj45QIEF
>>166
ace-jump 使ってないからコメントしづらいけど
数日経ってこの調子だとすごく低いレベルで推移もしていないように見える。(まるで成長していない)

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

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

(ace-jump-char-mode ?A)
2015/01/17(土) 20:04:09.96ID:dLLfAZ37
>>167
ちょっとまて、165 は私で別人ですよ。
169168
垢版 |
2015/01/17(土) 20:58:25.28ID:654N0mRZ
私のほうは、結局マイナーモードを使うにしろ使わないにしろ、keyboard-quit のタイミングを知るには post-command-hook に任意の hook をかけるしかないな、との考えに至りました。

なので、マイナーモードを使用し、それに入るタイミングと出るタイミングで add-hook と remove-hook をおこなうよう設定する予定です。
170166
垢版 |
2015/01/19(月) 06:23:29.23ID:q+OlVYly
>>167
>>168

混乱させてすいません。。
asiiで書けと書いてありました。
2015/01/19(月) 13:52:05.04ID:9dIDW3L4
>>170
s/asii/ascii/

ascii がどうとかはきっと本質的な問題じゃないよ。
基本的なことが理解できてない感じがするけど、
理解しようとする意欲が感じられない。0 点。
172デフォルトの名無しさん
垢版 |
2015/01/19(月) 14:00:29.29ID:KroxEeJe
釣り質問としては85点くらい
173168
垢版 |
2015/01/20(火) 12:57:47.26ID:TBaNt/xg
>>159
これ、unwind-protect でできるんですね。
2015/01/20(火) 20:54:08.37ID:boIocfqk
(condition-case err
(keyboard-quit)
(quit
(message "My Quit! %s" err)))

(condition-case err
(keyboard-quit)
(error
(message "Not Quit")))
2015/01/21(水) 07:37:45.06ID:ydgtfCH8
アッシー
2015/01/23(金) 00:28:52.51ID:A+ui+mzv
symbolp()は'symと:symの両方tを返すけど
:symこれのみ真を返す述語あったっけ?
2015/01/23(金) 00:38:40.51ID:KyQRIuOJ
keywordp
178デフォルトの名無しさん
垢版 |
2015/01/23(金) 02:16:59.21ID:+QZK+ImI
>>176
keywordp
2015/01/23(金) 13:03:20.01ID:A+ui+mzv
>>177,178
キーワードか
プロパティでさがしてた、ありがと
180デフォルトの名無しさん
垢版 |
2015/01/24(土) 13:37:32.69ID:rWwk77U6
どういたしまして
181デフォルトの名無しさん
垢版 |
2015/03/02(月) 23:35:21.61ID:b1MuukTF
swift-modeどこかに落ちてませんか?
2015/03/03(火) 00:02:29.53ID:3dr1cPx7
検索したら一瞬で出てくるが
2015/03/17(火) 15:43:40.52ID:oOjriwkf
if とか and って special form だとおもうんだけれど、これ無しの普通の関数のみで条件によって実行するしないを含むようなプログラムって書ける?
haskell みたいに、遅延評価を行えば可能らしいけれど。

聞く場所間違ってたらすまん
2015/03/17(火) 16:21:51.69ID:StR3CX22
>>183
リストとして渡して内部でeval すりゃいいんでないの。
(defun xwhen (pred body)
(when pred (eval body))
2015/03/17(火) 19:52:02.87ID:u03+oswx
特殊形式は無理じゃね
2015/03/18(水) 00:49:30.65ID:smUcV4wp
関数だと引数は全部実行というか評価されてしまうが、
マクロでなんとでもなる
(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とマクロの違いは組み込みかどうかぐらい。
こんな感じで色々制御構文を作ったり、遅延評価のを実装したりもできるが、
あんまり濫用すると自分でもわからなくなってくる諸刃の剣

長文御免
187183
垢版 |
2015/03/18(水) 01:01:43.13ID:nZSu0bqF
>>184
when は確かに special form ではなく、マクロなのですが、内部では cond を使っていて、私の望むものではありませんでした。条件があいまいで済みませんでした。

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

>御二方
理解が深まりました。
ありがとうございます。
2015/03/18(水) 01:09:21.60ID:dNB2wbku
special form を使わずに if 実装って elisp では可能なんだろか…
macro 使ったとしても結局 if 的なことするためには置き換え先で special form 使うことになるよね。
189183
垢版 |
2015/03/18(水) 01:19:26.33ID:nZSu0bqF
ID 変わってるかもですが 183 です。

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

私は主に 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 をたくさん作るよりはマクロで構文糖衣するということで、これも面白いです。
190183
垢版 |
2015/03/18(水) 01:50:01.10ID:nZSu0bqF
>>188
そうそう。それです。教えていただいた結果、私の疑問もそれになりました。

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 を自作できることになるんですかねぇ。
ちょっと自信が無いですが。
191183
垢版 |
2015/03/18(水) 02:28:36.05ID:nZSu0bqF
(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 が必要になるかもしれませんが、
概念的には単なる写像というか単純なマッピング関数なのでありなのかなぁ。

チラ裏になってしまい申し訳ない。
2015/03/18(水) 03:39:54.16ID:smUcV4wp
symbol-property-listでの力技を作ってしまおうかと思ったら先を越されてた。

>>189
もとの疑問を離れてその目的ならということだけど、
単純にその重い処理を関数として渡してしまうのがいいのでは。
よく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++のプロプロセッサだと動的に条件を変えたくなったら困らない?
デバッグオプション付きで走らせた時だけトレースが欲しいとかもできなく
なっちゃうし。
あとちょっと複雑なことやろうとすると急速に黒魔術化するイメージがある。
2015/03/18(水) 07:20:53.23ID:dNB2wbku
>>191
はーなるほど。assq で判定させるとは考えつかなかった。
おもしろいねえこれ。
2015/03/18(水) 07:23:49.75ID:dNB2wbku
最低限組み込みで実装しなきゃいけない部分はどこまでで
あとはその組み合わせで自己記述可能になるとかは lisp の教科書読めばわかるのかな。
2015/03/18(水) 11:07:05.14ID:mAuMOca0
純Lisp(pure Lisp)ってのだとcond使わざるを得なくなるから特殊形式は使わざるを得ないんじゃないかな
196183
垢版 |
2015/03/18(水) 12:55:18.82ID:nZSu0bqF
>>192
もし、面倒でなければ「symbol-property-listでの力技」っていうのも見てみたいです。

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

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

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

C++ の lambda も上手く例が作れれば後程。
197183
垢版 |
2015/03/18(水) 12:56:45.43ID:nZSu0bqF
>>193
あんまり 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


>>195
lisp は関数指向でも書けるけれど、そもそもマルチパラダイムなのが、
その規定の時点から現れているように思えます。
最小要素とするのに、macro による制御構造の書換えと
一箇所で特殊な振舞いをするという cond どっちが最小かと言えば cond のが小さそうです。
2015/03/19(木) 10:18:55.55ID:KVeBWceY
>>196
力技というほどのものでもなかった
(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とか読むと楽しいかもしれない。
2015/03/19(木) 10:42:33.11ID:QynmxxEd
>>198
なるほど、こっちはプロパティを写像に使うのか
いろいろ考えつくもんだなぁ
200183
垢版 |
2015/03/20(金) 03:19:22.81ID:x0oqiRHZ
>>198 ありがとうございます。取り急ぎお礼を申し上げ乙。
2015/05/26(火) 11:33:21.52ID:dBigamDw
setqと同等の機能を実現する関数は定義できますか
2015/05/26(火) 13:54:08.02ID:M2tYWf9M
set と マクロ使えばできるんじゃない
203デフォルトの名無しさん
垢版 |
2015/08/29(土) 07:44:55.47ID:vrZb3qx4
なんかネタないの?
2015/08/29(土) 11:38:36.28ID:cVkBtg3P
ついに俺のチンコが黒光りしてきた話はどうだ?
205デフォルトの名無しさん
垢版 |
2015/08/29(土) 13:38:04.80ID:vrZb3qx4
>>204
却下
2015/08/30(日) 05:58:46.12ID:dCMQNVLK
>>204
どうやったら黒光りするの?
2015/08/30(日) 06:03:17.10ID:CnOlY9Pq
図書館で毎日ナンパして地下食堂のトイレでマン汁まみれで腰動かすんだよぉ
208デフォルトの名無しさん
垢版 |
2015/10/10(土) 12:55:20.49ID:yXubKPZg
なんか話題ないの?
2015/10/12(月) 15:20:18.76ID:pxYHqVTj
API対応した2chリーダ誰か作んないかな?
2015/10/31(土) 20:36:12.30ID:YZFloUqY
ない
2015/11/01(日) 00:32:17.94ID:seZhoDUW
>>209
作ろっか?
212デフォルトの名無しさん
垢版 |
2015/11/15(日) 09:25:10.66ID:Bf2qkjUe
>>211
おねがいします
213デフォルトの名無しさん
垢版 |
2015/11/19(木) 21:57:45.42ID:NWoSZj2q
>>212
よしわかった
2016/03/05(土) 00:21:51.81ID:KaW6Box3
>>213
いえーい
2016/04/18(月) 00:14:54.95ID:rfz/B1KY
いーまっくすはじめようとしたらしょしんしゃはこれやっとけのところでえらーになったのでもうねます
216デフォルトの名無しさん
垢版 |
2016/09/10(土) 01:53:11.20ID:LstVZLgo
初心者です
以下の文を電話で伝える場合、どのように話せばよいか教えて下さい。

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

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

みたいな感じでお願いしまつ
217デフォルトの名無しさん
垢版 |
2016/09/10(土) 01:56:10.66ID:LstVZLgo
すみません。前の質問の補足ですが、なんで電話で伝えるかなのですが、
有料サポートで、おぺれーたーのお姉さまから、エラーのでる行を読み上げて下さいと言われたのですが、答えられない事があって、こんどこそ上手く説明しようとおもっています。
2016/09/10(土) 08:51:21.97ID:Jm2YrF8N
全部一文字ずつ読みあげれ
電話で済むことをいちいち不便な掲示板使うな
1分3000円とかかかるなら別だが
2016/09/10(土) 08:59:54.80ID:SMvnZvc1
電話サポートとかぼったくり以外の何物でもないんじゃ…
そもそもエラーの出る行が問題とは限らないし普通はメールかチャットでしょう
220デフォルトの名無しさん
垢版 |
2016/09/25(日) 01:38:58.62ID:3wxXNG/W
windows機しか持ってなくて、今までCygwinについてくるvi使ってたんだけど、emacsを使ってみてるんですけど、ターミナル上でemacs使おうと思ったらいちいち-nwオプション付けないといけないんですか?それともみんなターミナルとは別ウィンドウで使ってるんですか?
2016/09/25(日) 02:22:35.97ID:sCxOb1W2
>>220
そんなの人それぞれ。
-nw付けるのが面倒なら、aliasすればいい
2016/09/25(日) 05:04:32.10ID:16slqqIx
>>220
cygwinで-nw付けないで実行するならWindows上にX11サーバ立てないと
ntemacsとかならWindowsのUI上で実行されるよ。
2016/11/24(木) 22:34:59.53ID:blWHS/2X
>>217
elispで有料サポートしてる日本語窓口に興味ある
アレグロとかならまだわかるけど
>>219
普通はコードの内容の確認までするの?
2016/11/25(金) 15:26:09.57ID:NaD61Q6Y
確か大学生を鴨にしてる有料サポートがあった気がする
普通に指導員(大学院生のバイト)に聞いた方が早いし無料だし正確じゃんと思った覚えがある
2016/12/24(土) 02:23:20.52ID:MPulp/OB
Emacsは衰退しました
http://qiita.com/itckw/items/ff079c7572d6a1acd349
2016/12/24(土) 13:17:00.38ID:p4lqfCaM
マルチ乙
2017/12/01(金) 18:24:03.28ID:bCsj1eZc
今年もクリスマスイブに書き込みあるかな?
228デフォルトの名無しさん
垢版 |
2018/01/17(水) 14:02:46.62ID:k+xp7qjU
10年以上前のものなんですが、seimei.el というfjに流れていたelispを探しています。
どこかに残ってないでしょうか?
ご存知の方いらしたら教えて下さい
2018/01/18(木) 00:03:27.86ID:XNRvPuZu
JGをキーワードに検索した
http://www.ring.gr.jp/pub/linux/Plamo/Plamo-3.0/plamo/jg1/seimei.tgz
emacs25.3でも動いた、懐かしいな
なによりplamoって現役なのにびっくり
2018/01/18(木) 10:48:17.98ID:OQasshBO
>>229
サンキュー!ありがとう!!
231デフォルトの名無しさん
垢版 |
2018/02/18(日) 07:19:36.63ID:9uxjLLGw
load-historyにFILE-NAMEがnilのエントリーがあるかも、とヘルプにあるんですけど、そのエントリーがどのタイミングでどこから書き込まれてるか教えてください(eval-regionのブレークポイントつけても引っ掛からなかったです)。お願いします
232デフォルトの名無しさん
垢版 |
2018/02/18(日) 23:14:43.83ID:nDa4ZZlt
>>228-230
過疎スレなのになんか気持ち悪いな。。。
バーカ
233デフォルトの名無しさん
垢版 |
2018/02/19(月) 05:58:48.07ID:8lFyLir4
>>231
よく知らないが、リファレンスマニュアルを見た限りではそこは eval-region じゃないんじゃ……という気がする。
"emacs-lisp" "load-history"
でググったらそれらしいのが出てきたよ。
234デフォルトの名無しさん
垢版 |
2018/02/19(月) 12:06:58.79ID:IAYRjFJ3
>>233
ありがとうございますマニュアル見直してみたらeval-bufferかもしれないです。もう1回やってみます
235デフォルトの名無しさん
垢版 |
2018/02/19(月) 17:50:11.40ID:dLVrNTbV
>>234
15年前の情報ですが
http://lists.chise.org/pipermail/apel-ja/2002-July/001659.html
236デフォルトの名無しさん
垢版 |
2018/05/23(水) 20:23:27.26ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

147M7
237デフォルトの名無しさん
垢版 |
2018/07/05(木) 01:22:22.58ID:RfoszcD2
IEE
238デフォルトの名無しさん
垢版 |
2018/11/22(木) 15:42:31.66ID:r/GLumvr
elispと若干違うけどスレがないので質問させてください
C-x C-hとやるとC-xから始まるコマンド一覧はでるのですが
モードごとのコマンド一覧を出すコマンドもあったと思うのですが何だか分かる方いますか
ruby-modeを入れたのですがどんなコマンドがあるのか調べたいです
2018/11/22(木) 16:45:53.83ID:vHHfqSHt
C-h b
あと、メニューバーを見れば基本的なキーバインドは確認できる
消してる場合は C-右クリ
2018/11/22(木) 17:29:44.31ID:r/GLumvr
>>239 ありがとうございました
241デフォルトの名無しさん
垢版 |
2019/03/21(木) 00:07:03.75ID:BVBXqX32
emacs 24.5.1を使用しています。
ttp://www.miura-takeshi.com/etc/genkou.el
上記のプラグインを使用してバッファの文字列を原稿用紙換算したいのですが、
モードラインへの表示ができません。
文字列のカウント処理は問題なく動作しているので、下記のモードライン更新処理の
記述に問題があるようなのですが、何が悪いか分かる方いらっしゃいませんでしょうか?

(defun genkou-mode-line ()
"モードラインを書き換える"
(let ((tmp-list))
(setq genkou-mode-line-string
(format "--%d枚%d行" genkou-page-num genkou-line-num))
(make-local-variable 'mode-line-format)
(setq tmp-list (copy-sequence default-mode-line-format))
(setq mode-line-format
(append
(delete "-%-" tmp-list)
(append (list genkou-mode-line-string) (member "-%-" default-mode-line-format))))
(force-mode-line-update)))
242デフォルトの名無しさん
垢版 |
2019/11/17(日) 22:43:13.52ID:rHCPJv2k
https://masatoi.github.io/2017/05/11/hy-tutorial
M-x hy-mode
-> hy-font-lock--kwd->comint-kwd: Invalid function: ((matcher . match-highlights) kwd)
2019/12/15(日) 00:19:45.52ID:YAW0GHgK
サクラエディタの代わりにLinux上で簡易なテキストの正規表現やコピべマンとして
ボリュームがvi以上vscode未満ということでEmacs採用したけどまともに使うまでにでもマゾ過ぎないかこれ
2019/12/15(日) 02:28:29.07ID:qZlo5BGy
Emacsってのは、すみずみまでいじり回して遊びたい人のための、組み立てキットみたいなものなんだよ。
改造しやすいってのが最大の売りで、各自で好みに合うように作り変えるのが大前提。
素のままでも一応は使えるけど、そんなに便利には作られてない。

魔改造とかする気がないなら、他に適したエディタがあると思う。
2019/12/15(日) 10:46:01.17ID:S9GzmkuV
wine使ってサクラエディタが動くから試してみたら?
Emacsは何かの代わりに使おうとすると、操作体系が違い過ぎて挫折する
246デフォルトの名無しさん
垢版 |
2020/02/25(火) 21:01:07.43ID:nMAvGdtS
2つ質問します。

1. 選択範囲を削除するけれど、kill-ringに入れないという設定を教えて下さい。
 kill-ringの一番新しいものをそのままにしておきたいからです

2. yankした際に、yankされたものの末尾にカーソルが飛ぶのですが、
 カーソルが移動しないようにする設定を教えて下さい。

お手数をおかけしますが、お願いします。
2020/02/25(火) 21:13:58.66ID:I3QTYUIA
2 は C-u C-y でOK
2020/02/25(火) 23:07:15.03ID:Z6R/vWss
>246
1は
M-x delete-region
2020/03/02(月) 00:52:27.30ID:8zyc+iZb
ご回答ありがとうございました。大変助かりました。
250デフォルトの名無しさん
垢版 |
2020/03/16(月) 17:02:19.48ID:r6kvZN2B
シェルスクリプトからemacs ―batch で処理した結果をprintすると
\\. \\. \\“
みたいの沢山でてくる
エスケープなしで表示された通りの文字列を得るにはどうすれば良いのでしょう
251デフォルトの名無しさん
垢版 |
2020/03/16(月) 17:29:13.93ID:uq6V7ZgT
>>250
princ
252デフォルトの名無しさん
垢版 |
2020/03/17(火) 01:23:57.66ID:h1pz+/ac
princにすると
\\,

\,
になったのですが
,
にする方法はないのでしょうか
253デフォルトの名無しさん
垢版 |
2020/03/17(火) 02:39:06.56ID:Kot3zOY6
>>252
princ が引数の文字列に含まれていない \ を勝手に印字することはないから、
その「処理」とやらで \ を追加しているのでは
または emacs への入力の時点ですでに \ を含んでいるとか
2020/03/19(木) 22:49:52.53ID:Fc1yZB1g
>>252
読み込む時にreadしてんじゃないか?
255デフォルトの名無しさん
垢版 |
2020/08/26(水) 15:21:01.87ID:L7JtIZFl
Windows の Emacs
日本語入力しようとして
半/全 キー押してしばらくしたら
Emacs ウィンドウ全部落ちた
バグ?
2020/08/26(水) 21:46:47.96ID:WFfMUKrt
おま環
257デフォルトの名無しさん
垢版 |
2020/10/14(水) 10:11:53.97ID:GsUUoEHv
(point) って 4GB 以上のファイルでも安全?
2020/10/16(金) 16:47:48.59ID:w0E7/mRw
わからない
259デフォルトの名無しさん
垢版 |
2020/10/19(月) 12:25:40.39ID:asy7wTux
>>255
windows 10 64bit
emacs 26.3 64bit
また再現した
emacs 以外も含めて(同時起動中のソフト) windows 10 全体の ime が
モードが変になったり勝手に改行されたり狂い始める
このまま使い続けるとそのうち emacs が落ちるんだと思う
task manager から ctfmon.exe を殺したら治ったっぽい
2020/10/27(火) 16:42:12.74ID:yDmA/b17
emacs って 8MB 以上のテキストファイルで警告出るω
最近の大きめの xml とか json とか yaml とか怖くて編集出来ないωωω
2020/10/28(水) 00:47:27.01ID:6sYlouKi
>>260
は?
2020/10/28(水) 10:14:23.93ID:B0xF7HGe
それじゃなにか?きみは「ここから先は18歳以下は閲覧できません」っていう
警告がでたからといって見たいエロ動画も見ずにすごすごと帰る、というそんな腰抜けなのか!
2020/10/28(水) 11:50:59.99ID:Mf8tEr2f
rmsがロリって本当?
264デフォルトの名無しさん
垢版 |
2020/11/08(日) 09:55:05.64ID:w3b7rq0H
Emacs 26.3 (build 1, x86_64-w64-mingw32) of 2019-12-31

漢字キーを押して
「でるた」
で変換始めると
重たくなって
しばらくしたら落ちる
265デフォルトの名無しさん
垢版 |
2020/11/08(日) 09:56:25.01ID:w3b7rq0H

の表示のあとカーソルが消えて重くなる
2021/02/08(月) 16:32:46.35ID:FcZ190S6
日本語入力はもう諦めた
単にコードや英文に記号使いたいならdigraph覚えるのをオススメする
\C-c k D *で対応するギリシア文字凾ンたいな
dならδ、->で→、数学記号も不足なし
あとかなはkaでカナはNaだったり
国際規格があるので覚えとけば汎用性がある
(比べる訳じゃないが少なくともvimでは標準機能)

(global-set-key (kbd "C-c k")
(define-prefix-command 'alistから記号拾ってくる関数 ))

自分用elも転がってたけど網羅的でないかったので、ググって一番に出てくるvimヘルプのテーブルをコピペして整形した

melpaに無いと思い込んでたんだけど、今調べたらevilとかいうevilなのが出てきた、多分名前でスルーしてたわ
2021/02/08(月) 16:39:31.18ID:FcZ190S6
ひらがなかたかなときごうとalphabetのぶんしょうなら、マップがローマ字にゅうりょくとたいおうしているので、いっそdefine-keyしてしまえばじっしつIMEいらずだぞ!
2021/02/08(月) 16:40:43.17ID:FcZ190S6
字はうてなかった、かたておち…
まあ、げんきかくまではみてないのでもしかしたらかんじもあるかも
269デフォルトの名無しさん
垢版 |
2021/10/09(土) 19:32:02.55ID:KRzSwEb7
Bash on windows(Ubuntu)のemacs

Windows 10に
scoop install emacs
した環境

どっちも環境変数homeを見にいくのでciderがどっちかの環境で動いてくれない
2023/01/30(月) 07:49:47.97ID:Va8OFUvh
ただ今制限を設けております
271デフォルトの名無しさん
垢版 |
2023/09/25(月) 16:47:00.13ID:Qn9WiVG4
こっちを再利用してください
272デフォルトの名無しさん
垢版 |
2023/10/13(金) 13:14:55.06ID:1CzMMp9Z
emacs lispでC++のコメントを削除(行コメント//だけを行ごと削除)する方法を教えてください
2023/10/13(金) 14:18:48.79ID:oUGpYLYU
(defun comment-traversal (beg end func)
(save-excursion
(let (spt ept)
(goto-char beg)
(while (and (< (point) end)
(setq spt (comment-search-forward end t)))
(setq ept (progn
(goto-char spt)
(unless (or (comment-forward)
(eobp))
(error "Can't find the comment end"))
(point)))
(funcall func spt ept)))))
2023/10/13(金) 14:19:30.72ID:oUGpYLYU
(defun not-comment-traversal (beg end func)
(save-excursion
(let (spt
(ept (1- (goto-char beg))))
(while (and (< (point) end)
(setq spt (comment-search-forward end t)))
(funcall func (1+ ept) spt)
(setq ept (progn
(goto-char spt)
(unless (or (comment-forward)
(eobp))
(error "Can't find the comment end"))
(point))))
(funcall func ept (min end (1- (point-max)))))))
2023/10/13(金) 14:20:49.82ID:oUGpYLYU
最初のはコメントを抜き出すコード
次のはコメント以外を抜き出すコード
バッファー内のコメントを消していくのは難易度が高い
コメント以外を出力してリダイレクトするのが簡単だろう
↓こんな感じ
(not-comment-traversal (point-min) (point-max)
(lambda (beg end)
(print (buffer-substring beg end))))
ちなみにコメントはEmacsが把握してるので、このコードは言語非依存だ
2023/10/13(金) 14:38:43.09ID:rlk6vHPT
そういうつまらないものはchatgptに作らせればいい
2023/10/13(金) 16:01:32.18ID:oUGpYLYU
Emacs Lispのコードなんてまともに学習できないよw
2023/10/13(金) 16:08:10.43ID:ugq7JLEK
うん、だから、ChatGPTはバカだな
こんなものに時間をそそいでいる人類はバカ
2023/10/13(金) 23:03:38.37ID:9b0YvF5R
そういうのはキーボードマクロが向いている
//をインクリメントサーチして、c-a,c-k,c-k
で名前を付けて登録
登録したマクロを10000000回ぐらい実行すればいい
280デフォルトの名無しさん
垢版 |
2023/10/14(土) 12:49:27.28ID:x03gZ5vc
>>278
ほんそれ
2023/10/15(日) 11:32:10.04ID:HSf5ScFa
ファイルの先頭に移動して
M-x flush-lines
を起動して
^//
を打ち込んだら消せました
2023/10/15(日) 15:15:27.51ID:Z4N/9jbi
hoge(); // コメント
とか
/*
コメント
*/
は消せないじゃん
2023/11/11(土) 20:06:28.30ID:6Uwmj7p8
だからキーボードマクロを使えって

/*をインクリメントサーチ二文字戻って
マーク、*/をインクリメントサーチで探して
kill-region

これをキーボードマクロにして
何なら名前を付けて init.el に登録することもできる
2023/11/11(土) 20:13:40.67ID:6Uwmj7p8
具体的には

c-x(
esc<
c-s/*
c-@
c-s*/
c-w
c-x)

これでマクロ完成。名前を付けるには

M-x name-last-kbd-macro

で好きな名前を付けるだけ

init.el を開いて

M-x insert-kbd-macro

これで登録できる
2023/11/12(日) 01:44:20.85ID:IUEeiAD3
>>283
/* */と//の両方消せないじゃん
2023/11/12(日) 16:34:00.64ID:pFykNXrS
別々に作って二回走査すればいいだけでは?
2023/11/12(日) 19:43:42.90ID:IUEeiAD3
/* // */
は、先に // で消してしまうとおかしな事になるな
まぁ、先に/* */を消せばいいがな
それと、>>284のマクロはコメント1個しか消せないじゃん
全部消さないと
取り敢えずこれらを全部対応させたキーボードマクロを出さないと駄目
2023/11/13(月) 23:08:48.29ID:Y+b0wq04
/* */を排除するマクロを100000回ぐらいやって
次に // を排除するマクロを1000000回ぐらい動かす
気持ち悪いかもしれないが目的は達せられる
2023/11/18(土) 15:57:54.85ID:bNx8n+lD
インクリメントサーチが失敗するまで
無限ループで回すことはできるけどね
290デフォルトの名無しさん
垢版 |
2024/10/02(水) 10:15:18.16ID:XbzwGALZ
Blenderのpython→bpy
EmacsのLisp→elisp
ExcelのVB→VBAω
2024/10/20(日) 10:23:23.92ID:LzrvAVJD
むしろemacs以外の現役lispを知らん
2024/10/30(水) 03:02:36.94ID:BzmMNap8
>>291
cl書いて食ってるんで異議を申し立てたいのは山々だが…まあうん落ち目すぎるね

rmsに信心示すんならならguileすげーぞ
もちelispもサポートしてる
lispyな言語(scheme, elisp, es)である限り、その全てを(適当な変換の後)共通IL通して共通エンジンで動かせる

gccもIL通してサポート多いじゃん!と思うかもしれんが、あれ全ての言語サポートする勢いで風呂敷拡げすぎてっるし、そもそもエンジンがlispyでないのでlisp系の性能は、まあ察してくれ
2024/10/30(水) 03:25:59.58ID:BzmMNap8
そういや5年かそこら前にemacsのelisp処理系を既存のからguile(のelisp)に置き換えるってのやってた記憶あるけど結局ポシャったんかね?
一応おおむね成功はしたとか

まあemacsのelisp処理系も最近コンパイル出来るようになって性能上がったし、置き換える利点も減ったのかな?

とすればgnuで2つelisp処理系作ってる現状の不利は労力の無駄ってくらいか
2025/02/02(日) 07:37:39.53ID:gkY6KzeC
native-compile有効化してもバイトコンパイルの数倍しか速くならないし、Common Lispの10倍くらい遅いんだよな
最近だとCommon Lispで1から作られたLemというエディタがある
2025/02/02(日) 15:53:20.81ID:OcIEQytI
動的型はネイティブコンパイルしても2倍速になるかどうかだな
型推論を実装してからが本番だ
296デフォルトの名無しさん
垢版 |
2025/10/12(日) 06:12:52.53ID:W2SaGlg4
>>294
clは色々実装次第だけどsbclとか速いヤツは、恐ろしいことに稀によくcより速かったりするからな…
もちろん関数、あるいはグローバル(非推奨!)に
(declare (optimize (speed 3) (space 0) (safety 0)))
とか最適化宣言してるときね

そうそしてもちろん型宣言も同じくらい大事ね>>295、clなら(type fixnum numarg1)とかか

elにもcl-libにこの辺cl-declareとかの名で全部あるけど、ちょっとベンチはしてない
まあ果たして現在のelの仕組み的に恩恵あるかは微妙に思います、はい
297デフォルトの名無しさん
垢版 |
2025/10/12(日) 06:15:18.22ID:W2SaGlg4
ああごめん型推論、すなわちよしなに(type fixnum numarg1)とか宣言補ってくれるということね
もちろんそれはあって欲しいね、コードは今まで通り書いていいしユーザーに負担が無いのだから
298デフォルトの名無しさん
垢版 |
2025/10/13(月) 07:56:47.78ID:jcovVfcE
>>294
へぇー最近もあるのか…

CLの歴史あるエディタの代表といえば1980-のHemlockだね
emacs-likeというかほぼほぼemacsのCL版だけど、なんなら今のスレ民が大体使ってるであろう1984-のGNU emacsより歴史がある
主にCMU CLの配布に同梱されててなかなかいいemacs
299デフォルトの名無しさん
垢版 |
2025/10/13(月) 08:05:49.85ID:jcovVfcE
ああごめんここemacsスレじゃなくてelispスレだからスレチだったわ
300デフォルトの名無しさん
垢版 |
2025/10/16(木) 01:18:12.54ID:BKqCsKPx
>>296
elispではいまのところ(ほぼ)無意味っぽいね

Most of the Common Lisp declarations are not currently useful in Emacs Lisp. For example, the byte-code system provides little opportunity to benefit from type information. A few declarations are meaningful when byte compiler optimizations are enabled, as they are by default. Otherwise these declarations will effectively be ignored.

https://www.gnu.org/software/emacs/manual/html_node/cl/Declarations.html

まあ型宣言のご利益はなくても、(読みにくくならぬ程度の)適切な型宣言は読み手へのアノテーションにもなるから推奨したい
301デフォルトの名無しさん
垢版 |
2025/10/17(金) 01:25:53.83ID:D1Ebmx1L
>>298
HemlockはGNU Emacs/Xemacsより(それまでの)emacsに近いんだよな

多分まだ一番古い資料が残ってるlisp系Emacsはelispの直接祖先であるMacLisp(1966)のエディタだろう
コンピュータ史系のサイト読めるMacLispのマニュアル類にはエディタのキーバインドまで記されている
当然ながらemacs風キーバインドで、この頃には今に繋がるlisp系emacs(非TECO系)確立されてた
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況