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の書式指定子

後で調べる

ポート

ファイルポートと文字列ポート(ネットワークもあるのかな)。