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 … をプロシージャ内にとじこめ、オブジェクト化することができる。
◆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キャラクタを返す。
◆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))
◆set-clipboard-text
│ (set-clipboard-text obj app?)
│ objをdisplayで印字した形の文字列にしてクリップボードに書き込む。
│ app?が#tならクリップボードに追加、#fならクリップボードを置換。objを返す。
◆get-clipboard-text
│ (get-clipboard-text)
│ クリップボードが読めればその内容を文字列として返す。
│ 読めなければ#fを返す。
◆リソース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)