;; key が lst の何番目 (nth) の要素かを返す関数
;; 先頭が 0 番目
(define (nth-of key lst)
(let f ((nth 0)
(l lst))
(cond ((null? l) #f)
((equal? key (car l)) nth)
(else (f (+ nth 1) (cdr l))))))
(nth-of 'code '(code name sort))
;; -> 0
(nth-of 'name '(code name sort))
;; -> 1
(nth-of 'price '(code name sort))
;; -> #f
#Scheme #Lisp #nth #named-let #Gauche
SN 2013/07/22 19:33:20
Archives > Scheme_nth_of.html
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
性格的に Scheme よりも Common Lisp の方が向いてるということが、ここ数日で分かった。
Scheme はその単純さから、基礎を勉強するには本当に役に立った。
すべてがリストであって、quote されていないリストにおいては、先頭の要素が手続きになる。
この至ってシンプルな大原則だけど、他の命令型言語でプログラミングを覚えてしまった者にはシンプルすぎるが故になかなか馴染めないルール。
これを徹底的に身体で覚えるには、特殊形式の多い Common Lisp よりも Scheme の方が適している。
ただ、Scheme は、なんていうか・・・キレイすぎる(と、個人的には思った)。
目の前のやるべきことを、汚くともまずはできるようにする(片付けると言ってもよい)には、Common Lisp の方が仕事が早い。
それに僕のずぼらな性格からしても、性に合ってる気がする。
#Lisp #memo
SN 2013/07/20 23:51:37
Archives > 20130720_memo.html
Mac OS X (Mountain Lion) 環境で Gauche の SQLite3 ドライバーを入れる所でちょっとつまずいているのでメモ。
まずもって、 GitHub の mhayashi1120/Gauche-dbd-sqlite3 から、武蔵の日記さんのこちらの記事のやり方で試してみても、make の段階でエラーが出てしまい断念(勉強せいって話なんですが・・・)。
なので、こちらから gauche-dbd.sqlite3.080412b.tar.gz をダウンロードして gauche-package install で入れてみました。ここでもちょっとコツがあった。
# gauche-dbd.sqlite3.080412b.tar.gz を
# ダウンロードしたディレクトリに移動した上で
# リネーム
$ mv gauche-dbd.sqlite3.080412b.tar.gz gauche-dbd.sqlite3.tar.gz
# リネーム済みの圧縮ファイルを指定する形で install
$ sudo gauche-package install gauche-dbd.sqlite3.tar.gz
これで SQLite3 ドライバーのインストール自体はうまく行きました。
ただ、プログラミングGauche のP.368 前後に載ってる relation-accessor などは、SQLite には通用しないようで、発行した SELECT 文の各要素(カラムのデータ)にアクセスするには、dbi-get-value を使って番号でカラムのデータを取得するようです(ちょっと不便・・・)。
(use dbi)
(use util.match)
(use util.relation)
(use gauche.sequence)
(use gauche.parameter)
(define *db-name* "dbi:sqlite3:./schedule.db")
(define db (make-parameter #f))
;; ・・・
;; メモのため抜粋。いろいろ省略
(define (list-sch)
(let* ((result (dbi-do (db) "SELECT day, plan FROM plans"))
;; (getter (relation-accessor result)) ;; この子が動いてくれない
(plan-list (map
(lambda (row) (cons (dbi-get-value row 0) ;; "day"
(dbi-get-value row 1))) ;; "plan"
result)))
(for-each
(lambda (p)
(sch-print (car p) (cdr p)))
plan-list)))
また時間見つけてもうちょっと調べてみる。
#Gauche #MacOSX #SQLite #dbd #dbi #relation-accessor #dbi-get-value #Scheme #Lisp
SN 2013/07/17 19:18:23
Archives > Gauche_sqlite3_dbd_install_MacOSX.html
let の中に閉じ込めた lambda は、let で宣言した変数の値を保持している。
つまり "Let Over Lambda" は Closure を生成する。
また、Closure を更に lambda で包むと Closure Generator を定義できる。
;; Counter (Closure)
(define cnt
(let ((n 0))
(lambda () (set! n (+ n 1)))))
;; Generator
(define cnt-generator
(lambda ()
(let ((n 0))
(lambda () (set! n (+ n 1))))))
gosh> (cnt)
1
gosh> (cnt)
2
gosh> (cnt)
3
gosh> (define cnt1 (cnt-generator))
cnt1
gosh> (define cnt2 (cnt-generator))
cnt2
gosh> (cnt1)
1
gosh> (cnt2)
1
gosh> (cnt1)
2
gosh> (cnt1)
3
gosh> (cnt2)
2
参考:
素数夜曲: 女王陛下のLISP
P.439~
#Scheme #Lisp #Gauche #Closure #Generator
SN 2013/07/12 23:47:36
Archives > Scheme_Let_Over_Lambda.html
© 2008-2013 Basic Werk