;; 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
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
define-syntax 構文を使ったマクロの生成で、syntax-rules 直後のリストにはマクロ内で使用する識別子を指定する。
また、パターン内ではマクロの名前を _ で置換できる。
;; new-if
(define-syntax new-if
(syntax-rules (then else)
((_ predi then consq else altna)
(if predi consq altna))
((_ predi then consq)
(if predi consq #f))
((_ predi else altna)
(if predi #f altna))))
gosh> (new-if (number? 0) then "Num" else "Not Num")
"Num"
gosh> (new-if (number? 0) then "Num")
"Num"
gosh> (new-if (number? "aaa") then "Num")
#f
gosh> (new-if (number? "aaa") else "Not Num")
"Not Num"
gosh> (new-if (number? 0) else "Not Num")
#f
マクロ内で使用する識別子がない場合、syntax-rules の後は空リストでOK。
;; nand
(define-syntax nand
(syntax-rules ()
((_) #f)
((_ a b) (not (and a b)))))
gosh> (nand #t #t)
#f
gosh> (nand #t #f)
#t
参考:
素数夜曲: 女王陛下のLISP
P.453~
#Scheme #Gauche #Lisp #Macro #define-syntax
SN 2013/07/12 23:45:02
Archives > Scheme_define-syntax.html
© 2008-2013 Basic Werk