つい最近まで知りませんでした… Schemeを使っている方には「letで末尾再帰するときのアレをEmacsでも使えるようにする」というので通じるとは思うのですが… 総和っぽいのを求める関数を定義してみましょう。 (defun sum-rec (n &optional sum) (if (<= 0 n) (sum-rec (1- n) (+ n (or sum 0))) sum)) (sum-rec 100) ;=> 5050 アルゴリズムも使い方もめちゃ簡単なのですが、この実装には問題があります。 Lispに限らずよくあるプログラミング言語には、関数呼び出しの「深さ」と、その上限という概念があります。関数呼び出しをして、呼び出された関数から関数を呼ぶと深さは1追加され、その関数が実行終了すると深さは1減ります。 なぜこの呼び出しの深さという数が大事なのかというと、一般的なプログラムでは繰り

☆ consult.el の非同期コマンドの仕組み このエントリはEmacsのAdvent Calendar2022の9日目用です。 以前の記事「はてなブックマーク用のconsultコマンドを作っている」で書いた consult-hatena-bookmark を改良するにあたり、今年夏から秋にかけて、(自分としては)かなり consult.el のコードを読みました。 そのコードリーディングの中で、consult.el が非同期な候補の読み込みをどうやっているのか、だいぶわかったのでご紹介します。 公式で非同期で読んでいる consult コマンドのまねをしたい 公式で用意されている consult コマンドの中で、候補を非同期で読んでいるタイプのものは次などがあります。 consult-grep consult-ripgrep consult-man consult-find コマン

概要 基本的にEmacs Lisp (または、Lisp 自体)をあまり知らない方向けです。Emacs Lisp でどんなコードが書けるのかを知って、興味を持ってもらえればと書きました。 さて、Lisp はマクロで構文を拡張出来る事が特徴ですが、もちろんEmacs Lisp も例外ではなく、フィボナッチ関数を色々な書き方で実装する事が出来ます。 今回は、それ以外にも、ジェネレータ版、遅延評価版、果てはスタックマシーンのコードを直接記述する方法まで、取り揃えました。 (それぞれの関数は、簡単の為、引数に負の値が指定されない事を前提にしています。) 内訳は以下の通りです。 再帰呼び出し系 fib-tail-recursion fib-double-recursion ループ系 (マクロを展開すると結局は同じ様なコードになるけど、色々な書き方が出来る) fib-while fib-dotim

1リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く