Basic Werk | Blog | Contact


MEMOMEM

CommonLisp_defmacro_test_01



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





CommonLisp_CL-PPCRE_01



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





20130719_gauche_dbd_sqlite3_install_error_memo




$ /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





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





20130705_Gauche_study_memo



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