14. 入出力
嵐(2歳)が去ったので、勉強再開。
高レベルなやつ(S式を読む。lexer込み)と低レベルなやつ(単なるIO)がある。
入力
- read
- S式を読む。
- read-line, read-char, read-byte
- 行や文字を読む。
read-*系をgoshの対話環境からやろうとするとコマンド入力バッファのnewlineが残ったままになるみたいで(詳細まだ見てない)、上手くテストできない。てなわけで一文字読み飛ばす。
gosh> (begin (read-char) (read-char)) j #\j
更に悪のり。
gosh> (letrec ((reader (lambda (lst) (cond [(read-char) (negative eof-object?) => (lambda (x) (reader (cons x lst)))] [else lst])))) (reader '())) abcdefg (#\newline #\g #\f #\e #\d #\c #\b #\a #\newline)
ふむふむ。これ弄ってて気がついた。cutって一段しか通用しないのね。マクロの制約かな。これも詳細調査しよう。
gosh> ((cut (not (equal? 0 <>))) 0) *** ERROR: Compile Error: wrong number of arguments: #f requires 0, but got 1 "(stdin)":254:((cut (not (equal? 0 <>))) 0) Stack Trace: _______________________________________
基礎がわかっていないのでOバカな事を考えてるのかもしれない。
出力
外部表現で出す(シリアライズ)のとhuman readableなの。
- write
- 外部表現で出す。#0=(hoge . #0#)みたいな循環参照を表示しようとすると大変な事に。
- write/ss
- with shared structure。共有構造対応版。循環参照でもおk。
gosh> (write (read-from-string "#0=('hoge . #0#)")) ('hoge 'hoge 'hoge 'hoge 'hoge 'hoge 'hoge 'hoge 'hoge 'hoge 'hoge 'hoge ...........大変な事に gosh> (write/ss (read-from-string "#0=('hoge . #0#)")) #0=('hoge . #0#)0
- display, print, format
- human readableなやつ。
formatの書式指定子
後で調べる
ポート
ファイルポートと文字列ポート(ネットワークもあるのかな)。