リテラルで書けないオブジェクト?

引数に1足した数を返す関数add1を定義して、add1を評価(関数適用ではなく)してみると以下のようになる。

gosh> (define add1 (lambda (n) (+ n 1)))
add1
gosh> add1
#<closure add1>

この#っていうのは、61ページによると、

式の値が内部的な「手続き」オブジェクトであることを示します。(Gaucheでは#<...>はリテラルで書けないオブジェクトの表記です。この表記で出力されたものは読み戻せません。

だそうだ。
「オブジェクト」って言葉の定義ってどこかあったけな。
まぁ、いいや。普段使ってるC#での「オブジェクト」と同じ意味として理解する。
あと、「読み戻せない」ってのは、19ページの最後らへんにあった「外部表現」とか「読み書き不変性」とかいう話題やね。


...ってことで、本当に読み戻せないのかやってみた。

gosh> (#<closure add1> 5)
gosh> *** READ-ERROR: Read error at "(stdin)":line 5: unsupported #-syntax: #<
Stack Trace:
_______________________________________
gosh> *** ERROR: unbound variable: closure
Stack Trace:
_______________________________________
gosh> *** ERROR: unbound variable: add1>
Stack Trace:
_______________________________________
gosh> 5
gosh> *** READ-ERROR: Read error at "(stdin)":line 5: extra close parenthesis
Stack Trace:
_______________________________________

だそうだ。なんか5だけは評価されてるし。
意味が分からないエラーもあるけど、今はどうでもいいや。

(lambda (n) (+ n 1))

そのものがadd1のリテラル表記じゃダメなのかな。
add1を評価したらlambda式がべべっと出力されるとか...


ということで、実験でした。
このエントリーで3分の1ページ分くらいの内容しかない!><