Software_LispMe

LispMe

※古のPalm OS上のScheme処理系

※御本家 LispMeのホームページは以下に
http://www.lispme.de/lispme/index_en.html

┌──┐
│目次│
├──┘
☆シンタックス syntax
☆データ dat
☆クロージャー、継続 cc
☆Special form spe
☆Promises prom
☆論理関数 logic
☆リスト処理関数 list
☆文字列関数 str
☆シンボル関連関数 sym
☆ベクタ処理関数 vec
☆算術関数 math
◎三角関数 sin
◎双曲線関数 hyp
◎ビット演算 bit
☆入出力 io
◎組み込みGUI dialog
☆グラフィクス gra
☆その他のAPI api
☆GUI gui
◎イベント event
☆ライブラリ lib
◎Standard Library std
◎Utility library util
◎Graphic utilities glib
│☆ローカル・ライブラリ


☆シンタックス

◆コメント
│ ;で始まり、行末まで

◆リスト
│ リストの第1要素はプロシージャもしくはスペシャルフォーム
│ そのままの形で扱いたいときは、クオートする。


☆データ

◆Boolean
│ #t: 真
│ #f: 偽
│ ⇒#f以外は真とみなされる

◆数値
│ 整数
│  #b111
│ **固定小数-8192..8191
│ ビックインテジャーは最大64KB
│ で表現できる数。
│ 実数
│  -1.5e-7
│ 複素数
│  1.3+3.5i
│ **局座標形式
│  7.2@1.8 (r∠θ)

_◇基数(数値の頭につける)
│ #b 2進数
│ #o 8進数
│ #d 10進数
│ #x 16進数

◆文字
│ #\a :’a’という文字

_◇16進コードによる記述
│ ##0a : LFキャラクタ

◆文字列
│ ”string”
│ 文字列は同じ値であったとしてもシェアされない。別なオブジェクトとなる。
│ ※\はエスケープシーケンス
│ \\ : \自身
│ \# : #
│ ※#は16進コードの文字

◆特殊なリテラル
│ #n: 表示されない値

◆リスト
│ ( )
│ ※'()は空リスト

◆ドッテドペア
│ ( . )

◆ベクタ
│ #( )
│ ※0からベクタ長-0のインデックスでアクセスされる。

◆シンボル
│ 名前
│ ※記号をシステムに与えるにはquoteする。
│ (quote obj)
│ ’obj


☆クロージャー、継続

◆apply
│ (apply procedure arglist)
│ procedureをarglistから作られたリストに適用する。

◆disasm
│ (disasm closure)
│ 引数closureのSECDコードをリストにして返す。デバッグ用。

◆eval
│ (eval expression)
│ expressionを現環境で評価して値を返す。
│ (eval ‘(cons ‘foo ‘())) => (foo)
│ (let ((a 1)) (eval ‘a)) => 1

◆call/cc
│ (call/cc procedure)
│ 現時点の継続を引数としてprocedureを呼び出す。
│ call/ccで呼び出したprocedure内で継続を呼び出さなければ、
│ ⇒そのprocedureを評価した結果がそのままcall/ccの結果となる。
│ 引数として与えた継続を呼び出せば、procedureの実行は直ちに終了
│ ⇒継続への引数をcall/ccの値として継続を実行する。
例)
│ (+ (* 1 2) (call/cc (lambda (c) (* 3 4))))=> 14
│ ※cに継続(+ 2 call/ccの結果)が渡されているが、cは呼ばれない
│ ⇒(* 3 4)の結果である12が返って+2される。
│ (+ (* 1 2) (call/cc (lambda (c) (* 3 (c 4)))))=> 6
│ ※cが引数4とともに呼ばれている
│ ⇒(* 3 は実行されず、(+ 2 4)が実行される。

◎クロージャ
│ プロシージャを,

(define プロシージャ名
  (let ((変数1 初期値1) ...)
    (lambda (仮引数1 ...)
      ボディ)))

│ と定義
│ ⇒上記の変数1 … をプロシージャ内にとじこめ、オブジェクト化することができる。


☆Special form

◆and
│ (and expr1 …)
│ 式を左から右へ評価する。
│ 式が偽であれば、そこで評価を中断する。
│ 最後に評価した値を返す。

◆or
│ (or expr1 …)
│ 式を左から右へ評価する。
│ 式が真であれば、そこで評価を中断する。
│ 最後に評価した値を返す。

◆case
│ (case expr (guard expr1 expr2 …) …)
│ exprを評価し、この値がguardの中にあるかチェックする。
│ 最初にマッチしたexpr1以降を評価し、最後の値を返す。elseが使える。

    (case 5 ((1 3 4 8) 'foo)
        ((2 5 6)   'bar)
        (else      'baz))
     => bar 

◆cond
│ (cond (guard expr1 expr2 …) …)
│ 順にguardを評価
│ 最初に真となるguardがあれば、対応するexpr1以降を評価し、最後の値を返す。
│ elseが使える。

    (case 5 ((1 3 4 8) 'foo)
        ((2 5 6)   'bar)
        (else      'baz))
     => bar 

◆if
│ (if test consequent [alternative])
│ testが真であればconsequentを、偽であればalternativeを評価し、値を返す。
│ alternative無しで偽の場合は、#fを返す。
│ (if (eq? 1 2) 0 8) => 8

◆set!
│ (set! var expr)
│ exprを評価し、varの値を書き換える。
│ セットした値を返す。

◆let
│ (let ((var form) …) expr1 expr2 …)
│ まずformを順不同に評価
│ 評価結果を局所変数varに結びつける。
│ 後、exprを順に評価して、最後のexprを値として返す。
│ 注)letの局所変数のスコープはexpr1以下であり、変数の初期化はスコープに含まれない。

◆let*
│ (let* ((var form) …) expr1 expr2 …)
│ まずformを順に評価
│ 評価結果を局所変数varに結びつける。
│ 後、exprを順に評価して、最後のexprを値として返す。
│ 注)let*の局所変数のスコープは該当の変数初期化以降であり、
│ 後続の変数初期化で、先行する変数を参照可能である。

◆letrec
│ (letrec ((var form) …) expr1 expr2 …)
│ まず局所においてvarを定義
│ 通常lambda式であるformを評価してこれをvarに結びつける。
│ これによりvarは再帰定義可能な局所関数となる。
│ 後、exprを順に評価して、最後のexprを値として返す。

◆lambda
│ (lambda formals expr..)
│ formalsは変数もしくは変数のリスト。
│ exprは呼びされたときに実行されるプロシージャ。
│ 定義されたプロシージャを返す。
※formals
①n個の仮引数
│ n個の実引数をとる
②n個の仮引数.n+1個目の仮引数
│ n個の実引数は必須。n+1個目以降の実引数はn+1個目の仮引数にリストとして渡される。
③.1個の仮引数
│ 全ての実引数が1個の仮引数にリストとして渡される。

◆define
│ (define var expr)
│ (define (var formals) expr1 expr2 …)
│ 値もしくは、プロシージャを変数に束縛する。
│ プロシージャ内でのローカルな定義(スコープはプロシージャ内全体となる)にも使用できる
│ ⇒通常はスコープを明確にするため、letrecなどを用いる。
※以下の2つは同じ
│ (define (var par1 …) …)
│ (define var (lambda (par1 …) …))

◆macro
│ (macro (var arg) expr1 expr2 …)
│ varが新たなスペシャルフォーム名となる
│ argをバインドしてexpr以下を展開する。
※テンプレートはバッククォート(`)、コンマ(,)、コンマ/アト(,@) からなる。
│ バッククォートはクォートと同じように内部の式を評価しない
│ ⇒ただし、コンマ(,)、コンマ/アト(,@)のついている式は評価する。

※quasiquote展開を利用する
│ (quasiquote template)
│ `template
│ 通常はtemplateは評価されずに渡されるが、template内で「,」「,@」が使われた場合、
│ 「,式」 式は評価されその結果に置換される
│ 「,@式」 式は評価されたうえ、スプライシング「()」をひとつ外して置換される。


☆Promises
│ promiseは結果が必要とされるまでは評価が行なわれないような式
│ promiseの結果は二度以上要求されることがあるかもしれないが、式は一度しか評価されない。

◆delay
│ (delay expr)
│ ※delay実行時のレキシカル環境とともにexprを記憶する。

◆force
│ (force prom)
│ ※promを一度評価した後は、キャッシュした値を読み出す。
例)
│ (delay 5) => [prom]
│ (force (delay 5)) => 5
例)
│ (define a-promise (let loop ((x 0)) (delay (cons x (loop (+ x 1))))))
│ (force a-promise) => (0 . #<promise…>)


☆論理関数

◆<, <=, >, >= 大小比較
│ (< comp1 comp2)
│ (<= comp1 comp2)
│ (> comp1 comp2)
│ (>= comp1 comp2)
※数値、文字列、文字を比較
│ (< “ab” “abc”) => #t
│ (>= 3 3.0) => #t
│ (<= #\a #\A) => #f

◆boolean?
│ (boolean? obj)
│ objが#tか#fなら#tを返し、
│ objがブール値以外であれば#fを返す。

◆eq?
│ (eq? obj1 obj2)
│ シンボル、整数、文字が同じであれば#tを、
│ それ以外で#fを返す。

◆eqv?
│ (eqv? obj1 obj2)
│ eq?に加えて数値が等価であれば#tを、
│ それ以外で#fを返す。

◆equal?
│ (eqvual? obj1 obj2)
│ eqv?に加えて、リスト、ベクタ、文字列の値が等しければ#tを、
│ それ以外で#fを返す。

◆string=?
│ (string=? string1 string2)
│ 文字列の値が等しければ#tを、
│ それ以外では#fを返す

◆string?
│ (string? obj)
│ objがストrングであれば#tを、
│ それ以外では#fを返す

◆=
│ (= obj1 obj2)
│ 数値を比較する。
│ eqv?と等価。

◆not
│ (not obj)
│ objを論理反転したものを返す。
│ '()は#fでないので、#fが返る。

◆null?
│ (null? obj)
│ objが'()であれば#t,他は#fを返す。

◆symbol?
│ (symbol? obj)
│ objがシンボルであれば#t,他は#fを返す。

◆pair?
│ (pair? obj)
│ objがconsセルであれば#tを、他の場合は#fを返す。

◆number?
│ (number? obj)
│ 整数、実数、複素数であれば#t、それ以外で#fを返す。

◆complex?
│ (complex? obj)
│ objが整数、実数、複素数であれば#tを、
│ それ以外であれば#fを返す。

◆real?
│ (real? obj)
│ objが整数か実数であれば#tを、
│ それ以外であれば#fを返す。

◆integer?
│ (integer? obj)
│ objが整数であれば#tを、
│ それ以外であれば#fを返す。

◆even?
│ (even? int)
│ 引数として整数をとる。
│ 他の場合はエラー。
│ 偶数であれば#tを、そうでなければ#fを返す。

◆odd?
│ (odd? int)
│ 引数として整数をとる。
│ 他の場合はエラー。
│ 奇数であれば#tを、そうでなければ#fを返す。

◆exact?
│ (exact? num)
│ Exactnessはサポートされない。
│ 整数のときに#tを、他の場合#fを返す。

◆inexact?
│ (inexact? num)
│ Exactnessはサポートされない。
│ 実数、複素数のときに#tを、整数の場合#fを返す。

◆negative?
│ (negative? num)
│ 負の数であれば#t、それ以外で#fを返す。

◆positive?
│ (positive? num)
│ 正の数であれば#t、それ以外で#fを返す。

◆zero?
│ (zero? num)
│ ゼロであれば#t、それ以外で#fを返す。

◆vector?
│ (vector? obj)
│ objがベクタであれば#t,それ以外で#fを返す。

◆procedure?
│ (procedure? obj
│ objがプロシージャのとき#tを、他の場合は#fを返す。
│ lambda式で返されるクロージャ、call/ccで生成される継続もプロシージャに含まれる。

◆continuation?
│ (continuation? obj)
│ 継続のとき#t、それ以外では#fを返す。

◆promise?
│ (promise? obj)
│ promiseのとき#t、それ以外では#fを返す。


☆リスト処理関数

◆'()
│ '()
│ 空リスト。定数。<LispMeにnilは無い。>

◆append
│ (append list…)
│ リストを結合したリストを返す。
│ 最後のリストはコピーされずシェアされる。
│ ⇒空リストにappendすればリストのコピーが作れる。

(append ‘(a b) ‘(c d)) => (a b c d)
(append ‘(x y z) ‘() ‘(1 2 (5)) ‘(“foo”)) => (x y z 1 2 (5) “foo”)
(append ‘(x y z) ‘()) => (x y z) (use this idiom to copy a list)
(append) => ()

◆assoc awwq assv
│ (assoc obj alist)
│ (assq obj alist)
│ (assv obj alist)
│ 各要素がペアであるような連想リストからcarがobjとマッチする最初の要素を取り出す。
│ マッチしないと#fを返す。assocはequal?,assqはeq?,assvはeqv?でキーを比較する。
(assoc ‘b ‘((a 1) (b 2))) => (b 2)

◆c..r
│ (c..r pair)
│ 12までのcar,cdrネストを処理。
(caar ‘((a b) c)) => a
(caddddddr ‘(a b c d e f g)) => g
(cddar ‘((a b c) (d e f)) => (c)

◆car
│ (car pair)
│ ペアのcar要素を返す。

◆cdr
│ (cdr pair)
│ ペアのcdr要素を返す。

◆cons
│ (cons obj1 obj2)
│ obj1をcar obj2をcdrとする新たなペア作って返す。
(cons ‘a ‘b) => (a . b)
(cons 1 ‘()) => (1)
(cons ‘(a) ‘(b)) => ((a) b)

◆length
│ (length list)
│ listの要素数を返す。
(length ‘(a b c)) => 3
(length ‘((a b c))) => 1
(length ‘()) => 0

◆list
│ (list obj1 obj2…)
│ 引数のobjxを集めたリストを作って返す。
(list ‘a -3 “hello”) => (a -3 “hello”)
(list ‘()) => (())
(list) => ()

◆list-ref
│ (list-ref list index)
│ listのindex番目の要素を返す。
│ 最初の要素のインデックスが0。

◆map
│ (map proc list)
│ listの各要素に対して1引数の関数procを適用したリストを返す。
(map (lambda (x) (* x x)) ‘(2 3 4 5)) => (4 9 16 25)

◆member memq memv
│ (member obj list)
│ (memq obj list)
│ (memv obj list)
│ listのサブリストの中でcarがobjと一致するものを返す。
│ 一致するものがなければ#fを返す。
│ memberはequal?で比較、memqはeq?、memvはeqv?で比較。
(member ‘b ‘(a b c d)) => (b c d)
(member ‘c ‘(a b)) => #f
(memq ‘(b) ‘(a (b) c)) => #f
(member ‘(b) ‘(a (b) c)) => ((b) c)

◆reverse
│ (reverse list)
│ listの要素の順を逆にした新たなリストを作って返す。

◆set-car!
│ (set-car! pair obj)
│ pairのcar部をobjで置換する。置換したペアを返す。
(let ((a ‘(a b c))) (set-car! a 3) a) => (3 b c)

◆set-cdr!
│ (set-cdr! pair obj)
│ pairのcdr部をobjで置換する。置換したペアを返す。
(let ((a ‘(a b c))) (set-cdr! a 3) a) => (a . 3)


☆文字列関数

◆substring
│ (substring string start end)
│ 部分文字列を返す。
│ 文字インデックスは先頭0、endはlength-1となる。
│ startより小さいendを指定すると””を返す。
│ startが文字列内でendが文字列の末尾をこえた場合は存在する部分のみ返される
│ startが末尾を越えるとエラーとなる。

◆string-set!
│ (string-set! string index char)
│ stringのindex文字目(先頭0)の一文字をcharでリプレースする。
│ リプレースした文字列を返す。

◆string-ref
│ (string-ref string index)
│ stringのindex文字目(先頭0)の一文字を返す。

◆string-lower
│ (string-lower string)
│ stringを小文字にしたものを返す。

◆string-length
│ (string-length string)
│ stringの文字数を返す。

◆string-append
│ (string-append string1…)
│ string1…を結合した文字列を返す。

◆string->object
│ (string->object string)
│ stringをオブジェクトに変換する。
例)
(string->object “Foobar”) => foobar
(string->object “\”Foobar\””) => “Foobar”
(string->object “(a (b) c)”) => (a (b) c)
(string->object “1E3”) => 1000

◆string->list
│ (string->list string)
│ stringの各文字からなるリストを返す。

◆list->string
│ (list->string charlist)
│ 文字からなるリストをつなげてストリングを返す。
例)
(list->string ‘(#\F #\r #\e #\d)) => “Fred”
(list->string ‘(a b c)) => error
(list->string ‘()) => “”

◆object->string
│ (object->string obj)
│ Objをwriteで印字する形式でストリングにして返す。

◆make-string
│ (make-string len char)
│ lenの長さだけcharを続けたストリングを返す。


☆シンボル関連関数

◆gensym
│ (gensym)
│ 新たなシンボルを返す。


☆ベクタ処理関数

◆vector
│ (vector obj…)
│ 引数を集めたベクタを返す。
(vector ‘a -3 “hello”) => #(a -3 “hello”)
(vector ‘()) => #(())
(vector) => #()

◆make-vector
│ (make-vector len fill)
│ fillをlen回繰り返したベクタを返す。

◆list->vector
│ (list-vector list)
│ 引数リストの各要素を並べたベクタを返す。

◆vector->list
│ (vector->list vec)
│ ベクタの各要素を並べたリストを返す。

◆vector-length
│ (vector-length vec)
│ ベクタの要素数を返す。

◆vector-ref
│ (vector-ref vec index)
│ ベクタの指定インデックスの要素を返す。

◆vector-set!
│ (vector-set! vec index obj)
│ ベクタの指定インデックスの要素をobjで書き換え、返す。


☆算術関数

◆*
│ (* numi …)
│ 引数のすべてを乗じたものを返す。
│ 数値以外はエラーとなる。

◆+
│ (+ numi …)
│ 引数のすべてを加えたものを返す。
│ 数値以外はエラーとなる。

◆-
│ (- num1 [num2])
│ num1 – num2を返す。
│ num2省略された場合は、num1の符号反転する。
│ 数値以外はエラーとなる。

◆/
│ (/ num1 [num2])
│ num1をnum2で割った商を返す。
│ num2省略された場合は、num2の逆数を返す。
│ 0による除算はエラーとなる。

◆remainder
│ (remainder int1 int2)
│ 整数を割った余りを返す
│ 割られる数int1の符号となる。

◆quotient
│ (quotient int1 int2)
│ 整数を割った商を返す。

◆round
│ (round num)
│ もっとも近い整数に丸める。
│ 戻り値は浮動小数のまま。

◆ceiling
│ (ceiling num)
│ 等しいかもっとも近い大きな整数に丸める。
│ 戻り値は浮動小数のまま。

◆truncate
│ (truncate num)
│ 小数点以下を切り捨てる。
│ 戻り値は浮動小数のまま。

◆floor
│ (floor num)
│ 等しいかもっとも近い小さな整数に丸める。
│ 戻り値は浮動小数のまま。

◆angle
│ (angle z)
│ 複素数zの複素平面上の「角度」を求める。

◆conjugate
│ (conjugate z)
│ zの共役複素数を返す。

◆exp
│ (exp z)
│ eのz乗を返す。

◆expt
│ (expt z1 z2)
│ z1のz2乗を返す。

◆imag-part
│ (imag-part z)
│ 複素数の虚数部を返す。

◆real-part
│ (real-part z)
│ 複素数の実数部を返す。

◆integer
│ (integer num)
│ 浮動小数を整数に変換する。
│ 小数部は切り捨てられる。
│ 浮動小数は仮数部53ビット精度
│ ⇒大きなケタの数では正確な整数には変換されない。

◆log
│ (log z)
│ 自然対数を返す。

◆log10
│ (log10 z)
│ 常用対数を返す。

◆magnitude
│ (magnitude z)
│ 複素数の絶対値を返す。

◆make-polar
│ (make-polar mag ang)
│ 絶対値と偏角から複素数を組み立てて返す。

◆make-rectangular
│ (make-rectangular re im)
│ 実数部reと虚数部imから複素数woを組み立てて返す。

◆random
│ (random int)
│ 0からintの絶対値-1の間の乱数を発生する。
│ intは0以外のスモール整数。

◆sqrt
│ (sqrt z)
│ 平方根を返す。


◎三角関数
│ 一般角:x軸を始線として+は反時計方向に動経をとる。
│ 180度=πラジアン。1ラジアンは約57°14′44″
定義:一般角θの始線をx軸の正の方向にとり、原点中心に半径1の円を書く。
│ 動経がこの円と交わる点をP(x y)とすると、Pはθが何でも1点に定まる。

sinθ = y 正弦
cosθ = x 余弦
tanθ = y/x 正接**
cotθ = x/y 余接*
secθ = 1/x 正割**
cosecθ = 1/y 余割*
*nπを除く
**nπ+π/2を除く

※逆三角関数
arc sin
arc cos
arc tan
│ sin の値がyとなるような角は何度かという対応を示す。
│ 対応が一意に定まるように値域を制限する。
│ sin-1(-1は上付き)のようにも記述する。

◆sin
│ (sin z)
│ zはラジアン。サインを返す。
│ 複素数の場合sin z = sinx coshy + i cosx sinhy 。

◆cos
│ (cos z)
│ zはラジアン。コサインを返す。
│ 複素数の場合cos z = cosx coshy – i sinx sinhy 。

◆tan
│ (tan z)
│ zはラジアン。タンジェントを返す。
│ 複素数の場合tan z = sin 2x / (cos 2x + cosh 2y) + i sinh 2x / (cos 2x + cosh 2y) 。

◆asin
│ (asin z)
│ zはラジアン。アークサインを返す。
│ 複素数の場合asin z = -i ln(iz + sqrt(1-z2)) 。

◆acos
│ (acos z)
│ zはラジアン。アークコサインを返す。
│ 複素数の場合acos z = -i ln(z + i sqrt(1-z2)) 。

◆atan
│ (atan z)
│ (atan y x)
│ zはラジアン。アークタンジェントを返す。
│ 複素数の場合atan z = 0.5i ln((i + z) / (i – z)) 。
│ 第2形式の場合、タンジェントがy/xであるような角を返す。


◎双曲線関数
│ sinh x = (e^x – e^-x) / 2
│ cosh x = (e^x + e^-x) / 2

以下
│ tanh x = sinh x /cosh x
│ coth x = 1 / tanh x
│ sech x = 1 / cosh x
│ cosech x = 1 / sinh x
のように定義される。

※cosh x は、懸垂線(カテナリ)である。

逆関数は、
│ arc sinh x = log(x+sqrt(x^2+1))
│ arc cosh x = log(x+sqrt(x^2-1))

◆sinh
│ (sinh z)
│ zはどんな数でもよい。
│ ハイパボリックサインを返す。
│ 複素数の場合sinh z = sinhx cosy + i coshx siny .

◆cosh
│ (cosh z)
│ zはどんな数でもよい。
│ ハイパボリックコサインを返す。
│ 複素数の場合cosh z =cosh x cos y+i sinh x sin y

◆tanh
│ (tanh z)
│ zはどんな数でもよい。
│ ハイパボリックタンジェントを返す。
│ 複素数の場合tanh z = sinh 2x / (cosh 2x + cos 2y) + i sin 2x / (cosh 2x + cos 2y)

◆acosh
│ (acosh z)
│ zはどんな数でもよい。
│ ハイパボリックアークコサインを返す。
│ 複素数の場合acosh z = ln(z + i sqrt(1-z^2))

◆asinh
│ (asinh z)
│ zはどんな数でもよい。
│ ハイパボリックアークサインを返す。
│ 複素数の場合asinh z = -ln(sqrt(1-z^2)-z) 。

◆atanh
│ (atanh z)
│ zはどんな数でもよい(z=-1の場合、-infとなる)。
│ ハイパボリックアークタンジェントを返す。
│ 複素数の場合atanh z = 0.5ln((1+z)/(1-z))


◎ビット演算

◆bit-and
│ (bit-and n…)
│ 引数を2の補数表現のバイナリ整数として各ビット毎にANDをとり、その結果を返す。

◆bit-not
│ (bit-not n)
│ 引数を2の補数表現のバイナリ整数として各ビット毎に反転し、その結果を返す。

◆bit-or
│ (bit-or n…)
│ 引数を2の補数表現のバイナリ整数として各ビット毎にORをとり、その結果を返す。

◆bit-shift
│ (bit-shift n k)
│ 2の補数表現の整数nをkビットシフトした数を返す。
│ kが+なら左シフト、-なら右シフト。
│ 右シフトの場合、最上位のサインビットが左から入ってくる。
│ 左シフトの場合、最下位にはゼロが入る。

◆bit-xor
│ (bit-xor n)
│ 引数を2の歩数表現のバイナリ整数として各ビット毎にXORをとり、その結果を返す。


☆入出力

◆dir
│ (dir “foo”)
│ カテゴリを引数として与える
│ ⇒そのカテゴリの「メモ」のタイトルのリストを返す。
│ タイトルは16文字に制限される。

◆open-input-file
│ (open-input-file “foo” [0])
│ タイトルを引数として与えると、入力モードでDBを開き、入力ポートを返す。
│ 第2引数はオプショナルであり、0が標準Memo、1が32Kの拡張Memo、2がDOC。

◆open-append-file
│ (open-append-file “foo”)
│ タイトルを引数として与えると、アペンドモードでDBを開き、入力ポートを返す。

◆open-output-file
│ (open-output-file “foo” [0])
│ タイトルを引数として与えると、出力モードでDBを開き、出力ポートを返す。
│ 第2引数はオプショナルであり、0が標準Memo、1が32Kの拡張Memo、2がDOC。

◆input-port?
│ (input-port? obj)
│ 引数がオープンされた入力ポートなら#t、他の場合は#fを返す。

◆output-port?
│ (output-port? obj)
│ 引数がオープンされた出力ポートなら#t、他の場合は#fを返す。

◆eof-object?
│ (eof-object? obj)
│ ポートがEOFなら#tを返す。他の場合は#fを返す。

◆read
│ (read inport)
│ ポートからオブジェクトをひとつ読み込み標準パーサで処理する。

◆read-char
│ (read-char inport)
│ ポートから1文字読み込む。

◆read-line
│ (read-line inport)
│ ポートから1行読み込みストリングを返す。

◆peek-char
│ (peek-char inport)
│ ポートから次の1文字を覗くが、ポインタは進めない。

◆delete-file
│ (delete-file “foo”)
│ タイトルを引数として与えると、そのMemoを削除する。#nを返す。

◆display
│ (display obj [outport])
│ outportを省略するとobjを出力エリアに書きこむ。
│ outportを指定するとポートに出力する。objを返す。

◆write
│ (write obj [outport])
│ outportを省略するとobjをマシンリーダブル形式で出力エリアに書きこむ。
│ outportを指定するとポートに出力する。
│ objの後にスペースを出力する。objを返す。

◆newline
│ (newline [outport])
│ outportを省略すると出力エリアに改行を書きこむ。
│ outportを指定するとポートに出力する。LFキャラクタを返す。


◎組み込みGUI

◆input-string
│ (input-string “prompt”)
│ プロンプトを持つダイアログボックスを出し、ストリングを受け取る。

◆message
│ (message “string”)
│ 文字列を表示するメッセージボックスを出す。


☆グラフィクス
│ ※スクリーンは(0,0)-(160,160)。左上が(0,0)。

◆*gstate*
│ 7要素のリスト
1) current point
│ 0..160の整数のペア. グラフィクスカーソル位置を示す。carがx、cdrがy.
2) current font
│ 0..Standard font
│ 1..Bold font
│ 2..Large font
│ 3..Symbol font
│ 4..Symbol11 font
│ 5..Symbol7 font
│ 6..LED font
│ 7..Large Bold font
3) drawing pattern
│ #t 通常フォア、バック
│ #f フォア、バック反転
│ #n インバート(XOR)
│ 8×8 fill pattern 8byte string
4) drawing mode
│ 0..dm-paint; copy
│ 1..dm-erase; AND
│ 2..dm-mask; AND NOT
│ 3..dm-invert; XOR
│ 4..dm-overlay; OR
│ 5..dm-paint-inverse; NOT
│ 6..dm-swap; 色反転
5) foreground color index
│ 0..255
6) background color index
│ 0..255
7) text color index
│ 0..255

◆rgb->index
│ (rgb->index r g b)
│ r,g,bそれぞれ0..255。rgbの指定にもっとも近いカラーパレットインデックスを返す。

◆index->rgb
│ (index-rgb col)
│ カラーパレットインデックスcolのRGBの値をリストにして返す。

◆set-palette
│ (set-palette index r g b)
│ カラーパレットインデックスindexにrgbを設定する。
│ index,r,g,bとも0..255。
│ ただし、ユーザ定義してよいのは231..254のみ。

◆move
│ (move x y)
│ グラフィクスカーソルをx,yに移動する。#nを返す。

◆draw
│ (draw x y)
│ 現在のグラフィクスカーソルからx,yまで*gstate*の設定に従って線を引いた後、
│ グラフィクスカーソルを更新する。#nを返す。

◆rect
│ (rect x y radius)
│ 現在のグラフィクスカーソルからx,yまで*gstate*の設定に従って
│ フィルされたレクタングルを描画する。
│ radius値で指定されただけコーナーを丸める。#nを返す。

◆text
│ (text obj)
│ 現在のグラフィクスカーソルにグラフィクスとしてテキストを書き込む。
│ カーソルは移動しない。#nを返す。

◆bitmap
│ (bitmap bmap)
│ 現在のグラフィクスカーソルにビットマップを書き込む。
│ カーソルは移動しない。#nを返す。
(bitmap (read-resource “Tbmp” 11000))


☆その他のAPI

◆set-clipboard-text
│ (set-clipboard-text obj app?)
│ objをdisplayで印字した形の文字列にしてクリップボードに書き込む。
│ app?が#tならクリップボードに追加、#fならクリップボードを置換。objを返す。

◆get-clipboard-text
│ (get-clipboard-text)
│ クリップボードが読めればその内容を文字列として返す。
│ 読めなければ#fを返す。


☆GUI

◆リソースDBのオープンと最初のフォームの表示
例)

(define (go)
  (set! *resdb*
    (dm-open-db "GUImassa" 1))
  (frm-popup 6200 h1)))

◆*resdb*
│ カレントリソースデータベースを保持する変数。

◆dm-open-db
│ (dm-open-db dbname mode)
│ dbnameにケースセンシティブなPalmOSのdb名を与えdbを開く。modeは
│ 1 Read Only
│ 2 Write Only
│ 3 Read/Write

◆frm-popup
│ (frm-popup [timeout] id handler)
│ idなるID番号を持つフォームを表示する。
│ このフォームのイベントハンドラとしてhandlerを使う。
│ timeoutを指定するとtimeout時間後に何もしなくてもtimeoutイベントが発生する。

◆GUIひな型

(define (h1 event . args)
  (case event
    ((ctl-select)
      (case (car args)
        ((6251)(fld-set-text 6220 "S" ))
        ((6252)(fld-set-text 6225 456))
        ((6253)(frm-alert 6110)(frm-return 'd1))
        (else #f)))
    ((menu)
      (case (car args)
        ((6271)
            (set-clipboard-text (fld-get-text 6290) #f))
        ((6272)
          (frm-return 'd1))))
    ((lst-select)
       (fld-set-text 6290 (lst-get-text 6210 (cadr args))))
    (else #f)))


◎イベント

◆timeout
│ (timeout)
│ timeoutを指定した場合に、指定時間内に何も操作しないと発生するイベント


☆ライブラリ


◎Standard Library
│ LispMe標準
│ LispMeが備えていないScheme標準関数を補完するもの

◆abs
│ (abs num)
│ 絶対値を返す。

◆modulo
│ (modulo int1 int2)
│ 整数を割った余りを返すが、割る数int2の符号となる。

◆zero
│ (zero? num)
│ ゼロなら#t,他は#fを返す。

◆positive?
│ (positive? num)
│ 正数なら#t,他は#fを返す。

◆negative?
│ (negative? num)
│ 負数なら#t,他は#fを返す。

◆port
│ (port? obj)
│ ポートであれば#t、他は#fを返す。

◆min
│ (min comp1 comp2…)
│ オブジェクトの中で最小のものを返す。

◆max
│ (max comp1 comp2…)
│ オブジェクトの中で最大のものを返す。

◆map
│ (map proc list)
│ procをlistの各要素に適用したリストを返す。

◆for-each
│ (for-each proc list)
│ procをlistの各要素に左から右へ適用するが、procの戻り値は無視する。


◎Utility library
│ LispMe拡張の非標準ユーティリティ関数

◆filter

◆range

◆nan?

◆inf?

◆do-range


◎Graphic utilities
│ LispMe拡張の非標準グラフィクス関数
│ (set-font font)
│ (set-pattern pat)
│ (set-mode mode)
│ (set-fg c)
│ (set-bg c)
│ (set-text c)
│ (cls)