リテラルで書けないオブジェクト?
引数に1足した数を返す関数add1を定義して、add1を評価(関数適用ではなく)してみると以下のようになる。
gosh> (define add1 (lambda (n) (+ n 1))) add1 gosh> add1 #<closure add1>
この#
式の値が内部的な「手続き」オブジェクトであることを示します。(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ページ分くらいの内容しかない!><