Basic Werk | Blog | Contact


MEMOMEM

CommonLisp_simple_iota



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





CommonLisp_study_01




;; 関数ブロック内でローカルな変数を使いたい。 ;; 変数同士が独立しているなら 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