Have unlimited dreams. I hava a scheme.

concatenate line

レコードを得る

2003/02/28

LispMe(Palm)で空行行区切のレコードを扱う。 単語確認の出題をランダムにする計画。

レコードを得る

一度すべてを(変数に)読みこみ。

lispmeでしか動かない。

(define (get-rec)
   (define (get-rec-in n)
      (let ((rec (dm-read-rec (dm-open-db "MemoDB" 0) n)))
	 (if (string=? (substring rec 0 9) "vocrandom")
	    rec
	    (get-rec-in (+ n 1)))))
   (get-rec-in 0))

メモ帳のデータベースを読み、タイトルが、vocrandomで始まっているメモを探して いる。open-input-fileでは、タイトルを指定して読み込む事ができるため、こちらの 方が良いかも知れない。

参考 なんでも再帰の消えるループ

この後、空行毎にインディクスを振ったリストを作成する。

レコードを得る 2

2003/03/01

open-input-fileを使う。

(define (get-rec)
   (define inport (open-input-file "vocrandom"))
   (define (get-str-in str)
      (let ((c (read-char inport)))
	 (if (eof-object? c)
	    str
	    (get-str-in (string-append str (list->string (list c)))))))
   (get-str-in ""))

string がlispmeにはない。(list->string (list char))

read-lineがlispmeにもgaucheにもあるが使用していない。

(string-append str (list->string (list c)))がlispme(palm)では遅いようだ。 lispmeでは空行区切りのファイルを読まず、readでSchemeオブジェクトの外部表現 (S式?)を読み込む事にする。Schemeオブジェクトの外部表現は、gaucheで作る事にする 。

ベクタ作成

2003/03/05

ファイル名は、"random"固定。空行区切のレコードを要素に持つベクタを作成する 。リストでも良いが、リストよりメモリ使用量が少ない。

; l2v line to vector
(define dic "random")
(define (makelist inport)
   (define (makelist-in l)
      (let ((line (read-line inport)))
	 (if (eof-object? line)
	    (if (= 0 (length l))
	       #f
	       l)
	    (if (string=? line "" )
	       (if (= (length l) 0 )
		  (makelist-in l)
		  l)
	       (makelist-in (append l (list line))))
	    )))
   (makelist-in (list )))

ポートから1行毎に読み込み、空行までの各行を要素とするリストを返す。 ファイルの終了になると、#fを返す。

(define (l2v)
   (define inport (open-input-file dic))
   (define (l2v-in ll)
      (let ((l (makelist inport)))
	 (if l (l2v-in (append ll (list l)))
	    ll)))
   (let ((ll (l2v-in (list))))
      (close-input-port inport)
      (write (list->vector ll))))

makelistの各リストを連結し、最後にベクタに変換して、外部表現で出力する。

失敗:(write l)ではなく、(display l)を使用したため、外部表現にならなかった 。

失敗: (append l line)でリストではなく、文字列を作成した。(append l (list line))とした。(consとreverseの方が良いかも。)

doc作成

空行区切りのファイル(random)を作り、gaucheで処理する。処理したテキストを docファイルに変換して、palmに転送する。

$gosh -b -l ./l2v.scm -El2v -Eexit > word.txt
$txt2pdoc word.txt word.txt word.pdb
$pilot-xfer -i word.pdb

palmで読み込み

2003/03/07:ベクタのテキストを読み込む。

(define wv (read (open-input-file "word.txt" 2)))

lispme独自(open-input-file string [type]):typeにdocを指定している。

palmで出題

乱数でランダムにベクタの要素を選び、 先頭行を当てる問題(2行目以降)を表示する。 画面クリックで、答(と全リスト)を表示します。

(define (qa) 
   (let (( l (vector-ref wv (random (vector-length wv)))))
      (display (cdr l))
      (newline)
      (event 1)
      (display (car l))
      (newline)
      (write l)
      #f))

lispme独自(random int) (event wait)

wvとqaを定義した後で、(qa)を実行(eval)する。 [eval]をクリックする事により、連続して表示(出題)される。 出題/回答の表示がいま一つ。

一度の実行(eval)で連続して、表示するのは、面倒。ouput領域が足りなくなる/ 潰れる。outputを使用しない(でグラフィック使用する)と面倒。

辞書引

ベクタではなく、リストにすると、 alist("association list" = 連想リスト)として利用でき、 簡単な辞書になる。

(以前、メモを調べる辞書モドキを作成したが、遅くて使えなかった。 asscでは、実用になりそう)

(assoc "same" (vector->list wv))

無保証

motto: みんなに感謝,あなたに感謝 (next:為に生きる Rev.S.M.ムーン)

I am grateful to everyone and you.

mizotec@nifty.com
[up]