新たな変数名の作成

id:yagiey:20100305:1267761841にトラバもらった。id:trotr:20100308:1268043643
引数を加工することが必要っぽいので、objectを書き直してみた。
今度はちゃんとget-○○○って名前にした。

(define-macro (object args . methods)
  `(lambda ,args
     (lambda (mname . margs)
       ,(cons 'case
          (cons 'mname
            (append
             (map
              (lambda (e)
                `((,(string->symbol
                      (string-append
                        "get-"
                        (symbol->string e)))) ,e))
              args)
             (map
              (lambda (e)
                `((,(car e))
                  (apply
                   (lambda ,(cadr e) ,(caddr e))
                   margs)))
              methods)))))))

使ってみると

gosh> 
(define make-acc
  (object (owner balance)
    (show () (begin (print owner "'s balance: " balance) #t))
    (deposit (amount) (begin (inc! balance amount) balance))
    (withdraw (amount) (begin (dec! balance amount) amount))))
make-acc
gosh> (define acc (make-acc "yagiey" 42000))
acc
gosh> (acc 'get-owner)
"yagiey"
gosh> (acc 'get-balance)
42000
gosh> (acc 'show)
yagiey's balance: 42000
#t
gosh> (acc 'deposit 500)
42500
gosh> (acc 'withdraw 1500)
1500
gosh> (acc 'show)
yagiey's balance: 41000
#t

いいかんじ?
メソッドの定義のところで、使う側にbeginを要求するのはダメか。
あと、文字列の連結はstring-joinじゃなくてstring-appendだったのか...。