Common Lisp でリストの末尾に追加するマクロ
(defmacro push-2-tail (lat x)
`(setf ,lat (append ,lat (list ,x))))
(defvar *db* '((a b c) (d e f)))
(push-2-tail *db* '(g h i))
*db*
;; -> ((a b c) (d e f) (g h i))
;; なぜなら (push-2-tail *db* '(g h i)) は
;; こう展開される(こう書いたのと同じだ)から
;; (setf *db* (append *db* (list '(g h i))))
#CommonLisp #defmacro #push
SN 2013/08/01 00:41:18
Archives > CommonLisp_defmacro_test_01.html
Common Lisp の正規表現パッケージ CL-PPCRE を使ってみた。
処理系は CLISP
;; quicklisp で "ppcre" を検索
> (ql:system-apropos "ppcre")
#<SYSTEM arnesi+.cl-ppcre-extras / arnesi+-20120909-darcs / quicklisp 2013-04-20>
#<SYSTEM arnesi.cl-ppcre-extras / arnesi-20101006-darcs / quicklisp 2013-04-20>
#<SYSTEM cl-ppcre / cl-ppcre-2.0.4 / quicklisp 2013-04-20>
#<SYSTEM cl-ppcre-template / cl-unification-20130128-cvs / quicklisp 2013-04-20>
#<SYSTEM cl-ppcre-test / cl-ppcre-2.0.4 / quicklisp 2013-04-20>
#<SYSTEM cl-ppcre-unicode / cl-ppcre-2.0.4 / quicklisp 2013-04-20>
#<SYSTEM optima.ppcre / optima-20130420-git / quicklisp 2013-04-20>
#<SYSTEM parser-combinators-cl-ppcre / cl-parser-combinators-20121125-git / quicklisp 2013-04-20>
;; CL-PPCRE を load
> (ql:quickload :cl-ppcre)
To load "cl-ppcre":
Load 1 ASDF system:
cl-ppcre
; Loading "cl-ppcre"
(:CL-PPCRE)
;; Sample 文字列
> (defvar user-agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.28 (KHTML, like Gecko) Chrome/12.0.728.0 Safari/534.28")
;; マッチした部分文字列
> (ppcre:scan-to-strings "M\\S+" user-agent)
"Mozilla/5.0" ;
;; グローバルマッチ
> (ppcre:all-matches-as-strings "M\\S+" user-agent)
("Mozilla/5.0" "Macintosh;" "Mac" "ML,")
;; こんな関数を作っておくと直感的?
(defun m/re/g (re str)
(ppcre:all-matches-as-strings re str))
> (m/re/g "\\d+" user-agent)
("5" "0" "10" "6" "6" "534" "28" "12" "0" "728" "0" "534" "28")
まだまだこれから調べる
参考サイト:
CL-PPCRE - Portable Perl-compatible regular expressions for Common Lisp
第4回 Common Lispライブラリガイド
第2回 Quicklispによるライブラリ環境
#CommonLisp #Lisp #regex #CL-PPCRE #Quicklisp #CLISP
SN 2013/07/20 22:55:01
Archives > CommonLisp_CL-PPCRE_01.html
$ /usr/bin/llvm-gcc-4.2 -std=gnu99 '-L/opt/local/lib/gauche-0.9/0.9.3.3/x86_64-apple-darwin12.2.0' '-L/opt/local/lib' -bundle -flat_namespace -undefined suppress -o dbd_sqlite3.so 'dbd_sqlite3.o' 'dbd_sqlite3lib.o' -lgauche-0.9 -lm -lpthread -lsqlite3
duplicate symbol _Sqlite3StmtClass in:
dbd_sqlite3.o
dbd_sqlite3lib.o
duplicate symbol _Sqlite3DbClass in:
dbd_sqlite3.o
dbd_sqlite3lib.o
ld: 2 duplicate symbols for architecture x86_64
collect2: ld returned 1 exit status
#Error
SN 2013/07/19 08:28:46
Archives > 20130719_gauche_dbd_sqlite3_install_error_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
Gauche の勉強メモ
ポール・グレアムさん著 On Lisp の flatten を Scheme で素直に書きなおしてみる。
;; flatten, On Lisp に載ってる Common Lisp Version
(defun flatten (x)
(labels ((rec (x acc)
(cond ((null x) acc)
((atom x) (cons x acc))
(t (rec (car x) (rec (cdr x) acc))))))
(rec x nil)))
(flatten ‘(a (b c) d (e f)))
;; -> (a b c d e f)
は、Gauche では、下記のように書ける。
(atom? はデフォルトで定義されてないので、関数が一個増えちゃうけど)
(define (atom? obj)
(and (not (pair? obj)) (not (null? obj))))
(define (flatten x)
(define (rec x acc)
(cond ((null? x) acc)
((atom? x) (cons x acc))
(else (rec (car x) (rec (cdr x) acc)))))
(rec x '()))
もう一つのバージョンとして、
;; flatten を letrec で書きなおしてみた
(define (flatten x)
(letrec ((rec (lambda (a acc)
(cond ((null? a) acc)
((atom? a) (cons a acc))
(else (rec (car a) (rec (cdr a) acc)))))))
(rec x '())))
そして、素数夜曲: 女王陛下のLISP を読んでいたら、append とlist を使った実にスマートなバージョンが載っていた。(末尾再帰ではないが、やっていることが単純明快である。)
(define (flatten lst)
(cond ((null? lst) '())
((pair? lst)
(append (flatten (car lst)) (flatten (cdr lst))))
(else (list lst))))
#Gauche #Scheme #Lisp #OnLisp
SN 2013/07/06 01:39:37
Archives > 20130705_Gauche_study_memo.html
© 2008-2013 Basic Werk