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
Gauche のお勉強メモ。文字列処理。
整理しながらなんで全然まとまりないし改善の余地ありありですが。
;; カレントディレクトリを glob して
;; 末尾が .html のファイル名だけを取る
(filter #/\.html$/ (glob "*"))
;; 逆に .html を省く
(remove #/\.html$/ (glob "*"))
;; Perl でいうところの、
;; open my $in, "<", "file_name";
(define in (open-input-file "file_name"))
;; 1行ずつ読み込み
(read-line in)
;; Perl でいうところの、
;; close $in;
(close-input-port in)
;; ファイルの中身を丸っと読み込み
(define str
(call-with-input-file "file_name" port->string))
;; ファイルの中身を行単位でリストにして読み込み
(define lst
(call-with-input-file "file_name" port->string-list))
;; カレントディレクトリにあるファイル名のリスト
(define files (glob "*"))
;; ファイルの内容のリスト
(define values
(map
(lambda (file)
(call-with-input-file file port->string))
files))
;; files と values を組み合わせた alist
(define alist
(map
(lambda (f v)
(cons f v))
files values))
;; いやいや、まとめてやりましょう。
(define alist
(map
(lambda (file)
(cons
file
(call-with-input-file file port->string)))
(glob "*")))
;; ファイルの内容に特定の文字列を含むファイル名
(map
(lambda (lst)
(and (rxmatch #/bla bla bla/i (cdr lst))
(car lst)))
alist)
;; 但し、結果はこんな風に表示されてしまうので
;; -> ("foo.html" "bar.txt" #f #f)
;; マッチしなかった場合は結果から除く
(remove
(lambda (result)
(eq? result #f))
(map
(lambda (lst)
(and (rxmatch #/bla bla bla/i (cdr lst))
(car lst)))
alist))
;; -> ("foo.html" "bar.txt")
参考:
Scheme:テキスト処理
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme:テキスト処理
#Gauche #Scheme #Lisp #IO #Regex #Shell
SN 2013/06/30 00:59:19
Archives > Gauche_text_filter.html