例として、以下のようなクラスを用意します。

(define-class <person> ()
  ((name :init-keyword :name)
   (age :init-keyword :age)
   (pref :init-keyword :pref)))

このようなクラスのインスタンスを作成してみます。

(define taro (make <person> :name "Taro" :age 20 :pref "Hokkaido"))

少し面倒ですね。
しかし、これをもう少しだけ簡単に書く方法が存在します。

Gaucheには読み込み時コンストラクタというものがあり、以下のような形をしています。

#,(ctor-name ...)

処理系はこのような構文が現れた場合、それを読み込み時コンストラクタであるとみなして、対応する式に置き換えます。

読み込み時コンストラクタは以下のように定義します。

(define-reader-ctor '<person>
  (^(name age pref)
    (make <person> :name name :age age :pref pref)))

#,(<person> "Taro" 20 "Hokkaido") ; => 先ほどのtaroと等しい値になる

また、write-objectに同様の書式で出力するように指定することによって、HaskellでいうShowとReadのように、データ型と文字列の相互変換を簡単に行うことができるようになります。

(define-method write-object ((person <person>) out)
  (let ((name (slot-ref person 'name))
        (age (slot-ref person 'age))
        (pref (slot-ref person 'pref)))
    (format out "#,(<person> ~s ~s ~s)" name age pref)))
(define jiro #,(<person> "Jiro" 15 "Tokyo"))
jiro ; => #,(<person> "Jiro" 15 "Tokyo")

また、読み込み時コンストラクタはクラスだけではなく、任意の値に対して定義することができます。

(define-reader-ctor 'e
  (^() 2.718281828))

(define-reader-ctor 'pi
  (^() 3.141592653))

#,(e)  ; => 2.718281828
#,(pi) ; => 3.141592653