Scheme の iota を Common Lisp でなるだけシンプルに書きなおしてみようと思って、まずは引数に max だけを取るバージョンを書いてみた。
(defun iota (max)
(labels ((iota-iter (n)
(if (<= n 0)
'()
(cons n (iota-iter (1- n))))))
(reverse (iota-iter max))))
(iota 10)
;; -> (1 2 3 4 5 6 7 8 9 10)
参考:
SRFI-1のiotaっぽいものをCommon Lispで書き直してみた(その2) - 新・日々録 by TRASH BOX@Eel
http://d.hatena.ne.jp/eel3/20090307/1236401934
#CommonLisp #Lisp #Scheme #iota
SN 2013/07/22 16:08:41
Archives > CommonLisp_simple_iota.html
;; 関数ブロック内でローカルな変数を使いたい。
;; 変数同士が独立しているなら let
[1]> (let ((a 1) (b 2))
(+ a b))
3
;; 変数同士がお互いを参照し合うなら let*
[2]> (let* ((a 1)
(b (+ a 1)))
(+ a b))
3
;; 関数ブロック内でローカルな関数を使いたい。
;; 関数同士が独立しているなら flet
[3]> (flet ((f (n)
(+ n 10))
(g (n)
(+ n 5)))
(f (g 6)))
21
;; 関数同士がお互いを参照しているなら labels
[4]> (labels ((f (n)
(+ n 10))
(g (n)
(+ 5 (f n))))
(g 6))
21
;; 再帰関数をブロック内で定義するときも labels
[5]> (labels ((iota-iter (n)
(if (<= n 0)
'()
(cons n (iota-iter (1- n)))))) ;; 自分自身を呼び出している(再帰)
(reverse (iota-iter 10)))
(1 2 3 4 5 6 7 8 9 10)
参考:
Land of Lisp
#CommonLisp #Lisp #let #let* #flet #labels #CLISP #iota
SN 2013/07/21 22:37:41
Archives > CommonLisp_study_01.html