Emacs Lisp

このエントリーをはてなブックマークに追加
726701
>>724
> 繰り返しは再帰で書けということでつか?

違う。繰り返しを書くときは、まず mapcar, find-if などの高階関数で書け
るかどうかを検討する。書けなければ dolist, dotimes などを使う。それで
も書けなければ、while, loop, 再帰を使う。

高階関数についてはこのへんを参照。
http://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup/rakup13.html

> 名有り関数の定義なしでシンプルに再帰を書く方法があれば...

Scheme の named let が便利。
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#tips

(require 'cl)

(defmacro nlet (tag var-vals &rest body)
`(labels ((,tag ,(mapcar #'car var-vals) ,@body))
(,tag ,@(mapcar #'cadr var-vals))))

(defun fact (n)
(nlet loop ((n n) (r 1))
(if (<= n 1) r
(loop (1- n) (* n r)))))