Basic Werk | Blog | Contact


MEMOMEM

Scheme_nth_of




;; 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





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





Gauche_sqlite3_dbd_install_MacOSX



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





Scheme_Let_Over_Lambda



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





Scheme_define-syntax



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