昨晩の続き
とりあえず、read_internal() 手続きをもう少し確認。基本的に標準入力が読み込む形にしておいて読み込んだ情報を ScmObj にしてくれる模様。
- 読み込みは基本的に skipws() 手続きを使ってコメントとか空白文字を skip している
- 読み込んだ文字が
- '(' ならリストの始まり
- read_list() の戻りを return
- '"' なら文字列の始まり
- read_string() も戻りを return
- '#' なら_様々な用途_な値の表現なのでもう一文字読み込んで処理
- 詳細は略しますが、初等な実装という意味ではスルーな方針?
- '\'' なら quote の始まり
- read_quoted() の戻りを return
- '`' も quote の始まり
- ':'
- ','
- '|'
- '['
- '{'
- '+' とか '-'
- '.'
- '0' から '9'
- ')' とか ']' とか '}'
- EOF
- 上記以外
- read_symbol() の戻りを return
- '(' ならリストの始まり
例えばリストの始まりだった場合、read_list_int() を使って云々。read() はそのままパクれない気がしてるのでデグレード版 (って言い方悪いスね) を自分で書く必要ありそげ。
とは言え、この読み込みのあたり、gauche を使う身として何と言えば良いか感謝をもって見ざるを得ない、と言いますか。
今の課題
例えば以下な例で言えば
(test (op self-evaluating?) (reg exp))
self-evaluating? の定義は以下で
(define (self-evaluating? exp) (cond ((number? exp) #t) ((string? exp) #t) (else #f)))
これをどう定義するかな、って思ってたんですが number? とか string? とかの primitive な手続きが定義できてるのであれば C で書けるのか、という事に今更思い至っていたりしています。
ただ、上記のような簡単な手続きはまだ良いのですが、例えば lookup-variable-value のような手続きだと、どうしたものやら、というのが現状の課題ッス。